Tensorflow Keras将重量从一种模型复制到另一种模型

ave*_*dah 9 machine-learning neural-network python-3.x keras tensorflow

使用来自Tensorflow 1.4.1的Keras,如何从一个模型复制到另一个模型?

作为一些背景,我正在尝试在DeepMind发布DQN之后为Atari游戏实施深度q网络(DQN).我的理解是实现使用两个网络,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
Run Code Online (Sandbox Code Playgroud)

我打电话给他两次以获得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])
Run Code Online (Sandbox Code Playgroud)

这里还有另一个问题,讨论了在磁盘上保存和加载权重(Tensorflow Copy Weights Issue),但没有接受的答案.还有一个关于从单个图层加载权重的问题(将权重从一个Conv2D图层复制到另一个图层),但我想复制整个模型的权重.

Mar*_*jko 25

实际上你所做的不仅仅是复制重量.你让这两个模型一直都很相同.每次更新一个模型时 - 第二个模型也会更新 - 因为两个模型都具有相同的weights变量.

如果你只想复制权重 - 最简单的方法是通过这个命令:

target_model.set_weights(model.get_weights()) 
Run Code Online (Sandbox Code Playgroud)

  • 只是想提醒阅读此线程的任何人:clone_model 函数,与它的名称所暗示的不同,不会复制权重 (10认同)
  • 与 `clone_model` 有什么区别?https://github.com/keras-team/keras/issues/1765#issuecomment-324018225 (3认同)