Keras CNN - Модель либо недостаточно оснащена, либо оснащена - PullRequest
0 голосов
/ 05 сентября 2018

Я пытался построить модель 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 классу

Но мой главный приоритет - как построить модель, переоснащение или занижение, и я не совсем в состоянии разобраться в проблеме.

1 Ответ

0 голосов
/ 05 сентября 2018

Вторая модель с аналогичной точностью обучения и проверки выглядит лучше, возможно, потому, что модель проще, поэтому предотвращает переоснащение. Я бы сказал, что вам, вероятно, нужно больше данных. Только 3000 изображений для модели CNN кажутся низкими. ImageNet использует миллионы изображений. Возможно, вы захотите увеличить количество изображений, используя методы увеличения данных, такие как преобразования изображений (масштабирование, вращение, перемещение), добавление гауссовского шума к изображению и т. Д.

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