用python制作keras模型的深层副本

wdebmtf2  于 2022-12-13  发布在  Python
关注(0)|答案(3)|浏览(170)

我想做一个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)

xxe27gdn

xxe27gdn1#

问题是model_copy在克隆后可能没有编译。实际上有几个问题:
1.显然,克隆不会复制丢失函数、优化器信息等。
1.在编译之前,您还需要构建模型。
1.此外,克隆并不会复制体重
所以在克隆之后你需要几行额外的代码。例如,对于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])
qqrboqgw

qqrboqgw2#

这些天它的琐碎:

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

这将给予你一个新的模型,新的层,和新的权重。如果由于某种原因,这不工作(我还没有测试它)这个旧的解决方案将:

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

holgip5t3#

在python中获取深度副本的一个非常通用的方法是从copy包中获取deepcopy

import copy
model2=copy.deepcopy(model)

对keras模型使用此方法有什么缺点吗?

相关问题