在使用Tensorflow 1.4.1中的Keras时,如何将一个模型的权重复制到另一个模型中?
背景是,我正在尝试按照DeepMind的DQN论文,实现用于Atari游戏的深度Q网络(DQN)。我的理解是,该实现使用了两个网络,Q和Q’。Q的权重通过梯度下降法进行训练,然后这些权重会定期复制到Q’中。
这是我构建Q和Q’的方式:
ACT_SIZE = 4LEARN_RATE = 0.0025OBS_SIZE = 128def buildModel(): model = tf.keras.models.Sequential() model.add(tf.keras.layers.Lambda(lambda x: x / 255.0, input_shape=OBS_SIZE)) model.add(tf.keras.layers.Dense(128, activation="relu")) model.add(tf.keras.layers.Dense(128, activation="relu")) model.add(tf.keras.layers.Dense(ACT_SIZE, activation="linear")) opt = tf.keras.optimizers.RMSprop(lr=LEARN_RATE) model.compile(loss="mean_squared_error", optimizer=opt) return model
我调用这个函数两次来得到Q和Q’。
我有一个updateTargetModel
方法,尝试复制权重。代码运行正常,但我的整体DQN实现失败了。我只是想验证这是否是将权重从一个网络复制到另一个网络的有效方法。
def updateTargetModel(model, targetModel): modelWeights = model.trainable_weights targetModelWeights = targetModel.trainable_weights for i in range(len(targetModelWeights)): targetModelWeights[i].assign(modelWeights[i])
这里有另一个问题讨论了将权重保存到磁盘和从磁盘加载的问题(Tensorflow Copy Weights Issue),但没有被接受的答案。还有一个关于从单个层加载权重的问题(Copying weights from one Conv2D layer to another),但我想复制整个模型的权重。
回答:
实际上,你所做的不仅仅是复制权重。你让这两个模型在任何时候都保持相同。每当你更新一个模型时,另一个模型也会被更新——因为这两个模型共享相同的weights
变量。
如果你只是想复制权重,最简单的方法是使用以下命令:
target_model.set_weights(model.get_weights())