【发布时间】:2021-04-29 04:40:17
【问题描述】:
我正在尝试使用 Keras 功能 API 为我的 Policy Gradient(深度强化学习)代理构建一个 NN 模型。我打算做的是通过在 logit 层将它们的概率分布减少到零来掩盖无效动作:
def __build_policy_network(self):
inputs = keras.layers.Input(shape=(self.input_dim,))
advantages = keras.layers.Input(shape=(1,))
valid_actions = keras.layers.Input(shape=(3,))
dense_1 = keras.layers.Dense(units=self.fc1_size, activation="relu", kernel_initializer="he_uniform")(inputs)
dense_2 = keras.layers.Dense(units=self.fc2_size, activation="relu", kernel_initializer="he_uniform")(dense_1)
probs_logits = keras.layers.Dense(units=self.nb_actions, activation='softmax')(dense_2)
masked_probs = keras.layers.Multiply()([probs_logits, valid_actions])
probs = keras.layers.Lambda(lambda x: x / keras.backend.sum(x, axis=1))(masked_probs)
def custom_loss(y_true, y_pred):
out = keras.backend.clip(y_pred, 1e-8, 1 - 1e-8)
log_lik = y_true * keras.backend.log(out)
return keras.backend.sum(-log_lik * advantages)
policy = keras.models.Model([inputs, advantages], [probs])
policy.compile(optimizer=keras.optimizers.Adam(lr=self.alpha), loss=custom_loss)
predict = keras.models.Model([inputs, valid_actions], [probs])
return policy, predict
但是,当我注释掉 advantages 或 valid_actions 输入层中的任何一个(当然,删除它们对应的行)时,我遇到了臭名昭著的错误 ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_3:0", shape=(None, 3), dtype=float32) at layer "multiply".,我可以成功运行代码。我应该提一下,valid_actions 输入层仅用于屏蔽无效概率,并且不需要进行损失计算。
如果有人可以帮助我,我真的很感激。
提前感谢您的宝贵时间
【问题讨论】:
标签: tensorflow keras deep-learning reinforcement-learning