KerasのCNNまたはRNNを使用して、N
前のフレームが与えられた(グレースケール)ビデオの次のフレームを予測したい。時系列予測およびKerasに関するほとんどのチュートリアルおよびその他の情報は、ネットワークで1次元の入力を使用しますが、私の場合は3D (N frames x rows x cols)
私は現在、この問題に対する優れたアプローチがどのようなものになるか本当に確信が持てません。私のアイデアは次のとおりです。
1つ以上のLSTMレイヤーを使用します。ここでの問題は、入力として一連のスカラーではなく一連の画像を撮影するのに適しているかどうかわからないことです。メモリ消費は爆発しませんか?それらを使用してもよい場合:Kerasで高次元に使用するにはどうすればよいですか?
入力(前のビデオフレームのスタック)で3D畳み込みを使用します。これは他の質問を提起します:分類ではなく予測を行うときにこれが役立つのはなぜですか?ネットワークの入力が(N x cols x rows)
および出力(1 x cols x rows)
の次元を持つようにレイヤーをスタックするにはどうすればよいですか?
私はCNN/RNNとKerasにかなり慣れていないので、正しい方向へのヒントをいただければ幸いです。
したがって、基本的にすべてのアプローチには長所と短所があります。あなたが提供したものとそれから他のものを徹底的に調べて、最良のアプローチを見つけましょう:
LSTM
:最大の利点の1つは、データの長期的な依存パターンを学習できることです。それらは、例えば、のような長いシーケンスを分析できるように設計されました。音声またはテキスト。これは、パラメータが非常に大きくなる可能性があるため、問題を引き起こす可能性もあります。 GRU
のような他の典型的なリカレントネットワークアーキテクチャは、この問題を克服するかもしれません。主な欠点は、標準(シーケンシャル実装)では、画像データに密なレイヤーが悪い理由と同じ理由でビデオデータに適合できないことです。時間と空間の不変性の負荷は、完全にトポロジによって学習する必要があります。効率的な方法でそれらをキャッチするのには適していません。ビデオをピクセル単位で右にシフトすると、ネットワークの出力が完全に変化する場合があります。
言及する価値のある他のことは、トレーニングLSTM
が2つのライバルプロセス間の均衡を見つけることに似ていると信じられていることです。dense-like出力計算の良い重みを見つけ、処理シーケンスにおける内部メモリの動的。この平衡状態を見つけることは非常に長い間続くかもしれませんが、いったん見つかると、通常は非常に安定しており、本当に良い結果を生み出します。
_Conv3D
_:最大の利点の中で、画像の場合の_Conv2D
_と同じ方法で空間的および時間的不変性をキャッチする機能を簡単に見つけることができます。これにより、次元の呪いの害がはるかに少なくなります。一方、_Conv1D
_と同じ方法では、長いシーケンスでは良い結果が得られない可能性があります-同じ方法で、メモリが不足すると、長いシーケンスの学習が難しくなります。
もちろん、次のようなさまざまなアプローチを使用できます。
_TimeDistributed + Conv2D
_:TimeDistributed
ラッパーを使用-例えば、事前に訓練されたconvnetを使用できます。 Inception
フレーム単位で、機能マップを順番に分析します。このアプローチの非常に大きな利点は、転移学習の可能性です。欠点として-_Conv2.5D
_と考える人もいるかもしれませんが、データの一時的な分析が欠けています。
ConvLSTM
:このアーキテクチャはKeras
の最新バージョン(2017年3月6日)ではまだサポートされていませんが、 here を参照してください。 。これはLSTM
と_Conv2D
_の混合であり、_Conv2D
_とLSTM
をスタックするよりも優れていると信じられています。
もちろん、これらはこの問題を解決する唯一の方法ではありません。もう1つ、役に立つかもしれません。
TimeDistributed(ResNet)
を使用してビデオを変換し、複数の積極的な空間プーリングで_Conv3D
_に出力し、最終的に_GRU/LSTM
_レイヤーで変換するネットワークを構築できます。PS:
言及する価値があるもう1つのことは、ビデオデータの形状が実際に_4D
_と_(frames, width, height, channels
_であることです。
PS2:
データが実際に_3D
_と_(frames, width, hieght)
_である場合、実際に古典的な_Conv2D
_を使用して(channels
をframes
に変更して)このデータを分析できます。 (実際には、より計算的に効果的かもしれません)。 転送学習の場合、ほとんどのCNN
モデルは形状_(width, height, 3)
_のデータでトレーニングされているため、ディメンションを追加する必要があります。データに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)
_
多くの研究を行った後、私は最終的にConvLSTM2D
レイヤー(既にMarcinMoż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'