Как обучать нейронную сеть по одной картинке за раз?

Недавно начал изучать Tensorflow ради интереса. Во всех примерах, которые я встречал, сетке скармливают целый датасет из 40к+ изображений для тренировки. Далее тестируют. Но мне стало интересно вот что. Допустим, я хочу научить сетку определять символы, для которых нет огромного датасета (я придумал собственные иероглифы). И собираюсь делать это так: в специальном окошке рисую свой символ, и говорю сетке, какой именно это символ. И так сотни тысяч раз, по одной картинке за раз.
Так как я еще не очень понимаю всю эту систему с нейронными сетями и Tensorflow, хотелось бы узнать следующее:
1) получится ли обучать нейронную сеть, скармливая ей по одной картинке, а не целый датасет? И как это примерно реализовать?
2) как именно скармливать сетке 1 картинку? Формировать датасет из 1 картинки?
  • Вопрос задан
  • 780 просмотров
Пригласить эксперта
Ответы на вопрос 5
origami1024
@origami1024
went out for a night walk
Обучение и происходит по одной картинке.
То есть если размер партии = 1 картинка, то после просмотра 1 картинки полученные ошибки сразу запускают в backprop, чтобы изменить весы сети.
Если размер партии 10, то картинки просматриваются, но ошибка суммируется отдельно, и отдается в backprop только в конце. То есть твоя сеть смотрит 10 картинок не обучаясь, но потом суммарная ошибка применяется.
Главная причина, почему второй вариант применяется чаще - потому что рассчитывать backprop на сотне миллионов весов это затратная операция и при batch=10 ты сокращаешь время в 10 раз. При этом кол-во выученой инфы сокращается незначительно.
Ответ написан
Комментировать
@pi-null-mezon
При такой постановке вопроса, уже понятно, что ничего хорошего не получится. Хотя, формально ответы такие:
1) да
2) да
Но, повторю, так делать НЕ надо (сеть либо переобучится, либо не будет никакой сходимости функции потерь, в обоих случаях сеть превратится в бесполезный генератор псевдослучайных чисел). А что тогда делать? Хорошо бы точно определиться с задачей. Насколько я понял, речь о самой простой классификации (у нас есть M классов (твоих иероглифов) и каждая картинка принадлежит только одному из них). Это так называемая multi-label classification. Если так, то обучать лучше минибатчами (это набор из нескольких картинок). Минибатчи формируются путём случайного отбора примеров из обучающей выборки. Тонкостей и здесь довольно много. Например, минибатчи лучше делать несмещёнными (т.е. отбирать примеры так, чтобы метки всех классов были представлены в минибатче в одинаковом количестве). Если обучающих данных мало (1 пример на один класс это конечно вообще не для нейронных сетей задача, но тем не менее...), то данные дополняют искусственно. Можно случайный шум к картинке добавлять, поворачивать её немного, масштабировать, смещать параллельным переносом, цвет менять и ещё разные искусственные преобразования делать (см. https://github.com/albu/albumentations ).
Ответ написан
Комментировать
@grinat
Сиамские нейросети. Там по моему как раз таки все примеры на иероглифах.
Ответ написан
Комментировать
adugin
@adugin Куратор тега Python
1) Да, но это будет медленнее. См. ответ на п.2
2) Точно так же, как и батч из N картинок, но для случая N=1. Грубо говоря, массив [img] из 1 картинки. Допустим, картинка img - это np.array размера (Y, X, D). Тогда сети надо подать img[np.newaxis, ...], что даст np.array размера (1, Y, X, D).
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Можно насоздавать изображения из одного растр-объекта (символа) динамически:
1.Вращение в 3D
2. Деформация в 3D.
3. Фильтры ("шум", размытие, пиксиализация и т.п.)
X. Комбинации всех предыдущих пунктов.
НО! обязательно с сохранением топологии объекта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы