无法加载和使用多个keras模型

shk*_*val 7 python keras tensorflow

我正在尝试在同一个过程中加载三个不同的模型.只有第一个按预期工作,其余的返回就像随机结果一样.基本上订单如下:

  • 定义并编译第一个模型
  • 之前加载训练过的重量
  • 重命名图层
  • 第二个模型的过程相同
  • 第三个模型的过程相同

所以,像:

model1 = Model(inputs=Input(shape=input_size_im) , outputs=layers_firstmodel)
model1.compile(optimizer='sgd', loss='mse')
model1.load_weights(weights_first, by_name=True)
# rename layers but didn't work

model2 = Model(inputs=Input(shape=input_size_im) , outputs=layers_secondmodel)
model2.compile(optimizer='sgd', loss='mse')
model2.load_weights(weights_second, by_name=True)
# rename layers but didn't work

model3 = Model(inputs=Input(shape=input_size_im) , outputs=layers_thirdmodel)
model3.compile(optimizer='sgd', loss='mse')
model3.load_weights(weights_third, by_name=True)
# rename layers but didn't work

for im in list_images:
    results_firstmodel = model1.predict(im) 
    results_secondmodel = model2.predict(im) 
    results_thirdmodel = model2.predict(im) 
Run Code Online (Sandbox Code Playgroud)

我想对一堆图像进行一些推断.要做到这一点,这个想法包括循环图像并使用这三种算法进行推理,并返回结果.

我试图重命名所有图层,使它们独一无二,但没有成功.我还为每个网络创建了一个不同的图形,并使用不同的会话进行推理.这有效,但效率非常低(另外我必须每次都设置它们的权重,因为sess.run(tf.global_variables_initializer())它们会被删除).每次创建会话时,tensorflow都会打印"创建tensorflow设备(/ device:GPU:0)".

我正在运行Tensorflow 1.4.0-rc0,Keras 2.1.1和Ubuntu 16.04内核4.14.

Dar*_*nus 1

从 Keras文档中,我们为用户提供了以下解释load_weights

从 HDF5 文件(由 save_weights 创建)加载模型的权重。默认情况下,架构预计保持不变。要将权重加载到不同的架构中(某些层是公共的),请使用 by_name=True 来仅加载具有相同名称的那些层。

因此,如果您的架构未更改,您应该删除by_name=True或创建它False(其默认值)。这可能会导致您面临的不一致,因为您的权重可能由于图层上的名称不同而未加载。


另一件需要考虑的重要事情是 HDF5 文件的性质以及创建它的方式。如果它确实只包含权重(save_weights如文档指出的那样创建),那么按照前面的解释进行操作应该没有问题。

现在,如果 HDF5在同一文件中包含权重和架构keras.models.load_model,那么您应该改为加载它(如果您喜欢,请进一步阅读此处)。如果是这种情况,那么这也可以解释这些不一致之处。

作为一个侧面建议,我更喜欢使用回调来保存我的模型,例如ModelCheckpoint如果EarlyStopping您想自动确定何时停止训练,则可以使用 或 。这不仅为您在训练和保存模型时提供了更大的灵活性(因为您可以在最佳训练时期或需要时停止它们),而且还可以轻松加载这些模型,因为您可以简单地使用该方法来加载架构和load_model模型权重到您想要的变量。

最后,是一篇有用的 SO 帖子,其中解释了保存(和加载)Keras 模型。