我正在尝试使用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的新手。
答案 0 :(得分:3)
好吧...我认为您正在关注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)
...
评论:
您只需做模型的最后一层,就可以完全相同而无需创建该平坦层:
lastLayer = base_model.layers[-1]
更多:如果目标层是最后一层,则不需要任何这些。照原样使用base_model
。
如果您想要最后带有Dense
层的完整模型,只需使用include_top=True
。
如果要自定义数量的类,请告诉模型构造函数。
如果要使用真正的中间层,请调用model.summary()
来查找层的名称。