【问题标题】:Joining two Models with the same name in Keras Tensorflow在 Keras Tensorflow 中加入两个同名模型
【发布时间】:2017-12-07 08:44:29
【问题描述】:

我试图组合两个模型以将输出连接到一个新模型,以便我可以像这样预测两个模型

model_age = load_model('age.h5')
# model_age.get_layer(name= 'model').name='predictions_1'


model_gender = load_model('gender.h5')
# model_gender.get_layer(name='model_1').name='predictions_2'

x = Input(shape=[100, 100, 3])
y_age = model_age(x)
y_gen = model_gender(x)

model = Model(inputs=x, outputs=[y_age, y_gen])

data = cv2.imread(image)
p_age, p_gender = model.predict(data)

print(p_age)
print(p_gender)

但是这个错误一直在发生,说

RuntimeError: (u'The name "model_1" is used 2 times in the model. All 
layer names should be unique. Layer names: ', ['input_1', u'model_1', 
u'model_1'])

尝试使用上面注释的代码解决该问题,但表示这些模型没有名为“model_1”的层

【问题讨论】:

    标签: tensorflow deep-learning keras


    【解决方案1】:

    ModelsContainers,它们也是 Layers。这使我们能够轻松地重新利用整个网络的权重:

    x = Input(...)
    layer_output = Dense(...)(x)
    model_output = Model(...)(x)
    

    你有这个问题,因为这两个模型都是在不同的 python 执行中创建的,没有名称:

    # this was done:
    m = Model(inputs=x, outputs=y)
    
    # instead of this:
    m = Model(inputs=x, outputs=y, name='model_age')
    # and this, in a different execution:
    m = Model(inputs=x, outputs=y, name='model_gender')
    

    这会导致两个模型具有相同的默认名称,即“model_1”。因为没有模型可以包含多个具有相同名称的层(model.get_layer(...) 不知道该怎么做),所以您需要在合并为单个模型之前修改它们的名称(或两者):

    model_age.name = 'model_age'
    model_gender.name = 'model_gender'
    
    x = Input(shape=[100, 100, 3])
    y_age = model_age(x)
    y_gen = model_gender(x)
    
    model = Model(inputs=x, outputs=[y_age, y_gen])
    

    【讨论】:

    • 我认为这是正确的答案,但是如果你知道,为什么输入一个期望一个 4 维输入,当我输入图像时它说期望 4 但得到了三个
    • 如果我正确理解了您的问题,您将收到错误消息预期 4 个维度,但 3 个已通过。您可能正在传递一个形状为(height, width, channels) 的图像,但fitpredict 在图像列表中运行,而不是在单个图像中。尝试使用以下命令将 data 重塑为 (batch, height, width, channels)model.predict(np.expand_dims(data, 0))
    • 这在 keras 2.0 版中不再起作用。这个问题有解决办法吗?
    【解决方案2】:

    在我看来,模型它们自己都被命名为model_1,而不是它们的层。

    【讨论】:

    • 解决方案是?
    • 查看@lucasdavid 的回答。在我看来,这是对您的问题的正确(而且确实更完整)的答案。如果它解决了您的问题,请接受。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多