Я пытаюсь создать нейронную сеть, предсказывающую встраивание лиц для распознавания лиц. Я основываю архитектуру на модели 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 эпох, которые я тренировал до сих пор.