输入和最终密集层之间的不兼容性(值错误)

Incompatibility between input and final Dense Layer (Value Error)

我正在按照 Nabeel Ahmed 的 tutorial 使用 Keras 创建您自己的情绪检测器(我是菜鸟),我发现了一个我想了解的奇怪行为。输入数据是一堆 48x48 图像,每个图像都有一个介于 0 和 6 之间的整数值(每个数字代表一个情感标签),代表图像中存在的情感。

train_X.shape -> (28709, 2304) // training-data, 28709 images of 48x48
train_Y.shape -> (28709,) //The emotion present in each image as an integer, 1 = happiness, 2 = sadness, etc.
val_X.shape -> (3589, 2304)
val_Y.shape -> (3589, )

为了将数据输入模型,train_Xval_X 被重塑(如教程所述)

train_X.shape -> (28709, 48, 48, 1)
val_X.shape -> (3589, 48, 48, 1)

教程中的模型是这个:

model = Sequential()
input_shape = (48,48,1)
#1st convolution layer
model.add(Conv2D(64, (5, 5), input_shape=input_shape,activation='relu', padding='same'))
model.add(Conv2D(64, (5, 5), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

#2nd convolution layer
model.add(Conv2D(128, (5, 5),activation='relu',padding='same'))
model.add(Conv2D(128, (5, 5),activation='relu',padding='same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

#3rd convolution layer
model.add(Conv2D(256, (3, 3),activation='relu',padding='same'))
model.add(Conv2D(256, (3, 3),activation='relu',padding='same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(128))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
################################################################
model.add(Dense(7)) # <- problematic line
################################################################
model.add(Activation('softmax'))

my_optimiser = tf.keras.optimizers.Adam(
learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=False,
name='Adam')

model.compile(loss='categorical_crossentropy', metrics=['accuracy'],optimizer=my_optimiser)

但是,当我尝试使用它时,使用教程片段,我在 validation_data 的行中遇到这样的错误

history = model.fit(train_X,     
        train_Y, 
        batch_size=64, 
        epochs=80, 
        verbose=1, 
        validation_data=(val_X, val_Y),
        shuffle=True)

ValueError: Shapes (None, 1) and (None, 7) are incompatible

在查看了有关 fit 方法的代码和文档之后,我唯一的想法是将模型最后 Dense 层中的 7 更改为 1,这很神秘作品。如果有人能给我提示,我想知道这里发生了什么。

您似乎在使用稀疏整数标签,其中每个样本属于七个 类 {0, 1, 2, 3, 4, 5, 6} 之一,所以我建议使用 SparseCategoricalCrossentropy 而不是 CategoricalCrossentropy 作为你的损失函数。只需更改此参数,您的模型就可以正常工作。如果你想使用 CategoricalCrossentropy,你将不得不一次性编码你的标签,例如:

train_Y = tf.keras.utils.to_categorical(train_Y, num_classes=7)