Комментарии 14
Что-то так и не понял, что идет на вход сети и что получается на выходе :(
Сначала сеть учат, то есть прогоняют через неё кадр, смотрят, что получается на выходе, а другая система оценивает, хорошо или плохо и насколько, в зависимости от этого изменяется сама сеть, цены шага к отдельным нодам сети, что-то вроде того. Потом кадры прогоняют уже через обученную сеть, выход которой не оценивается, а записывается. Как-то так.
Если почитать работу, то на входе серия из 12 цветных кадров 256х114 (~1М значений), на выходе — представление в виде массива 200х12, по 200 значений на кадр, из которого обратно реконструируются кадры.
Используются свёртки 5x5 в количестве 80, 160, 320 и 640 штук соответственно на каждый слой, т.е. общее количество вещественных коэффициентов натренированной сети составляет около 30к.
Почему 256х114: а больше в память GPU не влазило и считалось долго.
Главный вопрос: зачем? Для компрессии, например, алгоритм не подходит. 256х114х3 — это 85кб на кадр, 200 значений — это либо 800 байт, либо 1600 байт (float/double), которые, по идее, нельзя больше сжать. Современные кодеки жмут сильно лучше.
Используются свёртки 5x5 в количестве 80, 160, 320 и 640 штук соответственно на каждый слой, т.е. общее количество вещественных коэффициентов натренированной сети составляет около 30к.
Почему 256х114: а больше в память GPU не влазило и считалось долго.
Главный вопрос: зачем? Для компрессии, например, алгоритм не подходит. 256х114х3 — это 85кб на кадр, 200 значений — это либо 800 байт, либо 1600 байт (float/double), которые, по идее, нельзя больше сжать. Современные кодеки жмут сильно лучше.
> Современные кодеки жмут сильно лучше.
Тут нужно сделать оговорку, что «сильно лучше» если мы говорим о среднестатистических видеоданных, когда дельта между кадрами невелика. Если же мы возьмем любой фильм, разобьем на отдельные кадры, перемешаем их и сошьем обратно в случайном порядке, то современные кодеки на таких данных покажут результат не лучше, а, возможно, и хуже, чем подобная нейронная сеть.
Саму сеть нужно улучшать, подавая на вход не отдельные кадры, а последовательность, тогда её можно обучить «понимать» дельты кадров. И вот тогда она станет куда более похожей на «современные кодеки».
А в том виде, как эта сеть реализована здесь, при её сравнении с современными кодеками получается сравнение пальца с дудкой.
Тут нужно сделать оговорку, что «сильно лучше» если мы говорим о среднестатистических видеоданных, когда дельта между кадрами невелика. Если же мы возьмем любой фильм, разобьем на отдельные кадры, перемешаем их и сошьем обратно в случайном порядке, то современные кодеки на таких данных покажут результат не лучше, а, возможно, и хуже, чем подобная нейронная сеть.
Саму сеть нужно улучшать, подавая на вход не отдельные кадры, а последовательность, тогда её можно обучить «понимать» дельты кадров. И вот тогда она станет куда более похожей на «современные кодеки».
А в том виде, как эта сеть реализована здесь, при её сравнении с современными кодеками получается сравнение пальца с дудкой.
Так на вход нейросети как раз и подаются последовательности кадров (12 кадров), а не отдельные кадры.
Из статьи не совсем ясно, что подразумевается под «пакетом» из 12 кадров, и как они подаются на сенсорный слой. Нужно лезть в код.
Было бы логично, если бы подавались последовательные кадры. Какой смысл подавать 12 разных кадров?
А код вызывает очень много вопросов. Например, вот кусок кода обучения:
Фактически, есть набор PNG-файлов, которые обрабатываются блоками, длина которых определена в конфиге. Проблема в том, что порядок выдачи файлов функцией glob не определён.
А код функции run ещё более странный:
Отсортировали по порядку (почему не сделали этого при обучении?), затем зачем-то перемешали.
А код вызывает очень много вопросов. Например, вот кусок кода обучения:
data = glob(os.path.join("./datasets", config.dataset, "*.png"))
batch_idxs = min(len(data), config.train_size)/config.batch_size
for idx in xrange(0, batch_idxs):
batch_files = data[idx*config.batch_size:(idx+1)*config.batch_size]
Фактически, есть набор PNG-файлов, которые обрабатываются блоками, длина которых определена в конфиге. Проблема в том, что порядок выдачи файлов функцией glob не определён.
А код функции run ещё более странный:
data = sorted(glob(os.path.join("./datasets", config.dataset, "*.png")), key=numericalSort)
shuffle(data)
Отсортировали по порядку (почему не сделали этого при обучении?), затем зачем-то перемешали.
Пакет — batch из mini-batch gradient descent. Перемешивается это все потому, что обучается на отдельных кадрах. Никакого взаимодействия между кадрами там нет. Поэтому собирать один batch из соседних кадров будет скорее вредно, чем полезно.
На входе картинка, на выходе картинка, но в процессе обработки она сжимается до очень небольшого количества чисел, в этом случае 200. Задача сети состоит в том, чтобы сначала закодировать картинку в небольшой массив, а потом раскодировать эту же картинку из набора чисел. Весь фильм он обработал покадрово такой сетью, потом склеил назад в видео.
Да, уже понял… тогда не понятно этого восторга… ни на чем кроме Бегущего по лезвию оно нормально не отработало....
«Статичные и высококонтрастные сцены, мало меняющиеся со временем, реконструированы очень хорошо. Это оттого, что, по сути, модель «видела» один и тот же кадр гораздо чаще, чем просто 6 тренировочных эпох. Это можно рассматривать как избыток данных, но поскольку набор тренировочных данных намеренно искажён, об этом не стоит волноваться.»
Можно регулировать обучение анализируя степень изменения в кадрах и организуя обратную связь для показа кадров сети — статичные кадры сеть будет видеть реже а нестатичные — чаще.
Можно регулировать обучение анализируя степень изменения в кадрах и организуя обратную связь для показа кадров сети — статичные кадры сеть будет видеть реже а нестатичные — чаще.
Тоже пару лет назад, когда только начал изучать нейронные сети поставил сетку из 240 нейронов изучать фотку моей девушки. Уходили на работу и поставил её на 8 часов учиться. Возвращаемся, а на неё с экрана смотрит она только примерно такая как на тех картинках из статьи. В общем она на меня посмотрела немного очумевши и попросила больше так не делать. :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Автокодируем «Бегущего по лезвию»