Проблема с обучаемой переменной при преобразовании сети Tensorflow в версию Keras

#python #tensorflow #keras #reinforcement-learning

#python #tensorflow #keras #подкрепление-обучение

Вопрос:

Я хочу переписать сеть в DDPG следующим образом, используя Keras, и я думаю, что этот код объединяет состояние и действие в плотный слой с помощью Relu, а затем соединяет его с плотной функцией без активации

     def _build_c(self, s, a, scope, trainable):
    with tf.variable_scope(scope):
        n_l1 = 30
        w1_s = tf.get_variable('w1_s', [self.s_dim, n_l1], trainable=trainable)
        w1_a = tf.get_variable('w1_a', [self.a_dim, n_l1], trainable=trainable)
        b1 = tf.get_variable('b1', [1, n_l1], trainable=trainable)
        net = tf.nn.relu(tf.matmul(s, w1_s)   tf.matmul(a, w1_a)   b1)
        return tf.layers.dense(net, 1, trainable=trainable)  
  

Сеть версии Keras, которую я переписываю, выглядит следующим образом, но производительность отличается от исходной версии Tensorflow, интересно, я неправильно понимаю исходный код при работе с обучаемой переменной и не могу просто объединить состояние и действие.

     def create_critic_network(self, state_size,action_dim):
        print("Now we build the model")
        S = Input(shape=[state_size,])
        A = Input(shape=[action_dim,],name='action2')
        h0 = Concatenate()([S, A])
        h1 = Dense(HIDDEN_UNITS, activation='relu')(h0)
        V = Dense(action_dim)(h1)
        model = Model(input=[S,A],output=V)
        adam = Adam(lr=self.LEARNING_RATE)
        model.compile(loss='mse', optimizer=adam)
        return model, A, S
  

Комментарии:

1. tf.matmul(s, w1_s) tf.matmul(a, w1_a) суммирует два тензора. Concatenate()([S, A]) объединяет их как отдельные переменные.

2. Большое спасибо, но как я могу реализовать tf.matmul(s, w1_s) tf.matmul(a, w1_a) в Keras? Интересно, есть ли какие-то похожие функции для создания обучаемых переменных, как tf.get_variable в Keras, или я могу создать сеть Keras другим способом?

3. Вы можете использовать Add layer для добавления двух тензоров. Перед этим вам нужно передать каждый ввод ( s и a ) на отдельный Dense уровень для реализации tf.matmul части. Чтобы быть более точным, вы должны установить один из Dense with use_bias=False , чтобы избежать избыточности.

4. о, я понял! Большое вам спасибо!