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

时间:2019-01-25 14:09:14

标签: python keras

我想复制我的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)

2 个答案:

答案 0 :(得分:5)

这几天很琐碎:

=VLOOKUP(A:A,Worksheet2!A:B,2,FALSE)

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

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

答案 1 :(得分:3)

问题是克隆后可能未编译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])