keras inceptionV3“base_model.get_layer('custom')”错误ValueError:没有这样的层:自定义

Posted

技术标签:

【中文标题】keras inceptionV3“base_model.get_layer(\'custom\')”错误ValueError:没有这样的层:自定义【英文标题】:error with keras inceptionV3 "base_model.get_layer('custom')" ValueError: No such layer: customkeras inceptionV3“base_model.get_layer('custom')”错误ValueError:没有这样的层:自定义 【发布时间】:2019-05-04 21:55:20 【问题描述】:

我正在尝试使用 inceptionV3 预训练模型(来自 keras 应用程序)提取特征。我的代码有以下块:

 base_model = InceptionV3(include_top=include_top, weights=weights, input_tensor=Input(shape=(299,299,3)))
 model = Model(input=base_model.input, output=base_model.get_layer('custom').output)
 image_size = (299, 299)

当我运行它时,它会出现以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-24-fa1f85b62b84> in <module>()
     20 elif model_name == "inceptionv3":
     21   base_model = InceptionV3(include_top=include_top, weights=weights, input_tensor=Input(shape=(299,299,3)))
---> 22   model = Model(input=base_model.input, output=base_model.get_layer('custom').output)
     23   image_size = (299, 299)
     24 elif model_name == "inceptionresnetv2":

~\Anaconda3\lib\site-packages\keras\engine\network.py in get_layer(self, name, index)
    362         """Retrieves the model's updates.
    363 
--> 364         Will only include updates that are either
    365         unconditional, or conditional on inputs to this model
    366         (e.g. will not include updates that depend on tensors

ValueError: No such layer: custom

我已尝试完全卸载并重新安装 Keras。 在我读到的某个地方,在 inceptionV3.py 文件(在 keras 应用程序文件夹中)中包含以下内容:

from ..layers import Flatten

我在导入中添加了这个。仍然没有运气。谁能帮我解决这个问题?我是 Keras 的新手。

【问题讨论】:

你想做什么? @DanielMöller ->从 Keras 库的应用模块加载预训练模型,并根据用户在 conf.json 文件中指定的配置构建模型。之后,从使用 ImageNet 数据集预训练的模型中的用户指定层中提取特征。这些特征及其标签使用 HDF5 文件格式存储在本地。此外,保存模型和权重只是为了表明这些也可以在 Keras 中完成。这就是我想要实现的目标。 InceptionV2 是 Keras 严格构建的预构建模型。没有 conf.json,模型中也没有“自定义”层。 @DanielMöller- 如上面 conf.json 评论中指定的,是用户指定的。感谢您提供有关定制的 tte 信息。我很少看到人们在将其用于 InceptionResNetV2、inceptionV3 和 MobileNet 时使用“自定义”代码 【参考方案1】:

好的...我认为您正在关注this tutorial,在我看来,它的作者并不是真正的 Keras 用户。

引用的自定义层是由教程在更改 keras 源代码时创建的(请不要这样做,这不是一种安全的工作方式,并且会在您未来的项目中造成麻烦 )

在这部分教程中创建了自定义层:

`Add in "<model>.py"


...
...
if include_top:
    # Classification block
    x = GlobalAveragePooling2D(name='avg_pool')(x)
    x = Dense(classes, activation='softmax', name='predictions')(x)
else:
    if pooling == 'avg':
        x = GlobalAveragePooling2D()(x)
    elif pooling == 'max':
        x = GlobalMaxPooling2D()(x)
    x = Flatten(name='custom')(x)
...

评论:

这完全没有必要。全球池的产出已经趋于平缓。 这对您未来的项目很危险,因为您正在更改 keras 源代码。

您可以在不创建此展平层的情况下执行完全相同的操作,只需获取模型的最后一层即可:

lastLayer = base_model.layers[-1]

更重要的是:如果目标层是最后一层,则不需要任何这些。只需按原样使用base_model

如果您想要最后带有Dense 层的完整模型,只需使用include_top=True

如果您想要自定义数量的类,请将其告知模型构造函数。

如果您想要一个真正的中间层,请通过调用model.summary() 找到该层的名称。

【讨论】:

以上是关于keras inceptionV3“base_model.get_layer('custom')”错误ValueError:没有这样的层:自定义的主要内容,如果未能解决你的问题,请参考以下文章

keras inceptionV3“base_model.get_layer('custom')”错误ValueError:没有这样的层:自定义

CoreML - 如何将 InceptionV3 的图像预处理为 MultiArray <Double, 3>?

Keras深度学习实战——基于Inception v3实现性别分类

为啥在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性?

Keras模型拼装

tensorflow 为 tensorflowjs 转换 keras 模型