Модель CNN, как улучшить точность проверки с меньшим количеством данных проверки - PullRequest
0 голосов
/ 04 марта 2020

Я в настоящее время разрабатываю CNN для мультиклассификации (3 класса), но у меня нет большого количества данных (у каждого класса есть 100 изображений). Я разделил данные на 70% обучения, 30% проверки (всего 210 данных обучения, 90 данных проверки). Я опробовал ImageDataGenerator, чтобы увеличить тренировочные данные. В конце концов, я все еще получаю низкую точность проверки (0,30). Любое предложение, которое может повысить точность проверки? Если вам нужно больше данных для проверки, сколько данных для проверки вы бы порекомендовали?

train_datagen = ImageDataGenerator(rescale=1. / 255, zoom_range=0.3, rotation_range=50,
                                   width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2,
                                   horizontal_flip=True, fill_mode='nearest')
val_datagen = ImageDataGenerator()

train_generator = train_datagen.flow(X_train, to_categorical(y_train), batch_size=16)
val_generator = val_datagen.flow(X_test, to_categorical(y_test), batch_size=16)

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

augmented_checkpoint = ModelCheckpoint('CNN model/best model/best_model.h5',
                                       monitor='val_loss',
                                       verbose=0,
                                       save_best_only=True,
                                       mode='auto')

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit_generator(train_generator,
                              steps_per_epoch=len(X_train) // 16,
                              epochs=20,
                              validation_data=val_generator,
                              validation_steps=len(X_test) // 16,
                              callbacks=[augmented_checkpoint, tensorboard], verbose=1)

1 Ответ

0 голосов
/ 04 марта 2020

200 изображений слишком мало для обучения модели CNN. Даже MNIST (набор данных черно-белых рукописных изображений) содержит 60 000 обучающих изображений и 10 000 тестовых изображений.

Вы можете визуализировать функции CNN низкого уровня, чтобы увидеть, удалось ли им изучить полезные шаблоны.

Учитывая, что у вас ограниченный объем данных, общая практика заключается в использовании трансферного обучения. ie.

  1. Обучите CNN некоторым подобным наборам данных publi c, чтобы ваши более ранние слои CNN могли выучить некоторые общие закономерности, такие как края, текстура, фон.
  2. После завершения обучения, Вы можете в дальнейшем использовать эту предварительно трианализованную модель: оставьте все предыдущие слои CNN без изменений и измените только последний слой softmax на тот, который вы используете сейчас для классификации 3 классов. Затем обучите новую модель своему собственному набору данных.

Я не знаю, насколько сложна ваша проблема, но ваш CNN действительно прост. Вы можете просто найти в Интернете несколько обученных моделей и напрямую использовать их мелкие слои, чтобы вам не пришлось предварительно обучать модели самостоятельно.

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