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

作为一些背景,我正试图在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相关问答推荐

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

列表中的重复数字与列表理解

spinbutton调整up/down箭头

如何将数据框中的每一行转换为具有属性的节点?

Python 3.9.8 使用 Black 并导入 `typed_ast.ast3` 失败

未在 Django 中定义主键类型警告时使用的自动创建主键

FutureWarning:正则表达式的默认值将在future 版本中从 True 更改为 False

如何使用存储在变量中的值作为 case 模式?

ImportError:无法从“distutils”(/usr/lib/python3.8/distutils/__init__.py)导入名称“sysconfig”

matplotlib - 模块“sip”没有属性“setapi”

尾部斜杠的 FastAPI 重定向返回非 ssl 链接

如何在 Python 中键入提示通用数字类型?

如何用decorator 绕过python函数定义?

Python 类成员类型提示

= (equal) 在表达式大括号内的 f 字符串中做什么?

ImportError:无法从“sklearn.preprocessing”导入名称“Imputer”

Python __getitem__ 和 in 运算符导致奇怪的行为

python中存根文件(.pyi)的用途是什么?

Python3.7:加载共享库时出错:libpython3.7m.so.1.0

如何解决“No module named 'frontend'”错误消息?