ValueError: целевой массив с формой (32, 5) был передан для вывода формы (None, 4) при использовании в качестве потерь categoryorical_crossentropy - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь обучить модель на наборе данных 40x40 изображений в оттенках серого, и я получаю эту ошибку:

ValueError: целевой массив с формой (32, 5) был передан для вывода формы (Нет, 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]) ```

1 Ответ

0 голосов
/ 18 июня 2020

Проверьте количество классов в вашем наборе данных.

Массив (32,5) определяется формой вашего набора данных.

Форма Y (метка) отображается как 5 классы, и вы объявили его как 4 в последнем выходном слое как (None, 4). Это означает, что код считывает 4 класса из предоставленного пути к изображению.

...