Как поведенческое выполнение «tf.GradientTape ()» работает для обучения агента PPO?

#python #tensorflow #reinforcement-learning

Вопрос:

Я внедряю агент PPO для непрерывной области и использую tensorflow 2.7. Когда мне нужно обучить моего актера и моего критика, а затем мои нейронные сети, обучение работает только тогда, когда команда печати запускает выполнение. Может ли кто-нибудь объяснить мне поведение в среде Tf.GradientType() и область применения для этого случая? Я понимаю, что метод рисует график выполнения для алгоритма обратного распространения. Но как мне отобразить это поведение в этом примере?

 def learn(self,train_policy_iterations=3, train_value_iterations=3):   # Get values from the buffer  states_buffer, actions_buffer, advantages_buffer, rewards_buffer, logprobabilities_buffer = self.memory.get()  print("number of states in memory = ", len(states_buffer))   # Update the policy_actor_network for a number of iterations  for _ in range(train_policy_iterations):  print("TRAINING ACTORNET ", str(int(_) 1))  old_probs = tf.squeeze(logprobabilities_buffer)  advantages_buffer = tf.convert_to_tensor(advantages_buffer, dtype="float32")  new_probs = []  for state in states_buffer:  _, new_prob = self.choose_action(state)  new_probs.append(new_prob)  new_probs = tf.convert_to_tensor(new_probs)   with tf.GradientTape(persistent=True) as tape:  tape.watch(old_probs)  tape.watch(advantages_buffer)  tape.watch(new_probs)  # compute loss  prob_ratio = tf.math.divide(tf.exp(new_probs), tf.exp(old_probs))   min_advantage = tf.cast(tf.where(  advantages_buffer gt; 0,  (1   .2) * advantages_buffer,  (1 - .2) * advantages_buffer,  ), tf.float32)   loss = -tf.reduce_mean(tf.minimum(prob_ratio * advantages_buffer, min_advantage))   grads = tape.gradient(target=loss, sources=self.actor.model.trainable_variables)  update = zip(grads, self.actor.model.trainable_variables)  #print("update len ",len(list(update)))  self.actor.optimizer.apply_gradients(update)   # Update the value_critic net for a number of iterations  for _ in range(train_value_iterations):  print("TRAINING Critic Net ", str(int(_) 1))  new_vals = []  for state in states_buffer:  new_vals.append(self.critic.model(state))  new_vals = tf.convert_to_tensor(new_vals)   with tf.GradientTape(persistent=True) as tape: # Record operations for automatic differentiation.  tape.watch(new_vals)  value_loss = tf.reduce_mean((rewards_buffer - new_vals) ** 2)   value_grads = tape.gradient(value_loss, self.critic.model.trainable_variables)  update = zip(value_grads, self.critic.model.trainable_variables)  #print("update len ", len(list(update)))  self.critic.optimizer.apply_gradients(update)   self.memory.clear_memory()  

И ошибка, которую я получил, такова

 Traceback (most recent call last): ... File mypath...Agent.py line 409, in learn self.actor.optimizer.apply_gradients(update) File .mypathPython38site-packageskerasoptimizer_v2optimizer_v2.py", line 622, in apply_gradients grads_and_vars = optimizer_utils.filter_empty_gradients(grads_and_vars) File .mypathkerasoptimizer_v2utils.py", line 72, in filter_empty_gradients raise ValueError("No gradients provided for any variable: %s." % ValueError: No gradients provided for any variable: ['dense/kernel:0', 'dense/bias:0', 'dense_4/kernel:0', 'dense_4/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0', 'dense_5/kernel:0', 'dense_5/bias:0', 'dense_2/kernel:0', 'dense_2/bias:0', 'dense_3/kernel:0', 'dense_3/bias:0', 'dense_6/kernel:0', 'dense_6/bias:0', 'dense_7/kernel:0', 'dense_7/bias:0'].  

Следовательно, когда я выполняю методы #print("update len ", len(list(update))) перед каждым optimizer.apply_gradients , алгоритм работает правильно без ошибок.