我想做一个Keras模型的深度拷贝(称为model1
),以便能够在for a循环中使用它,然后为每个for循环迭代重新初始化,并使用模型的一个附加样本执行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:
运行时错误:定型/测试前必须编译模型。请使用model.compile(optimizer, loss)
。
3条答案
按热度按时间xxe27gdn1#
问题是model_copy在克隆后可能没有编译。实际上有几个问题:
1.显然,克隆不会复制丢失函数、优化器信息等。
1.在编译之前,您还需要构建模型。
1.此外,克隆并不会复制体重
所以在克隆之后你需要几行额外的代码。例如,对于10个输入变量:
更简单的方法1:从文件加载重量
如果我没理解错你的问题的话,有一个更简单的方法可以做到这一点。你不需要克隆模型,只需要保存old_weights并在循环开始时设置权重。你可以简单地从文件中加载权重。
更简单的方法2:正在从先前的get_weights()载入权重
或者,如果您不希望从文件加载:
qqrboqgw2#
这些天它的琐碎:
这将给予你一个新的模型,新的层,和新的权重。如果由于某种原因,这不工作(我还没有测试它)这个旧的解决方案将:
holgip5t3#
在python中获取深度副本的一个非常通用的方法是从
copy
包中获取deepcopy
:对keras模型使用此方法有什么缺点吗?