Классификация лиц CNN в Керасе не тренируется должным образом - PullRequest
0 голосов
/ 03 июня 2018

Я довольно новичок в машинном обучении, и это мой первый пост в StackOverflow.Я хочу тренировать CNN так, чтобы он мог отличить мое лицо от других.Моя модель просто перестает улучшаться после первых 3 эпох.

Я нашел несколько лиц в онлайн-базах данных для машинного обучения, затем отцентрировал их, затемнил их в серых тонах и обрезал.То же самое я сделал с фотографиями, снятыми моей веб-камерой с моего лица.

Данные для NN выглядят так:

| input                 | output    |       |
|---------------------- |--------   |---    |
| face of me            | 0         | 1     |
| face of someone else  | 1         | 0     |

Пока все хорошо.

Затем я попытался обучить CNN этому со следующей структурой:

model= Sequential()

# sort out the input layer later
model.add(Conv2D(32,3,3, activation='relu', input_shape=(100,100,3)))
model.add(MaxPooling2D((2,2)))

model.add(Conv2D(12,3,3, activation='relu'))
model.add(MaxPooling2D((2,2)))

model.add(Flatten())
model.add(Dense(600, activation='relu'))
model.add(Dense(60, activation='relu'))
#model.add(Dropout(p=0.2))
model.add(Dense(2, activation='softmax'))
model.summary()
epochs = 100
lrate = 0.01
decay = lrate/epochs
sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
#%%
model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])

Я пробовал разные оптимизаторы (sdg, adam, rmsprop) и несколько раз пытался использовать другие параметры для CNN.но каждый раз, когда модель просто прекращает уменьшать потери после первых нескольких эпох.

Epoch 1/100
2176/2176 [==============================] - 55s 25ms/step - loss: 1.8043 - acc: 0.8869
Epoch 2/100
2176/2176 [==============================] - 56s 26ms/step - loss: 1.7037 - acc: 0.8943
Epoch 3/100
2176/2176 [==============================] - 57s 26ms/step - loss: 1.7037 - acc: 0.8943
Epoch 4/100

В этом примере нет улучшения потерь после эпохи 2.

У вас есть идеи, почему это можетбыть так?

1 Ответ

0 голосов
/ 03 июня 2018

Здесь происходят разные вещи.

Дисбаланс классов

Как уже обсуждалось в комментариях, ваш тренировочный набор состоит из 2941 отрицательных выборок (лица от других лиц, кроме вас) и 308положительные образцы (изображения с вашим лицом на нем).Так как классификатор, который всегда голосует за отрицательный класс, получает 2941 из 3249 образцов правильно, то есть 90,5%.Ваша оценка точности обучения должна быть прочитана с учетом этой информации, потому что ваш 89,4% намек на то, что ваша сеть не выучила ничего ценного.

Что вы можете попробовать:

  1. Пересмотрите класс меньшинства
  2. Изучите класс большинства
  3. Используйте весовые коэффициенты в своей функции потерь

Существует огромное количество литературы и учебных пособий по этой теме, так что просто осмотрите немного.

Емкость модели / проектирование сети

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

Существует множество различных сетевых структур для задач обработки изображений, в зависимости от того, что именно является задачей.Например, сеть для пиксельной классификации и сегментации экземпляра (например, Mask RCNN ) будет выглядеть иначе, чем сеть, которая предназначена для распознавания лиц (например, FaceNet ).Даже если мы сосредоточимся только на одной задаче (в этом / вашем случае: распознавании лиц), сетевые структуры, которые вы обнаружите, будут выглядеть совсем иначе.

Так что это значит?Построение нейронной сети для конкретной задачи не тривиально, и нелегко предсказать, какие структуры хорошо работают для какой задачи.Часто требуется много проб и ошибок, чтобы найти подходящую структуру.

Объем модели описывает, насколько «мощной» является ваша модель.Не существует строгого определения для этого, но вы можете думать об этом так: разные задачи могут быть сложнее или проще для решения.Определенная модель может решать только те задачи, которые «достаточно просты», а в случае более сложных задач модель будет показывать только низкую производительность.Емкость модели часто идет рука об руку с дизайном / структурой сети.

Как это вам поможет?Хорошо, посмотрите на различные сетевые структуры, которые выполняют ту же задачу, что и ваша цель, и поймите, почему используются определенные строительные блоки и для чего они хороши.Затем вы можете попытаться восстановить эти структуры и поэкспериментировать с ними.Хорошей отправной точкой может быть это или это учебник по распознаванию лиц.

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