Мультиклассовый дисбаланс, прогнозирующий одинаковый результат - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь выполнить мультиклассовую классификацию изображений с помощью CNN. Всего существует 5 классов, и данные abit несбалансированы (10,6%, 16,7%, 2,8%, 6,9% и 63,0%).

Модель предсказывает один и тот же класс (класс режима, который состоит из 63% данных) для всех входных данных. Я добавил вес класса, но результат остался прежним. Я не уверен, что это ошибка кода или модель просто не может узнать больше о вводе.

Вот мой код:

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1/255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest',
        validation_split=0.2)

test_datagen = ImageDataGenerator(
        rescale=1/255)

batch_size = 128
train_it = train_datagen.flow_from_directory(
        'D:/Work/Images/data/train/', 
        class_mode='categorical',
        color_mode='grayscale', 
        batch_size=batch_size,
        target_size=(256,256))

val_it = test_datagen.flow_from_directory(
        'D:/Work/Images/data/validation/', 
        class_mode='categorical',
        color_mode='grayscale',
        batch_size=batch_size,
        target_size=(256,256))

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from keras.layers import Dense, Flatten, Dropout
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(256, 256, 1)))
model.add(MaxPooling2D((2, 2)))

#model.add(Conv2D(64, (3, 3), activation='relu'))
#model.add(MaxPooling2D((2, 2)))
#model.add(BatchNormalization())

#model.add(Conv2D(128, (3, 3), activation='relu'))
#model.add(MaxPooling2D((2, 2)))


model.add(Flatten())
model.add(Dense(32))
model.add(Dropout(0.5))
model.add(Dense(5, activation='softmax'))

# model summary
model.summary()

# compile model
model.compile(optimizer=Adam(learning_rate=0.0005), loss='categorical_crossentropy', metrics=['accuracy'])
# fit model with generator
history = model.fit_generator(train_it, steps_per_epoch=len(train_it.filenames) // batch_size,
                    epochs=100, validation_data=val_it,
                    validation_steps=len(val_it.filenames) // batch_size,
                    class_weight=class_weights)

Я попытался добавить сверточные слои в модель но результаты те же. Модель, кажется, обучается (по крайней мере, до определенного момента), поскольку потери при обучении и потери val уменьшаются, но тогда она просто предсказывает тот же класс.

enter image description here

[[0.09973492 0.17768678 0.06219631 0.09581334 0.56456864]
 [0.09973492 0.17768678 0.06219631 0.09581334 0.56456864]
 [0.09973492 0.17768678 0.06219631 0.09581334 0.56456864]

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...