使用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
我打电话给两次以获得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),但我想复制整个模型的权重。
答案 0 :(得分:21)
实际上,您所做的不仅仅是复制重量。您使这两个模型始终相同 。每次更新一个模型时 - 第二个模型也会更新 - 因为两个模型都具有相同的weights
变量。
如果您只想复制权重 - 最简单的方法是使用此命令:
target_model.set_weights(model.get_weights())