【问题标题】:ValueError: A target array with shape (32, 5) was passed for an output of shape (None, 4) while using as loss categorical_crossentropyValueError:形状为 (32, 5) 的目标数组被传递为形状 (None, 4) 的输出,同时用作损失 categorical_crossentropy
【发布时间】:2020-10-08 03:38:33
【问题描述】:

我正在尝试在 40x40 灰度图像的数据集上训练模型,但出现此错误:

ValueError: 形状为 (32, 5) 的目标数组被传递为形状 (None, 4) 的输出,同时用作损失 categorical_crossentropy。这种损失期望目标具有与输出相同的形状。

我不知道 (32, 5) 的数组应该是 (32, 4) 从哪里来的,所以我不知道要更改什么。有什么建议吗?

image_generator = ImageDataGenerator(#rescale = 1/255,
                                     shear_range = 0.3,
                                     zoom_range = 0.1,
                                     rotation_range = 30, 
                                     width_shift_range = 0.08, 
                                     height_shift_range = 0.08,
                                     horizontal_flip = True, 
                                     fill_mode = 'nearest',
                                    )

train_image_generator = image_generator.flow_from_directory('/data1/mypath/generated-images/train',
                                                            target_size = (40,40),
                                                            color_mode = 'grayscale',
                                                            batch_size = 32,
                                                            class_mode = 'categorical')

test_image_generator = image_generator.flow_from_directory('/data1/mypath/generated-images/test',
                                                            target_size = (40,40),
                                                            color_mode = 'grayscale',
                                                            batch_size = 32,
                                                            class_mode = 'categorical',
                                                            shuffle = False)


model = Sequential()

model.add(Conv2D(32, kernel_size=(3,3),input_shape=(40,40, 1), activation='relu', padding='same'))
model.add(BatchNormalization(axis=-1))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(32, kernel_size=(3,3),activation='relu', padding='same'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(3,3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(4))
model.add(Activation('softmax'))

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

early_stopping = EarlyStopping(monitor='val_loss',patience=5)

model.fit_generator(train_image_generator, epochs=150,
                              validation_data = test_image_generator,
                              callbacks=[early_stopping]) ```

【问题讨论】:

  • 能否请您删除并发布到ai.stackexchange.com?

标签: keras deep-learning classification conv-neural-network


【解决方案1】:

检查数据集中的类数。

数组(32,5) 来自数据集的形状。

Y(label) 的形状显示为 5 个类,您在最后一个输出层将其声明为 4,即 (None, 4)。这意味着代码正在从提供的图像路径中读取 4 个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2022-08-03
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多