Я пытаюсь выполнить мультиклассовую классификацию изображений с помощью 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 уменьшаются, но тогда она просто предсказывает тот же класс.
[[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]
Есть идеи?