Нормализация входного изображения для распознавания лиц, кажется, мешает тренировке - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь создать нейронную сеть, предсказывающую встраивание лиц для распознавания лиц. Я основываю архитектуру на модели Fa cenet Zeiler & Fergus, которую я построил в Керасе. После первой ночи обучения на наборе данных VGGFace2 я достиг точности 80%. Обучение продолжалось в течение дня до 83%, но, наконец, сеть начала переоснащаться, и точность начала падать.

Сейчас я пытаюсь повысить точность и думаю, что хорошее место для начала может быть с предварительной обработкой изображения. Прочитав немного о нормализации, центрировании и стандартизации, я реализовал эту функцию:

def normalize_batch(imgs):
  imgs = np.array(imgs, dtype=np.float32)
  per_channel_means = imgs.mean(axis=(0,1,2), dtype=np.float64)
  per_channel_stds = imgs.std(axis=(0,1,2), dtype=np.float64)
  imgs -= per_channel_means
  imgs /= per_channel_stds
  per_channel_max = np.absolute(imgs).max(axis=(0,1,2))
  imgs /= per_channel_max
  return imgs

Я снова тренировался в сети с этим дополнением, примененным в генераторе пакетов (batch_size=39), но пока потеря функция, кажется, не go вниз, как это было без нее. Есть ли ошибка в способе обработки данных? Или, может быть, я должен обработать его по-другому для этой задачи?

Обновление: после ночи обучения (35 эпох) значение функции потери не упало вообще. Я снова начал тренироваться, удаляя следующие строки:

  per_channel_max = np.absolute(imgs).max(axis=(0,1,2))
  imgs /= per_channel_max

Я хотел бы привести значения из текущего диапазона около <-3,3> в диапазон <-1,1>, но я подозреваю, что будь логичен c ошибка в том, как я поступил с этими двумя строками. Я не уверен, что это проблема, но потери уменьшались с каждой из 4 эпох, которые я тренировал до сих пор.

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