如何从一个模型复制到另一个模型?

作为一些背景,我正试图在DeepMind发布DQN之后,为Atari游戏实现一个deep-q网络(DQN).我的理解是,实现使用了两个网络,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的方法,这是我复制重量的try .代码运行良好,但我的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)或从磁盘(Tensorflow Copy Weights Issue)加载权重,但没有公认的答案.还有一个关于从各个层加载权重的问题(Copying weights from one Conv2D layer to another),但我想复制整个模型的权重.

推荐答案

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

如果只想复制权重,最简单的方法是通过以下命令:

target_model.set_weights(model.get_weights()) 

Python-3.x相关问答推荐

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

模型中的__str__方法在Django管理面板中生成大量重复查询

Pandas 插入的速度太慢了.对于跟踪代码,什么是更快的替代方案?

AddMultplicationEquality() 用于多个变量

将自定义函数应用于 pandas 数据框的每一列

Django中自动设置/更新字段

如何根据索引子列表对元素列表进行分组或批处理?

Python,Web 从交互式图表中抓取数据

如何在类中的函数(以 self 作为第一个参数)中使用递归

我想使用命令提示符安装 cv2

如何在 histplot 中标记核密度估计

在python中将字符串写入文本文件

如何在数据['column']中的'string'等条件下应用pandas

Python 错误:IndexError:字符串索引超出范围

如何在 Python3 中添加带有标志的命令行参数?

cv2 python 没有 imread 成员

无法在 Windows 8 中使用 Python 3.3 找到 vcvarsall.bat

创建集合的 Python 性能比较 - set() 与 {} 文字

如何替换 Python pathlib.Path 中的子字符串?

我可以替换 Python 中对象的现有方法吗?