首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输入与最终稠密层不兼容(值误差)

输入与最终稠密层不兼容(值误差)
EN

Stack Overflow用户
提问于 2022-01-19 19:19:55
回答 1查看 61关注 0票数 1

我正在跟踪来自Nabeel的这个教程,用Keras创建自己的情绪检测器(我是一个菜鸟),我发现了一个我想要理解的奇怪的行为。输入数据是一组48x48图像,每个图像的整数值介于0到6之间(每个数字代表情感标签),表示图像中的情感。

代码语言:javascript
复制
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进行了整形(如本教程所述)。

代码语言:javascript
复制
train_X.shape -> (28709, 48, 48, 1)
val_X.shape -> (3589, 48, 48, 1)

如本教程所示,模型是这样的:

代码语言:javascript
复制
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行中会出现如下错误

代码语言:javascript
复制
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,这很神秘。如果有人能给我个提示的话,我想知道这里发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 06:41:41

您似乎在使用稀疏整数标签,其中每个示例属于七个类{0、1、2、3、4、5、6}中的一个,因此我建议您使用SparseCategoricalCrossentropy而不是CategoricalCrossentropy作为丢失函数。只要更改这个参数,您的模型就会正常工作。如果要使用CategoricalCrossentropy,则必须对标签进行一次热编码,例如:

代码语言:javascript
复制
train_Y = tf.keras.utils.to_categorical(train_Y, num_classes=7)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70776552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档