#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
, алгоритм работает правильно без ошибок.