Я пытался построить модель CNN, используя 2 разные модели для моего набора данных изображений, используя предварительную обработку генератора изображений. Это мой код для первой модели:
height=150
width=150
channels=3
batch_size=32
seed=1337
# Training generator
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_dir,
target_size=(height,width),
batch_size=batch_size,
seed=seed,
class_mode='categorical')
# Test generator
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(test_dir,
target_size=(height,width),
batch_size=batch_size,
seed=seed,
class_mode='categorical')
, который дает вывод:
Найдено 3004 изображения, относящихся к 7 классам.
Найдено 794 изображения, относящихся к 7 классам.
Это моя модель архитектуры:
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(150, 150, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(32, (3, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(64, (3, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# the model so far outputs 3D feature maps (height, width, features)
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(7))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
history = model.fit_generator(
train_generator,
steps_per_epoch=3004 // batch_size,
epochs=50,
validation_data=test_generator,
validation_steps=794 // batch_size)
А после 30 эпох это мой статус:
Epoch 30/50
94/93 [==============================] - 295s 3s/step - loss: 0.1396 - acc: 0.9433 - val_loss: 2.3553 - val_acc: 0.4534
, что показывает его полное переоснащение.
Теперь это вторая модель, которую я попробовал:
Генератор изображений:
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)
validation_datagen = ImageDataGenerator(rescale = 1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(150,150),
class_mode='categorical',
batch_size = 32)
validation_generator = validation_datagen.flow_from_directory(
test_dir,
target_size=(150,150),
class_mode='categorical',
batch_size = 32)
И моя модель архитектуры:
cnn = Sequential()
cnn.add(Conv2D(filters=32,
kernel_size=(2,2),
strides=(1,1),
padding='same',
input_shape=(150,150,3),
data_format='channels_last'))
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2,2),
strides=2))
cnn.add(Conv2D(filters=64,
kernel_size=(2,2),
strides=(1,1),
padding='valid'))
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2,2),
strides=2))
cnn.add(Flatten())
cnn.add(Dense(64))
cnn.add(Activation('relu'))
cnn.add(Dropout(0.25))
cnn.add(Dense(7))
cnn.add(Activation('softmax'))
cnn.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
И вот что я получаю после 30 эпох:
Epoch 30/50
94/93 [==============================] - 295s 3s/step - loss: 1.1396 - acc: 0.5633 - val_loss: 1.3553 - val_acc: 0.5534
Что говорит о том, что модель не переоснащается, но она, безусловно, не способна хорошо прогнозировать.
Исходя из вышеупомянутых двух моделей, это проблема с обеими моделями или изображениями, которые у меня есть?
Как лучше всего решить эту проблему и как попробовать разные модели, чтобы проверить, какая из них работает нормально?
Также я хочу знать, что, если я успешно смогу построить модель, как мне прогнозировать новые изображения, потому что model.predict
, похоже, не работает, и если я храню свои изображения в папке и используйте model.predict_generator
покажите:
Найдено 0 изображений, относящихся к 0 классу
Но мой главный приоритет - как построить модель, переоснащение или занижение, и я не совсем в состоянии разобраться в проблеме.