250
Часть III • Продвинутые возможности глубокого обучения с TensorFlow.js
Листинг 6.4.
Разбиение на обучающий/контрольный наборы данных с помощью tf.data.Dataset
В этом листинге важно обратить внимание на следующее. Чтобы распределить
примеры данных случайным образом по обучающему и контрольному наборам, мы
сначала перетасовываем данные. Первые
N
примеров берем в качестве обучающих
данных. А для получения контрольных данных пропускаем эти
N
примеров и берем
остальные. Очень важно перетасовывать данные
одинаково
при выборке, чтобы один
и тот же пример данных не оказался в обоих множествах; поэтому при выборке из
обоих конвейеров используется одинаковое начальное значение для перетасовки.
Важно также отметить, что функция
map()
применяется
после
операции
skip
.
Вызвать
.map(preprocessFn)
можно и до
skip
, но при этом
preprocessFn
будет вы
полняться и для отброшенных примеров данных — пустая трата вычислительных
ресурсов. Проверить, что все происходит именно так, можно с помощью кода из
листинга 6.5.
Листинг 6.5.
Иллюстрация взаимодействия skip() и map() для Dataset.forEach
Глава 6. Работа с данными
251
Еще один распространенный сценарий использования
dataset.map()
— нор
мализация входных данных. Например, легко представить себе сценарий, в кото
ром может пригодиться нормализация данных до нулевого среднего значения, но
число входных примеров данных бесконечно. Для вычитания среднего значения
необходимо сначала вычислить математическое ожидание распределения, но как
вычислить среднее значение бесконечного множества? Можно было бы рассчитать
среднее значение репрезентативной выборки из этого распределения, но, если взять
выборку неправильного размера, легко допустить ошибку. Например, представьте
себе распределение, почти все значения которого равны 0 и лишь значение каждого
десятимиллионного примера данных равно 10
9
. Математическое ожидание такого
распределения равно 100, но, если вычислить среднее значение первого миллиона
примеров данных, результат получится совершенно неправильный.
Можно выполнить потоковую нормализацию с помощью API
Dataset
следу
ющим образом (листинг 6.6). В листинге подсчитывается скользящий итог числа
просмотренных примеров данных, а также их скользящая сумма. Благодаря этому
возможна потоковая нормализация. Здесь мы работаем со скалярными значениями,
не тензорами, но структура версии для тензоров будет выглядеть аналогично.
Листинг 6.6.
Потоковая нормализация с помощью метода tf.data.map()
Обратите внимание, что мы создаем новую функцию отображения, использу
ющую собственные копии счетчика и накопителя элементов. Благодаря этому мож
но нормализовать несколько наборов данных одновременно. В противном случае
оба объекта
Dataset
подсчитывали бы вызовы и суммы с помощью одних и тех же
переменных. У этого решения есть свои ограничения, из которых особенно стоит
отметить опасность арифметического переполнения переменных
samplesSoFar
и
sumSoFar
, так что осторожность здесь не помешает.
252
Do'stlaringiz bilan baham: |