Пользовательский уровень шума в модели Keras DQN - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь реализовать Noisy-сети в моей модели DDDQN в качестве замены для epsilon, как упоминалось в этой статье: https://arxiv.org/pdf/1706.10295.pdf

Но я не уверен, как я реализовать мой собственный шумный слой в Керасе. До сих пор я пробовал это, используя лямбда-слои в двух скрытых слоях, а также в моих выходных слоях:

def create_model(self):

        input_node = tf.keras.Input(shape=(STACK_SIZE, ENVIROMENT_OBSERVATION_SPACE))
        input_layer = input_node

        #define state value function  
        out = GRU(64, return_sequences=True, stateful=False, activation='tanh')(input_layer)
        out = Dropout(0.2)(out)
        
        out = GRU(32, return_sequences=False, stateful=False, activation='tanh')(out)
        out = Dropout(0.2)(out)

        out = Lambda(self.noisy_dense(12, out))
        out = Activation('relu')(out)

        out = Lambda(self.noisy_dense(8, out))
        out = Activation('relu')(out)
        
        state_value = Lambda(self.noisy_dense(1, out))
        state_value = Lambda(lambda s: K.expand_dims(s[:, 0], axis=-1), output_shape=(ACTION_SPACE,))(state_value)

       
        #define acion advantage
        action_advantage = Lambda(self.noisy_dense(ACTION_SPACE, out))
        action_advantage = Lambda(lambda a: a[:, :] - K.mean(a[:, :], keepdims=True), output_shape=(ACTION_SPACE,))(action_advantage)

        #merge by adding
        Q = tf.keras.layers.add([state_value,action_advantage])

        #define model

        model = tf.keras.Model(inputs=input_node, outputs=Q)
                
        #Model compile settings:
        opt = tf.keras.optimizers.Adam(learning_rate = learning_rate)
        
        # Compile model
        model.compile(
        loss='categorical_crossentropy',
        optimizer=opt,
        metrics=['accuracy']
        )

        
        print(model.summary())
        return model
        
def noisy_dense(self, units, input):
        
        w_shape = [units, input.shape[1]]
        mu_w = tf.Variable(initial_value=tf.random.truncated_normal(shape=w_shape))
        sigma_w = tf.Variable(initial_value=tf.constant(0.017, shape=w_shape))
        epsilon_w = tf.random.uniform(shape=w_shape)

        b_shape = [units]
        mu_b = tf.Variable(initial_value=tf.random.truncated_normal(shape=b_shape))
        sigma_b = tf.Variable(initial_value=tf.constant(0.017, shape=b_shape))
        epsilon_b = tf.random.uniform(shape=b_shape)

        w = tf.add(mu_w, tf.multiply(sigma_w, epsilon_w))
        b = tf.add(mu_b, tf.multiply(sigma_b, epsilon_b))

        return tf.matmul(input, tf.transpose(w)) + b

Но когда я запускаю этот код, я получаю сообщение об ошибке в моем первом лямбда-слое "TypeError: Unsupported callable"

...