我想复制我的keras模型(称为model1
)的深层副本,以便能够在for循环中使用它,然后为每个for-loop迭代重新初始化和对模型附加一个样本执行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)
。
答案 0 :(得分:5)
这几天很琐碎:
=VLOOKUP(A:A,Worksheet2!A:B,2,FALSE)
这将为您提供新的模型,新的图层和新的权重。如果由于某种原因(我没有测试过)不起作用,那么这个较旧的解决方案将:
model2 = tf.keras.models.clone_model(model1)
答案 1 :(得分:3)
问题是克隆后可能未编译model_copy。实际上有一些问题:
显然,克隆不会复制丢失函数,优化器信息等内容。
在编译之前,您还需要构建模型。
此外,克隆不会复制权重
因此克隆后您需要多几行。例如,对于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())
如果我正确理解了您的问题,那么有一种更简单的方法可以做到。您无需克隆模型,只需要保存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])
或者,如果您不想从文件中加载:
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])