输入和最终密集层之间的不兼容性(值错误)
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_X
和 val_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)
我正在按照 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_X
和 val_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)