Обновление модели keras с использованием градиентов tf - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь построить реализацию 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

1 Ответ

0 голосов
/ 20 июня 2018

Оказывается, проблема связана с алгоритмом, не сходящимся должным образом.Если кто-то знает, что я могу сделать, чтобы это сходилось?Я использую пользовательскую среду, и в прошлом я обучал DQN этой среде, и она успешно сошлась.Я также реализовал целевую модель, которую я обновляю каждые 300 шагов (или 1 эпизод в моем случае).

...