#python #tensorflow #keras #reinforcement-learning
#python #tensorflow #keras #подкрепление-обучение
Вопрос:
Я пишу некоторый код tensorflow об обучении с подкреплением глубокого представления преемника (DSQ):
class RL_Brain():
def __init__(self, n_features, n_action, memory_size=10, batch_size=32, gamma=0.9, phi_size=15):
self.n_features = n_features
self.n_actions = n_action
self.memory_size = memory_size
self.replay_buffer = np.zeros((self.memory_size, n_features * 2 2), np.float)
self.count = 0
self.batch_size = batch_size
self.gamma = gamma
self.phi_size = phi_size
self.epsilon = 0.9 # 默认有0.1的随机度
self.model, self.mus_model = self.build_model()
self.opt = Adam()
def build_model(self):
input_state = Input(shape=(self.n_features,), name='input')
input_phi = Input(shape=(self.phi_size,), name='input_phi')
layer1 = Dense(32, 'relu', name='encode/layer1')(input_state)
layer2 = Dense(32, 'relu', name='encode/layer2')(layer1)
layer3 = Dense(10, 'relu', name='encode/layer3')(layer2)
phi = Dense(15, 'relu', name='phi')(layer3)
decoder1 = Dense(10, 'relu', name='decode/layer1')(phi)
decoder2 = Dense(32, 'relu', name='decode/layer2')(decoder1)
decoder3 = Dense(32, 'relu', name='decode/layer3')(decoder2)
s_hat = Dense(self.n_features, name='output_s_hat')(decoder3)
stop_grad_phi = tf.stop_gradient(phi)
R = Dense(1, name='R', use_bias=False)(stop_grad_phi)
mus = []
for i in range(self.n_actions):
mu = Dense(10, 'relu', name='mu/m%s/layer1' % i)(input_phi)
mu = Dense(10, 'relu', name='mu/m%s/layer2' % i)(mu)
mu = Dense(15, 'relu', name='mu/m%s/layer3' % i)(mu)
m = Model(inputs=input_phi, outputs=mu)
mus.append(m)
outputs = [phi, R, s_hat]
model = Model(inputs=input_state, outputs=outputs)
return model, mus
def learn(self):
# choices = np.random.choice(self.count if self.count < self.memory_size else self.memory_size, self.batch_size, replace=True)
states = np.expand_dims(self.replay_buffer[(self.count-1) % self.memory_size, :self.n_features], 0)
states_ = np.expand_dims(self.replay_buffer[(self.count-1) % self.memory_size, -self.n_features:], 0)
r = np.expand_dims(self.replay_buffer[(self.count-1) % self.memory_size, self.n_features 1], 0)
a = self.replay_buffer[(self.count-1) % self.memory_size, self.n_features]
o_phi_t, o_r, o_s_hat = self.model(states) # 模型输出的phi, reward, s_hat
print(o_r)
# Training auto-encoder loss and reward loss.
with tf.GradientTape() as tape:
loss1 = tf.keras.losses.mean_squared_error(states, self.model(states)[2])
loss2 = tf.keras.losses.mean_squared_error(r, self.model(states)[1])
loss = loss1 loss2
-----> self.opt.minimize(loss, self.model.trainable_variables, tape=tape)
o_phi_t_, _, __ = self.model(states_)
mus_ = tf.squeeze(tf.stack([self.mus_model[i](o_phi_t_) for i in range(self.n_actions)]))
w = tf.Variable(self.model.get_layer('R').get_weights()[0])
q = tf.matmul(mus_, w)
max_q_action_index = tf.argmax(tf.squeeze(q)).numpy()
# Training M loss
# =========
with tf.GradientTape() as tape:
loss = tf.keras.losses.mean_squared_error(o_phi_t self.gamma * mus_[max_q_action_index],self.mus_model[max_q_action_index](o_phi_t))
----> self.opt.minimize(loss, self.mus_model[action_index].trainable_variables, tape=tape)
Когда я запускаю learn
функцию, я получаю следующую ошибку:
Трассировка (последний последний вызов): Файл «/Users/wangheng/workspace/pycharmworkspace/MLAlgorithm/reinforcement_learning/SR/dsr_brain_keras.py» , строка 67, в learn self.opt.minimize(потеря, self.model.trainable_variables, лента=лента) Файл «/Users/wangheng/app/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py» , строка 496, в сведении к минимуму grads_and_vars = self._compute_gradients( файл «/Users/wangheng/app/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py» , строка 543, в _compute_gradients с лентой: Файл «/Users/wangheng/app/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/backprop.py «, строка 858, в файле enter self._push_tape() «/Users/wangheng/app/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/backprop.py «, строка 869, в _push_tape вызывает ошибку ValueError(«Лента все еще записывается, это может произойти, если вы попытаетесь » Ошибка значения: лента все еще записывается, это может произойти, если вы попытаетесь повторно ввести уже активную ленту.
Я предполагаю, что это может быть какая-то ошибка, self.opt.minimize()
но я не знаю, как ее решить.
Ответ №1:
Вызов оптимизатора должен находиться вне области действия градиентной ленты, т.е:
with tf.GradientTape() as tape:
loss1 = tf.keras.losses.mean_squared_error(states, self.model(states)[2])
loss2 = tf.keras.losses.mean_squared_error(r, self.model(states)[1])
loss = loss1 loss2
self.opt.minimize(loss, self.model.trainable_variables, tape=tape)
Комментарии:
1. Большое спасибо за ваш ответ, я решил эту проблему ~ 🙂