Любые предложения по улучшению моей модели CNN (всегда одинаковая низкая точность теста)? - PullRequest
0 голосов
/ 22 марта 2020

Я работаю над проектом по обнаружению присутствия человека на картине. У меня есть 4000 обучающих изображений и 1000 тестовых изображений, размер которых увеличен до (256,256,3)

Я попробовал модель CNN с 3 (слои Conv, MaxPool, BatchNormalization) и 2 полностью подключенными слоями.

model = Sequential()
model.add(Conv2D(32, kernel_size = (7, 7), activation='relu', input_shape=shape))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())
model.add(Conv2D(64, kernel_size=(7,7), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())
model.add(Conv2D(96, kernel_size=(5,5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())

model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation = 'sigmoid'))

Точность поезда всегда сходится к 1 (всего 20-50 эпох), а точность теста всегда остается постоянной около 0,67.

enter image description here

Я попробовал следующее:

  • Я попытался изменить размер слоев и добавить больше слоев.
  • Я попытался увеличить данные
  • Я попытался меньшие изображения 128x128x3.

Но у меня всегда одни и те же результаты.

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

Я думал о том, чтобы попробовать трансферное обучение (но я не знаю, поможет ли это, потому что я впервые пробую это). Кроме того, у вас есть идеи, где я могу найти обученных моделей?

Итак, я прошу некоторые предложения по улучшению моей модели.

Ответы [ 2 ]

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

Я попытался использовать VGG16 (замороженный) с 4 полностью связанными слоями, и точность проверки повысилась до 0,83. Также я использую ImageDataGenerator.

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

Возможно, вы перегружены данными тренировок, в этом случае вы можете использовать отсев. Другое дело, если вы еще не нормализовали свои данные, вы можете сделать это. Я не уверен, поможет ли это, но попробуй с sth вроде:

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