我想对我的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])
Run Code Online (Sandbox Code Playgroud)
而且,每次在for循环中加载模型对我来说并不是真正有效,因为这很耗时。在我的情况下,我该如何正确进行深拷贝?我发布的代码给出了有关函数.fit和我的参考模型model_copy的以下错误:
RuntimeError:必须在训练/测试之前编译模型。使用
model.compile(optimizer, loss)。
mar*_*mus 10
这些天是微不足道的:
model2 = tf.keras.models.clone_model(model1)
Run Code Online (Sandbox Code Playgroud)
这将为您提供新模型、新层和新权重。如果由于某种原因不起作用(我还没有测试过),这个旧的解决方案将:
model1 = Model(...)
model1.compile(...)
model1.save(savepath) # saves compiled state
model2 = keras.models.load_model(savepath)
Run Code Online (Sandbox Code Playgroud)
问题是克隆后可能未编译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())
Run Code Online (Sandbox Code Playgroud)
如果我正确理解了您的问题,那么有一种更简单的方法可以做到这一点。您无需克隆模型,只需要保存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])
Run Code Online (Sandbox Code Playgroud)
或者,如果您不想从文件中加载:
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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3829 次 |
| 最近记录: |