使用 keras ResNet50 模型进行二元分类的输出层

我正在尝试使用 Keras ResNet50 实现来训练二进制图像分类模型。

我想在不使用迁移学习的情况下测试模型,但是当我尝试使用带有 sigmoid 激活的简单密集层进行二元分类来更改输出层时,我得到了有关形状大小的错误。

我的代码是这样的:

baseModel= ResNet50(weights=None, include_top=False, classes=2, pooling=max)

output = baseModel.output
output = layers.Dense(1, activation='sigmoid')(output)

model = keras.models.Model(inputs=baseModel.input, outputs=output)

model.compile(optimizer=Adam(learning_rate=0.0001), loss='binary_crossentropy',  metrics=['accuracy'])

这样做我得到了这个错误:

ValueError: logits and labels must have the same shape ((None, 7, 7, 1) vs (None, 1))

如果我在致密层之前添加一个扁平层,我会得到:

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

我在这里缺少什么?我如何改变密集层的输入形状?


郎朗坤
浏览 162回答 1
1回答

拉莫斯之舞

对于 ResNet,您指定了 Top=False 和 pooling = 'max',因此 Resent 模型已向模型添加了最终的最大池化层。因此,使用下面的代码:您不需要添加展平层,最大池化会为您展平输出。out=basemodel.layers[-1].output  output = layers.Dense(1, activation='sigmoid')(out)您可以使用 model.summary() 查看模型结构。另外你不应该使用classes=2。当 top 为 false 时,不应指定类。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python