Bog'liq Цэй Ш., Байлесчи С., и др. - JаvaScript для глубокого обучения (Библиотека программиста) - 2021
Часть II • Введение в TensorFlow.js
Обратите внимание, что используемый здесь подход отличается от того, как
мы объединяли модели в подразделе 5.1.2. Там мы создавали усеченную базовую
модель и новую верхушку модели — два отдельных экземпляра. В результате вы
полнение вывода для каждого входного примера данных требовало двух вызовов
predict()
. Здесь же ожидаемые новой моделью входные сигналы идентичны
тензорам аудиоспектрограмм, ожидаемым базовой моделью. В то же время новая
модель выводит непосредственно оценки вероятностей для новых слов. Каждый
вывод требует лишь одного вызова
predict()
, за счет чего ускоряется весь процесс.
Благодаря инкапсуляции всех слоев в одной модели наш новый подход обладает
еще одним преимуществом: возможностью обратного распространения ошибки
через любые слои, участвующие в распознавании новых слов. Благодаря этому
можно использовать прием тонкой настройки. Именно этим мы и займемся в сле
дующем разделе.
Изучать рис. 5.10 следует вместе с листингом 5.7. Части данного рисунка, соот
ветствующие переменным из листинга 5.7, обозначены моноширинным шрифтом.
Шаг 1: получаем выходной символический тензор предпоследнего плотного слоя
исходной модели (на него указывает широкая стрелка). Далее он будет использован
на шаге 3. Шаг 2: создаем новую верхушку модели, состоящую из одного выходного
плотного слоя (обозначенного на схеме как «Плотный слой 3»). Шаг 3: вызываем
метод
apply()
новой верхушки модели, передавая в него символический тензор
с шага 1 в качестве входного аргумента. Этот вызов связывает входной сигнал новой
верхушки модели с усеченной базовой моделью с шага 1. Шаг 4: при вызове функ
ции
tf.model()
совместно используются возвращаемое значение функции
apply()
и входной символический тензор исходной модели. Этот вызов возвращает новую
модель, включающую все слои исходной модели от первого слоя до предпоследне
го плотного слоя, в дополнение к плотному слою в новой верхушке. По существу,
происходит замена старой верхушки исходной модели новой верхушкой, то есть
закладывается фундамент для последующего обучения на данных, предназначен
ных для переноса. Обратите внимание, что часть (семь) слоев настоящей модели
speechcommand в схеме ради наглядности опущена. На этом рисунке закрашенные
слои — обучаемые, а белые — нет.
Тонкая настройка путем разблокирования слоев
Тонкая настройка — необязательный шаг переноса обучения, следующий за началь
ным этапом обучения модели. На начальном этапе все слои базовой модели были
заблокированы (их атрибуту
trainable
присвоено значение
false
), так что весовые
коэффициенты обновлялись только у слоев верхушки. Мы уже видели такой тип
начального обучения в примерах mnisttransfercnn и webcamtransferlearning ра
нее в этой главе. Во время тонкой настройки разблокируется часть слоев базовой
модели (их атрибут
trainable
равен
true
), после чего модель снова обучается на
данных, предназначенных для переноса обучения. Это разблокирование слоев
схематически показано на рис. 5.11. Реализация этого в TensorFlow.js для примера
speechcommand приведена в коде из листинга 5.8 (из файла
speech-commands/src/
browser_fft_recognizer.ts
).