Я пытаюсь построить реализацию a3c в keras.У меня есть опыт работы с керасом, но абсолютно нет опыта работы с tenorflow.Поэтому я был бы очень признателен, если бы кто-то смог сделать это настолько просто, насколько это возможно, поскольку я хочу закончить его как можно быстрее, не погружаясь слишком глубоко в тензорный поток.
self.session = tf.Session()
K.set_session(self.session)
K.manual_variable_initialization(True)
self.stop_signal = False
self.model = self._build_model()
self.graph = self._build_graph(self.model)
self.session.run(tf.global_variables_initializer())
self.default_graph = tf.get_default_graph()
self.default_graph.finalize() # avoid modifications
def _build_model(self):
l_input = Input(batch_shape=(None, NUM_STATE))
input_layer = Reshape((1, -1))(l_input)
lstm = LSTM(64, activation='relu', return_sequences=True)(input_layer)
lstm = LSTM(128, activation='relu', return_sequences=True)(lstm)
lstm = LSTM(128, activation='relu')(lstm)
out_actions = Dense(NUM_ACTIONS, activation='softmax')(lstm)
out_value = Dense(1, activation='linear')(lstm)
model = Model(inputs=[l_input], outputs=[out_actions, out_value])
model._make_predict_function() # have to initialize before threading
return model
def _build_graph(self, model):
s_t = tf.placeholder(tf.float32, shape=(None, NUM_STATE))
a_t = tf.placeholder(tf.float32, shape=(None, NUM_ACTIONS))
r_t = tf.placeholder(tf.float32, shape=(None, 1))
p, v = model(s_t)
log_prob = tf.log(tf.reduce_sum(p * a_t, axis=1, keepdims=True) + 1e-10)
advantage = r_t - v
loss_policy = - log_prob * tf.stop_gradient(advantage)
loss_value = LOSS_V * tf.square(advantage)
entropy = LOSS_ENTROPY * tf.reduce_sum(p * tf.log(p + 1e-10), axis=1, keepdims=True)
loss_total = tf.reduce_mean(loss_policy + loss_value + entropy)
optimizer = tf.train.AdamOptimizer(LEARNING_RATE)
minimize = optimizer.minimize(loss_total)
return s_t, a_t, r_t, minimize
Тогда это тренируется:
s_t, a_t, r_t, minimize = self.graph
self.session.run(minimize, feed_dict={s_t: s, a_t: a, r_t: r})
Прогнозы выполняются следующим образом:
with self.default_graph.as_default():
p, v = self.model.predict(s)
Поэтому я хочу обновить веса моделей в моем keras, используя эти градиенты, после того как я закончу тренировку, чтобы сохранить ее с помощью model.save ('path.h5' ).Peudo code:
model_weights = model.trainable_weights
model_weights = apply_gradients(grades, model_weights)
model = model.set_weights(model_weights)
model.save('path.h5')
Код был взят здесь с небольшими изменениями: https://github.com/jaara/AI-blog/blob/master/CartPole-A3C.py
Я нашел что-то по этой теме, но не могу понять, как на самом делеиспользуй это.https://github.com/keras-team/keras/issues/3062
https://github.com/keras-team/keras/issues/3069