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

Jos*_*mon 9 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])
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)


Tim*_*Tim 7

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

Run Code Online (Sandbox Code Playgroud)

更简单的方法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])
Run Code Online (Sandbox Code Playgroud)

方法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])
Run Code Online (Sandbox Code Playgroud)