Tensorflow Keras 从一个模型复制权重到另一个模型

在使用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()) 

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注