我正在阅读keras-rl /rl/agents/dqn.py
中的 DQN 实现,并看到在该compile()
步骤中基本上实例化了 3 个 keras 模型:
self.model
:提供q值预测self.trainable_model
:与我们想要训练的损失函数相同self.model
但具有我们想要训练的损失函数self.target_model
: 提供 q 个目标的目标模型,每k
一步都使用来自的权重进行更新self.model
然而,唯一train_on_batch()
被调用的模型是trainable_model
- 这是我不明白的 - 这也更新了 的权重model
。
trainable_model
在输出张量之一的定义中,y_pred
引用来自 的输出model
:
y_pred = self.model.output
y_true = Input(name='y_true', shape=(self.nb_actions,))
mask = Input(name='mask', shape=(self.nb_actions,))
loss_out = Lambda(clipped_masked_error, output_shape=(1,), name='loss')([y_true, y_pred, mask])
ins = [self.model.input] if type(self.model.input) is not list else self.model.input
trainable_model = Model(inputs=ins + [y_true, mask], outputs=[loss_out, y_pred])
当trainable_model.train_on_batch()
被调用时,权重都trainable_model
在model
变化。我很惊讶,因为即使两个模型引用了相同的输出张量对象(trainable_model.y_pred = model.output
),实例化也trainable_model = Model(...)
应该实例化一组新的权重,不是吗?
谢谢您的帮助!