Глава 4. Распознавание изображений и звуковых сигналов
165
ных обновлений выполняется за одну эпоху. Так что при использовании батчей
большого размера не забудьте соответственно увеличить и количество эпох,
чтобы не снизить ненароком число обновлений весов за время обучения. Таким
образом, должен соблюдаться определенный баланс. В данном случае размер
батча относительно невелик — 64, поскольку нам хотелось бы, чтобы этот пример
работал на разном аппаратном обеспечении. Как и другие параметры, его можно
поменять в исходном коде и обновить страницу, чтобы поэкспериментировать
с различными размерами батчей.
z
z
Используемый в вызове
model.fit()
параметр
validationSplit
. Он позволяет
нам оставить последние 15 % аргументов
trainData.xs
и
trainData.labels
для
проверки в ходе обучения. Как вы уже знаете из предыдущих, не связанных
с изображениями моделей, очень важно отслеживать потери и безошибоч
ность на проверочном наборе данных. Это позволяет понять, не
переобучена
ли
модель, и, если да, уловить момент, когда она начинает переобучаться. Что
такое переобучение (overfitting)? Это такое состояние модели, в котором она
слишком сильно обращает внимание на нюансы поступающих в нее во время
обучения данных. Настолько сильно, что это отрицательно сказывается на без
ошибочности ее предсказаний на новых, не виденных ею данных. Далее в этой
книге мы посвятим целую главу (см. главу 8) обнаружению переобучения
и борьбе с ним.
model.fit()
— асинхронная функция, так что нам приходится использовать
ключевое слово
await
, если последующие действия зависят от того, завершено ли
выполнение. Здесь как раз такая ситуация, ведь нам нужно оценить работу модели
на контрольном наборе данных после обучения. Эта оценка выполняется с помо
щью синхронного метода
model.evaluate()
. На вход в
model.evaluate()
подается
testData
с таким же форматом, как вышеупомянутый
trainData
, но с меньшим ко
личеством примеров данных. Модель не видела эти примеры во время вызова
fit()
,
а значит, контрольный набор данных не влияет на обучение, а результаты оценки
объективно отражают качество модели.
Мы обучаем модель с помощью этого кода в течение десяти эпох (количество
указывается в поле для ввода), получая кривые потерь и безошибочности (рис. 4.8).
Как демонстрируют графики, функция потерь сходится ближе к концу числа эпох
обучения, как и безошибочность. Значения потерь и безошибочности на прове
рочном наборе данных не слишком отклоняются от соответствующих значений
при обучении, а значит, серьезного переобучения в данном случае не наблюдается.
Последний вызов
model.evaluate()
возвращает безошибочность, близкую к 99 %
(значения, которые получите вы, могут слегка отличаться от запуска к запуску изза
случайности начальных значений весов и неявной «перетасовки» примеров данных
случайным образом во время обучения).
Насколько хорошим результатом будет 99 %? С практической точки зрения это
вполне сносный результат, но явно не идеальный. При большем числе сверточных
слоев можно достичь безошибочности 99,5 %, в то же время повысив число слоев
субдискретизации, а также количество фильтров в модели. Впрочем, обучение
166
Do'stlaringiz bilan baham: |