异常训练 Resnet50:"The shape of the input to "Flatten“未完全定义”

Exception training Resnet50: "The shape of the input to "Flatten" is not fully defined"

我想使用 keras.applications.resnet50 使用以下设置训练 Resnet 解决两个 class 问题:

from keras.layers import Dropout, Flatten, Dense
from keras.applications.resnet50 import ResNet50
from keras.models import Model

resNet = ResNet50(include_top=False, weights=None)
y = resNet.output
y = Flatten()(y)
y = Dense(2, activation='softmax')(y)
model = Model(inputs=resNet.input, outputs=y)
opt = keras.optimizers.Adam()
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
epochs = 15
model.fit(train_tensors, train_targets, 
          validation_data=(valid_tensors, valid_targets),
          epochs=epochs, batch_size=10, callbacks=[checkpointer], verbose=1)

运行 代码抛出错误

Exception: The shape of the input to "Flatten" is not fully defined 

所以输出层的输入张量一定有问题,在我的例子中是一个单热编码向量,即大小为 2 的一维数组。我做错了什么?

由于您没有对 Resnet 模型的输出应用 池化(平均或最大),它提供的输出是一个 4-D 张量,被传递给你的致密层。在密集层之前应用池化是个好主意,它将从前一层提取每个特征的 avgmax,然后通过到致密层上。另一种选择是,如果您不想应用池化层,那么您可以将 Flatten() 层应用于 Resnet 输出,这也会将 4-D 张量转换为 2-D 张量D 张量,您的 Dense 层所期望的。

你得到

Exception: The shape of the input to "Flatten" is not fully defined

因为你还没有在你的resnet网络中设置输入形状。尝试:

resNet = ResNet50(include_top=False, weights=None, input_shape=(224, 224, 3)) 

此外,由于您在输出层中使用带有 sigmoid 激活的 binary_crossentropy,因此您应该只使用 1 个神经元而不是 2 个,如下所示:

y = Dense(1, activation='sigmoid')(y)