TensorFlow Keras 模型权重复制

34

在Tensorflow 1.4.1中使用Keras,如何将一个模型的权重复制到另一个模型中?

作为一些背景信息,我正在尝试实现DeepMind的DQN Atari游戏。据我所知,该实现使用两个网络,Q和Q'。 Q的权重是使用梯度下降进行训练,然后定期将权重复制给Q'。

以下是如何构建Q和Q':

ACT_SIZE   = 4
LEARN_RATE = 0.0025
OBS_SIZE   = 128

def 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),但我想复制整个模型的权重。


Keras FAQ涵盖了保存和加载模型权重的内容。您可以保存/加载所有权重,也可以按层进行操作:https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model - Manngo
谢谢Manngo。我已经复习了模型的保存和加载,并在我的问题末尾通过第一个链接的问题提到了这一点。然而,我的问题是关于直接从一个模型复制权重到另一个模型,而不使用中间文件。 - benbotto
1个回答

79

实际上,你所做的并不仅仅是复制权重。你让这两个模型始终保持相同。每次更新一个模型时,另一个模型也会更新,因为两个模型具有相同的weights变量。

如果你只想复制权重-最简单的方法是使用以下命令:

target_model.set_weights(model.get_weights()) 

谢谢Marcin,这正是我担心的。那么,我之前的做法是Q'中的权重基本上参考了Q中的权重?在使用您的方法复制后,我是否需要重新编译目标模型或进行其他操作? - benbotto
不客气 :) 很高兴能帮到你。祝你的项目好运。 - Marcin Możejko
4
clone_model 和什么有区别? - mrgloom
16
提醒阅读此线程的任何人:clone_model函数并不像其名称所示的那样复制权重。请注意,本翻译仅供参考,如有需要,请以原始语言为准。 - DiveIntoML
1
@mrgloom,所引用的函数会创建一个具有相同架构的全新模型。这包括创建全新权重。 - emil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接