how can I overcome "ValueError: Shapes (None, 1) and (None, 7) are incompatible"
how can I overcome "ValueError: Shapes (None, 1) and (None, 7) are incompatible"
我是 Keras 和 CNN 的新手。我正在做一项任务,建立一个 CNN 来预测面部情绪。我根据作业构建了模型,但在编译模型时我得到 "ValueError: Shapes (None, 1) and (None, 7) are incompatible"。谁能帮我解决这个问题?
下面粘贴我的代码以供参考:
'''
model = Sequential()
model.add(Conv2D(filters = 64, kernel_size = 5,input_shape = (48,48,1)))
model.add(Conv2D(filters=64, kernel_size=5,strides=(1, 1), padding='valid'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2),strides=1, padding='valid'))
model.add(Activation('relu'))
model.add(Conv2D(filters = 128, kernel_size = 5))
model.add(Conv2D(filters = 128, kernel_size=5))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation('relu'))
model.add(Conv2D(filters = 256, kernel_size = 5))
model.add(Conv2D(filters = 256, kernel_size=5))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(128))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(7,activation='softmax'))
'''
'Then tried to compile'
'''
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(input_array, output_array, batch_size = 64, epochs= 20, validation_split=0.10,)
'''
'This gives the error'
'ValueError: Shapes (None, 1) and (None, 7) are incompatible'
'I am using google colab for this'
您很可能使用稀疏编码的标签,例如 [0,1,2,3,4,5,6]
而不是单热编码形式。
您的解决方案是选择以下之一:
- 使用one-hot-encoded形式,即将每个标签转换为长度==number_of_classes的数组。也就是说,对于 0 你会有
[1,0,0,0,0,0,0]
对于 1 你会有 [0,1,0,0,0,0,0]
等等
- 使用
sparse_categorical_crossentropy
。如果您使用此损失函数,OHE 步骤将在幕后完成,您不再需要处理输入训练 + 验证标签。
如果您对 [0, 0, 0, 0, 0, 0, 1] 这样的标签使用单热编码,则需要使用 categorical_crossentropy
但是如果你使用像 [1, 2, 3, 4, 5, 6, 7] 这样的稀疏标签,你需要使用 sparse_categorical_crossentropy
.
我是 Keras 和 CNN 的新手。我正在做一项任务,建立一个 CNN 来预测面部情绪。我根据作业构建了模型,但在编译模型时我得到 "ValueError: Shapes (None, 1) and (None, 7) are incompatible"。谁能帮我解决这个问题?
下面粘贴我的代码以供参考:
'''
model = Sequential()
model.add(Conv2D(filters = 64, kernel_size = 5,input_shape = (48,48,1)))
model.add(Conv2D(filters=64, kernel_size=5,strides=(1, 1), padding='valid'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2),strides=1, padding='valid'))
model.add(Activation('relu'))
model.add(Conv2D(filters = 128, kernel_size = 5))
model.add(Conv2D(filters = 128, kernel_size=5))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation('relu'))
model.add(Conv2D(filters = 256, kernel_size = 5))
model.add(Conv2D(filters = 256, kernel_size=5))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(128))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(7,activation='softmax'))
''' 'Then tried to compile' '''
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(input_array, output_array, batch_size = 64, epochs= 20, validation_split=0.10,)
''' 'This gives the error' 'ValueError: Shapes (None, 1) and (None, 7) are incompatible' 'I am using google colab for this'
您很可能使用稀疏编码的标签,例如 [0,1,2,3,4,5,6]
而不是单热编码形式。
您的解决方案是选择以下之一:
- 使用one-hot-encoded形式,即将每个标签转换为长度==number_of_classes的数组。也就是说,对于 0 你会有
[1,0,0,0,0,0,0]
对于 1 你会有[0,1,0,0,0,0,0]
等等 - 使用
sparse_categorical_crossentropy
。如果您使用此损失函数,OHE 步骤将在幕后完成,您不再需要处理输入训练 + 验证标签。
如果您对 [0, 0, 0, 0, 0, 0, 1] 这样的标签使用单热编码,则需要使用 categorical_crossentropy
但是如果你使用像 [1, 2, 3, 4, 5, 6, 7] 这样的稀疏标签,你需要使用 sparse_categorical_crossentropy
.