在 python 中制作 keras 模型的深层副本

新手上路,请多包涵

我想对我的 keras 模型(称为 model1 )进行深度复制,以便能够在 for 循环中使用它,然后为每个 for 循环迭代重新初始化并执行 fit 为模型增加了一个样本。我希望能够在每次迭代后初始化模型,因为在执行 fit 之后(但是我的模型被修改了,我希望它保持原样,当我使用 load_weights 从路径加载时) .

我的代码看起来像:

 model1= create_Model()
model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model1.load_weights('my_weights')

model_copy= create_Model()
model_copy.compile(optimizer='rmsprop', loss='categorical_crossentropy')

model_copy= keras.models.clone_model(model1)
for j in range(0, image_size):
      model_copy.fit(sample[j], sample_lbl[j])
      prediction= model_copy.predict(sample[j])

此外,每次在 for 循环中加载模型对我来说并不是很有效,因为这很耗时。在我的案例中,我该如何正确地进行深层复制?我发布的代码给出了以下与函数 .fit 和我的参考模型 model_copy 有关的错误:

RuntimeError:您必须在训练/测试之前编译模型。使用 model.compile(optimizer, loss)

原文由 Jose Ramon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 355
2 个回答

问题是 model_copy 可能在克隆后没有编译。其实有几个问题:

  1. 显然克隆不会复制损失函数、优化器信息等。

  2. 在编译之前,您还需要构建模型。

  3. 此外,克隆不会复制权重

所以你在克隆后需要几行额外的代码。例如,对于 10 个输入变量:

 model_copy= keras.models.clone_model(model1)
model_copy.build((None, 10)) # replace 10 with number of variables in input layer
model_copy.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model_copy.set_weights(model.get_weights())

更简单的方法 1:从文件加载权重

如果我正确理解你的问题,那么有一种更简单的方法可以做到这一点。您不需要克隆模型,只需要保存 old_weights 并在循环开始时设置权重。您可以直接从文件中加载权重。

 for _ in range(10):
    model1= create_Model()
    model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
    model1.load_weights('my_weights')

    for j in range(0, image_size):
          model1.fit(sample[j], sample_lbl[j])
          prediction= model1.predict(sample[j])

更简单的方法 2:从之前的 get_weights() 加载权重

或者,如果您不想从文件加载:

 model1= create_Model()
model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model1.load_weights('my_weights')
old_weights = model1.get_weights()

for _ in range(10):
    model1.set_weights(old_weights)
    for j in range(0, image_size):
          model1.fit(sample[j], sample_lbl[j])
          prediction= model1.predict(sample[j])

原文由 Tim 发布,翻译遵循 CC BY-SA 4.0 许可协议

这些天它是微不足道的:

 model2 = tf.keras.models.clone_model(model1)

这将为您提供新模型、新层和新权重。如果由于某种原因不起作用(我还没有测试过),这个旧的解决方案将:

 model1 = Model(...)
model1.compile(...)
model1.save(savepath) # saves compiled state
model2 = keras.models.load_model(savepath)

原文由 markemus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题