Глава 5. Перенос обучения: переиспользование предобученных нейронных сетей
203
программирования). Она принимает один или несколько входных аргументов.
У каждого аргумента есть тип, определяющий, какие переменные через него можно
передать. Однако
сам
этот аргумент не содержит никаких конкретных значений, он
просто заполнитель. Символический тензор аналогичен аргументу функции: он про
сто задает, тензоры какого вида (сочетания формы
1
и dtype) могут использоваться
в этом слоте. У функций в статически типизированных языках программирования
есть и возвращаемый тип данных, который можно сравнить с выходным символиче
ским тензором объекта модели или слоя. Он представляет собой своего рода шаблон
формы и dtype фактических значений выходного тензора объекта, принадлежащего
модели или слою.
Два важных атрибута объекта модели в TensorFlow.js — ее входные и выходные
сигналы. Каждый из них представляет собой массив символических тензоров. Длина
обоих массивов у модели с одним входным и одним выходным сигналом равна 1.
Аналогичным образом, у объекта слоя два атрибута: входные и выходные сигналы,
оба — символические тензоры. Символические тензоры можно использовать при
создании новой модели. Это новый для нас способ создания моделей в TensorFlow.js,
отличающийся от описанного ранее подхода, а именно создания последовательных
моделей с помощью метода
tf.sequential()
и дальнейших вызовов метода
add()
.
В этом новом для нас подходе используется функция
tf.model()
, принимающая на
входе объект конфигурации, включающий два обязательных поля:
inputs
и
outputs
.
Поле
inputs
, как и
outputs
, должно представлять собой символический тензор (либо
массив символических тензоров). Следовательно, можно получить символические
тензоры из исходной модели MobileNet и передать их в метод
tf.model()
. Результа
том вызова этого метода будет новая модель, частично состоящая из старой модели
MobileNet.
Этот процесс схематически изображен на рис. 5.7 (учтите, что на рисунке число
слоев уменьшено по сравнению с настоящей моделью MobileNet ради упрощения
схемы). Важно отдавать себе отчет, что получаемые из исходной модели и переда
ваемые методу
tf.model()
символические тензоры —
не
изолированные объекты.
Они содержат информацию о слоях, к которым относятся, и о том, как эти слои со
единяются друг с другом. Для тех из наших читателей, кто знаком с теорией графов
в структурах данных, исходная модель представляет собой граф из символических
тензоров, где слои играют роль соединяющих их ребер. Задавая входные и выход
ные сигналы новой модели в виде символических тензоров для исходной модели,
мы выделяем подграф исходного графа MobileNet. Этот подграф, становясь новой
моделью, содержит первые несколько (а именно, первые 87) слоев MobileNet, а по
следние шесть слоев отбрасываются. Последние несколько слоев глубокой сверточ
ной сети иногда называют ее
верхушкой
(head). А вызовом
tf.model()
мы произво
дим так называемое
усечение
(truncating) модели. В усеченной MobileNet остаются
слои выделения признаков, а верхушка отбрасывается. Почему верхушка содержит
1
Разница между формой обычного и формой символического тензора в том, что у первого
всегда полностью заданы измерения (например, [8, 32, 20]), в то время как измерения вто
рого определены не полностью (например, [null, null, 20]). Вы уже могли видеть подобное
в столбце Output shape (Форма выходного сигнала) сводок моделей.
204
Do'stlaringiz bilan baham: |