Часть III • Продвинутые возможности глубокого обучения с TensorFlow.js
6.2. Обучение моделей
с помощью model.fitDataset
Потоковый API
Dataset
очень удобен, и, как мы видели, позволяет выполнять до
вольно изящные операции над данными, но основная цель API
tf.data
— упрощение
подключения к модели источника данных для обучения и оценки работы модели.
Но как
tf.data
может помочь в этом?
Начиная с главы 2, мы всегда использовали для обучения модели API
model.fit()
.
Как вы помните, этот API принимает на входе два обязательных аргумента —
xs
и
ys
. Напомним также, что переменная
xs
должна быть тензором, представляющим
набор входных примеров данных. А переменная
ys
обязана быть тензором, пред
ставляющим соответствующий набор выходных целевых признаков. Например,
в листинге 5.11 мы обучали и подвергали тонкой настройке модель обнаружения
искусственных объектов с помощью таких вызовов:
model.fit(images, targets, modelFitArgs)
Здесь
images
по умолчанию представлял собой тензор ранга 4 формы
[2000,
224,
224,
3]
, соответствующий набору из 2000 изображений. Объект конфигурации
modelFitArgs
задает размер батча для оптимизатора, по умолчанию равный 128.
Как видим, TensorFlow.js получила набор из 2000 примеров данных в оператив
ной памяти
1
— весь массив данных, после чего прошла в цикле по этим данным по
128 примеров за раз на каждой эпохе.
Но что, если такого количества данных недостаточно и мы хотим обучить модель
на гораздо большем наборе данных? В этом случае у нас есть два отнюдь не идеаль
ных варианта. Вариант 1: попытаться загрузить этот намного больший массив данных
и посмотреть, что получится. Впрочем, рано или поздно TensorFlow.js не хватит опе
ративной памяти, и мы получим сообщение об ошибке, указывающее, что выделить
память для хранения обучающих данных не удалось. Вариант 2: загружать данные
в GPU отдельными порциями и вызывать
model.fit()
для каждой порции отдельно.
При этом нам придется самим координировать работу
model.fit()
, итеративно обучая
модель на частях обучающих данных по мере их готовности. Чтобы обучать модель
в течение более чем одной эпохи, придется возвращаться назад и заново загружать
эти порции в определенном (видимо, перетасованном) порядке. Подобная схема ра
боты не только представляется довольно громоздкой и подверженной ошибкам, но
и мешает выдаче библиотекой TensorFlow.js корректной информации о количестве
эпох и метриках, так что нам самим придется связывать эти показатели воедино.
TensorFlow.js предоставляет намного более удобный инструмент для этой задачи
в виде API
model.fitDataset()
:
model.fitDataset(dataset, modelFitDatasetArgs)
Первым аргументом
model.fitDataset
принимает объект
Dataset
, который должен
соответствовать определенному паттерну. А именно, этот объект
D
ata
set
должен
выдавать объекты, содержащие два свойства. Первое свойство —
xs
— типа
Tensor
,
1
Точнее, в памяти GPU, размер которой обычно еще меньше, чем RAM системы!
Do'stlaringiz bilan baham: |