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