代码之家  ›  专栏  ›  技术社区  ›  benbotto

Tensorflow Keras将权重从一个模型复制到另一个模型

  •  32
  • benbotto  · 技术社区  · 6 年前

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

    作为一些背景,我正试图在DeepMind发布DQN之后,为Atari游戏实现一个deep-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 ),但我想复制整个模型的权重。

    1 回复  |  直到 6 年前
        1
  •  74
  •   mrgloom    6 年前

    实际上,你所做的远远不止是简单地复制重量。你把这两个模型做得一模一样 总是 . 每次更新一个模型时,第二个模型也会更新,因为两个模型都具有相同的 weights 变量。

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

    target_model.set_weights(model.get_weights())