异常训练Resnet50:“Flatten”的输入形状未完全定义“

时间:2018-06-05 06:20:22

标签: python tensorflow keras deep-learning resnet

我想使用keras.applications.resnet50使用以下设置为两类问题训练Resnet:

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的一维数组。我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于您没有对Resnet模型的输出应用池(平均值或最大值),因此它提供的输出是4-D张量,将传递到Dense层。在密集层之前应用池是个好主意,它将从前一层中提取每个特征的 avg max ,然后传递到Dense层。另一种选择是如果你不想要应用池化层,那么你可以将 Flatten()层应用于Resnet输出,这也可以将4-D张量转换为2-D张量,您的Dense图层需要预期。

答案 1 :(得分:1)

你得到了

  

异常:" Flatten"的输入形状。尚未完全定义

因为您尚未在resnet网络中设置输入形状。尝试:

get value(): string { // return type
   return this.service.value
}

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

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