Глава 5. Перенос обучения: переиспользование предобученных нейронных сетей
235
робное описание шагов преобразования вы найдете в инфобоксе 5.1. Попробуйте
воспользоваться методом
summary()
, чтобы посмотреть топологию MobileNetV2
и выяснить основные ее отличия от MobileNetV1.
4. Важный нюанс кода тонкой настройки в листинге 5.8 — повторный вызов метода
compile()
модели после разблокирования плотного слоя базовой модели. Вы
полните следующее.
А. С помощью того же метода, что и в упражнении 2, убедитесь, что весовые коэф
фициенты (ядра и смещения) плотного слоя действительно не меняются при
первом (на начальном этапе переноса обучения) вызове
fit()
, но меняются
при втором (на этапе тонкой настройки).
Б. Попробуйте закомментировать вызов
compile()
, следующий за строкой раз
блокирования (строкой кода, где меняется значение атрибута
trainable
),
и посмотрите, как это повлияет на значения весов. Убедитесь, что вызов
compile()
действительно необходим, чтобы вступили в силу изменения со
стояний «заблокирован/разблокирован» слоев модели.
В. Поменяйте код, попробовав разблокировать дополнительные слои базовой
модели speechcommand, включающие весовые коэффициенты (например,
слой conv2d, предшествующий предпоследнему плотному слою), и посмотри
те, как это повлияет на результаты тонкой настройки.
5. Для пользовательской функции потерь, описанной нами для задачи обнаруже
ния простых объектов, мы масштабировали метку 01 формы объекта так, чтобы
сигнал рассогласования от предсказания формы целевого объекта соответство
вал по амплитуде сигналу рассогласования от предсказания ограничивающего
прямоугольника (см. листинг 5.10). Посмотрите, что получится, если не вы
полнять такого масштабирования (убрав вызов
mul()
из кода в листинге 5.10).
Убедитесь, что для достаточно точных предсказаний формы объекта такое мас
штабирование необходимо. Для этого можно также просто заменить экземпляры
customLossFunction
на
meanSquaredError
в вызове
compile()
(см. листинг 5.11).
Учтите также, что при отказе от масштабирования во время обучения необходи
мо соответствующим образом изменить пороговое значение в ходе выполнения
вывода, а именно поменять пороговое значение с
CANVAS_SIZE/2
на
1/2
в логике
вывода (в файле
simple-object-detection/index.js
).
6. Этап тонкой настройки в примере обнаружения простых объектов включает раз
блокирование девяти верхних слоев усеченной базовой модели MobileNet (по
смотрите, как заполняется массив
fineTuningLayers
в листинге 5.9). Естественно,
возникает вопрос: почему именно девять? В этом упражнении поменяйте число
разблокируемых слоев в массиве
fineTuningLayers
на большее/меньшее. Какие
значения следующих величин вы ожидаете увидеть при разблокировании мень
шего числа слоев при тонкой настройке: 1) итоговое значение функции потерь
и 2) длительность каждой эпохи на этапе тонкой настройки? Насколько соот
ветствуют ожидаемым результаты эксперимента? А в случае разблокирования
большего числа слоев во время тонкой настройки?
236
Do'stlaringiz bilan baham: |