Использование Keras для предсказания видео (time series)
Я хочу предсказать следующий кадр (оттенки серого) видео, Данное N
предыдущие кадры-использование CNNs или RNNs в Keras. Большинство учебников и другая информация о предсказании временных рядов и Keras используют 1-мерный вход в своей сети, но мой будет 3D (N frames x rows x cols)
в настоящее время я действительно не уверен, какой хороший подход к этой проблеме будет. Мои идеи включают:
использование одного или нескольких слоев LSTM. Проблема в том, что я не уверен подходят ли они для получения серии изображений вместо серии скаляров в качестве входных данных. Разве потребление памяти не взорвется? Если их можно использовать: как я могу использовать их в Керасе для более высоких измерений?
использование 3D свертки на входе (стек предыдущих видеокадров). Это поднимает другие вопросы: Почему это поможет, когда я не делаю классификацию, а предсказание? Как я могу складывать слои таким образом, чтобы вход сети имел размеры
(N x cols x rows)
и вывода(1 x cols x rows)
?
Я довольно новичок в CNNs / RNNs и Keras и был бы признателен за любой намек в правильном направлении.
2 ответов
так что в принципе каждый подход имеет свои преимущества и недостатки. Давайте пройдем через те, которые вы предоставили, а затем другие, чтобы найти лучший подход:
-
LSTM
: среди их самых больших преимуществ-способность изучать долгосрочные шаблоны зависимостей в ваших данных. Они были разработаны для того, чтобы иметь возможность анализировать длинные последовательности, такие как, например, речь или текст. Это также может вызвать проблемы из-за числовых параметров, которые могут быть действительно высокими. Другой типичные рекуррентные сетевые архитектуры, такие какGRU
может преодолеть эти проблемы. Основным недостатком является то, что в их стандартной (последовательной реализации) невозможно разместить его на видеоданных по той же причине, почему плотные слои плохи для данных изображений - нагрузки временных и пространственных инвариантов должны быть изучены топологией, которая полностью не подходит для их эффективного улавливания. Смещение видео на пиксель вправо может полностью изменить выход вашего сеть.другая вещь, которая стоит упомянуть, это обучение
LSTM
считается похожим на поиск равновесия между двумя процессами соперничества-поиск хороших весов для A плотный-как выходные вычисления и поиск хорошей динамики внутренней памяти в последовательностях обработки. Нахождение этого равновесия может длиться очень долго, но как только его найдут - он обычно довольно стабилен и производит действительно хороший результаты. Conv3D
: среди их самых больших преимуществ можно легко найти способность улавливать пространственные и временные инварианты так же, какConv2D
в случае съемки. Это делает проклятие размерности гораздо менее вредным. С другой стороны - так же, какConv1D
может не дать хороших результатов с более длинными последовательностями-точно так же-отсутствие памяти может затруднить изучение длинной последовательности.
Of конечно, можно использовать различные подходы, такие как:
TimeDistributed + Conv2D
использованиеTimeDistributed
обертка-можно использовать некоторые pretrained convnet, например,Inception
framewise, а затем последовательно анализировать карты объектов. Действительно огромным преимуществом такого подхода является возможность трансфертного обучения. Как недостаток-можно думать об этом какConv2.5D
- ему не хватает временного анализа данных.ConvLSTM
: эта архитектура еще не поддерживается новейшей версиейKeras
(на 6 марта 2017), но, как можно видеть здесь это должно быть предусмотрено в будущем. Это смесьLSTM
иConv2D
и это belived, чтобы быть лучше, чем укладкаConv2D
иLSTM
.
конечно, это не единственный способ решить эту проблему, я упомяну еще один, который может быть полезным:
- штабелировать: одно может легко штабелировать верхние методы для построения их окончательное решение. Е. Г. можно построить сеть, где в начале видео преобразуется с помощью
TimeDistributed(ResNet)
тогда выход-подача вConv3D
с множественным и агрессивным пространственным объединением и, наконец, преобразованнымGRU/LSTM
слой.
PS:
еще одна вещь, которая также стоит упомянуть, что форма видеоданных на самом деле 4D
С (frames, width, height, channels
).
PS2:
в случае, если ваш данные на самом деле 3D
С (frames, width, hieght)
вы действительно можете использовать классический Conv2D
(путем изменения channels
to frames
) для анализа этих данных (которые на самом деле могут быть более вычислительно эффективными). В случае передача обучения вы должны добавить дополнительное измерение, потому что большая часть CNN
модели были обучены на данных с формой (width, height, 3)
. Можно заметить, что ваши данные не имеют 3 канала. В этом случае обычно используется метод повторения пространственной Матрицы три раз.
PS3:
пример 2.5D
подход:
input = Input(shape=input_shape)
base_cnn_model = InceptionV3(include_top=False, ..)
temporal_analysis = TimeDistributed(base_cnn_model)(input)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(temporal_analysis)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(conv3d_analysis)
output = Flatten()(conv3d_analysis)
output = Dense(nb_of_classes, activation="softmax")(output)
проведя много исследований, я наконец наткнулся на Keras Пример на ConvLSTM2D
слой (уже упоминавшийся Марчин Możejko), который делает именно то, что мне нужно.
в текущей версии Keras (v1.2.2), Этот слой уже включен и может быть импортирован с помощью
from keras.layers.convolutional_recurrent import ConvLSTM2D
чтобы использовать этот слой, видеоданные должны быть отформатированы следующим образом:
[nb_samples, nb_frames, width, height, channels] # if using dim_ordering = 'tf'
[nb_samples, nb_frames, channels, width, height] # if using dim_ordering = 'th'