Лучше предварительно чиповать или случайно чиповать изображения для обучения Neural Net? - PullRequest
1 голос
/ 19 февраля 2020

Я начал немного углубляться в тренировку Tensorflow и Neural Net, уделяя особое внимание оптимизации времени выполнения и продолжая сталкиваться с проблемой поглощения данных.

Допустим, у меня есть 30 000 изображений 256x256, для которых я создал эффективный конвейер Tensorflow (включая предварительную выборку и параллельные вызовы данных), который случайным образом чипирует изображение до 64x64 пикселей и случайным образом переворачивает изображения в обоих направлениях. Таким образом, модель принимает тензоры формы (batchsize, 64, 64) и с помощью дополнения есть 30000 * ((256/64) ** 2) * 4 = 1 920 000 минимальных примеров. Минимум, потому что есть как минимум 16 уникальных чипов, но гораздо больше способов случайного чипирования всего изображения. 4 происходит из четырех возможных состояний переворачивания (То же, То же самое), (Перевёрнуто, Одинаково), (Пропущено, Перевёрнуто), (Перевёрнуто, Перевёрнуто).

У меня есть эта модель, распределенная по нескольким графическим процессорам, и поэтому размер пакета не ограничен доступной памятью, просто компромиссы с обобщением и то, насколько точной будет модель. В этом сценарии мне удалось пройти одну эпоху за ~ 35 секунд с размером пакета 128 (32 примера для каждого графического процессора).

Теперь давайте представим другой сценарий, в котором я предварительно обработал данные (детерминистически, то есть каждое изображение имеет 16 извлеченных непересекающихся чипов) и локально сохраняет чипы как изображения размером 64x64 пикселей. В этом случае я не делаю случайную выборку, но в остальном входной конвейер такой же. Количество отдельных файлов значительно увеличилось с 30 000 до 480 000, максимальное количество уникальных примеров равно минимальному количеству уникальных примеров из предыдущей настройки. Теперь, поскольку количество файлов увеличилось, для одного и того же размера пакета, этапы обучения значительно возросли. Даже если я удваиваю размер партии, тренировка теперь занимает 2-3 минуты на эпоху.

Мне любопытно, есть ли консенсус между этими двумя сценариями ios. В сценарии 1 я бы предположил, что мне нужно будет тренироваться дольше, чем в сценарии 2, но он также может потенциально избежать даже большего размера партии, поскольку данные обучения слегка меняются в каждую отдельную эпоху (таким образом, меньше беспокойства о том, что модель не обобщается) ,

В сценарии 2 я полагаю, что я мог бы уйти с тренировками для меньшего количества эпох за счет того, что отдельная эпоха занимает больше времени. Поскольку модель рассматривает каждый отдельный пример в каждую эпоху, существует реальный предел того, насколько большим я могу сделать размер партии, не делая модель беднее при обобщении.

Есть ли консенсус по поводу того, какой сценарий лучше? Кажется, что Сценарий 1 лучше почти во всех отношениях, но что-то продолжает настаивать на том, что я что-то упускаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...