最初の投稿で 2D コンボリューションから始めたのは、コンボリューションがコンピューター ビジョンの分野で成功し、大きな人気を得たからです。 この分野のタスクは画像を入力として使用し、自然画像は通常 2 つの空間次元(高さと幅)に沿ったパターンを持っているので、1D および 3D コンボリューションよりも 2D コンボリューションの例を見るのが一般的です。 この領域のタスクは入力としてテキストを使用し、テキストは単一の空間次元(すなわち時間)に沿ったパターンを持つので、1D Convolutions は非常に適しています。 LSTMやGRUといった従来のリカレントニューラルネットワーク(RNN)の代わりとして、より効率的に使用することができるのです。 RNNとは異なり、1D Convolutionsは並列に実行することができ、非常に高速な計算が可能です。
1Dコンボリューションから恩恵を受ける別の領域は、時系列モデリングです。 前述したように、入力データには1つの空間次元(すなわち時間)があり、一定期間のパターンをピックアップしたいのです。 このようなデータは、値の並びとして見ることができるので、よく「シーケンシャル」と呼ばれる。 また、空間的な次元を「時間的」な次元と呼ぶことが多い。 RNNの前に1次元コンボリューションを使うのもよくあることで、LSTNetモデルはその一例で、交通予測のための予測は以下の通りです。
A, B, C. (1,3,3) dot (2,0,1) = 5.
名前付けがわかったところで、計算を詳しく見ていきましょう。 幸運なことに、1次元畳み込みは実際には2次元畳み込みの簡略版に過ぎないからです!
1つの出力値の計算を通して、サイズ3のカーネルを入力配列の左側の等しいサイズの領域に適用することができます。 入力領域とカーネルの「ドットプロダクト」を計算します。これは単に要素ごとの積(つまり、色のペアを掛ける)であり、単一の値を得るために全体の和が続きます。 つまり、この場合、
(1*2) + (3*0) + (3*1) = 5
入力配列の他の領域にも同じ操作(同じカーネル)を適用し、(5,6,7,2) の出力配列を得られます。 カーネルを 2 方向にスライドさせる 2D 畳み込みとは異なり、1D 畳み込みではカーネルを 1 方向にのみスライドさせます (この図では左/右)。 カーネルの形状を 3 と定義し、この例では単一のカーネルを使用するため、channels=1
.
import mxnet as mxconv = mx.gluon.nn.Conv1D(channels=1,
kernel_size=3)
これで、定義済みのカーネルを使用して、conv
ブロックに入力を渡すことができるようになりました。
input_data = mx.nd.array((1,3,3,0,1,2))
kernel = mx.nd.array((2,0,1))# see appendix for definition of `apply_conv`
output_data = apply_conv(input_data, kernel, conv)
print(output_data)# ]]
# <NDArray 1x1x4 @cpu(0)>
パディング、ストライド、ダイレーションで何が変わるか?
前回の2D Convolutionsの投稿でパディング、ストライド、ダイレーションの効果を見ましたが、1D Convolutionsでも非常によく似ています。 パディングでは、今回は1つの次元(時間的次元)に沿ってのみパディングします。 この図は横軸に時間を表しているので、入力データの左と右にパディングする(2次元畳み込みの例のように上と下にはしない)。 また、StrideとDilationについても、時間軸に沿ってのみ適用する。 つまり、パディングとストライドの例は次のようになります:
コード中に2つの追加引数を追加する。 padding=1
と strides=2
です。
conv = mx.gluon.nn.Conv1D(channels=1, kernel_size=3,
padding=1, strides=2)output_data = apply_conv(input_data, kernel, conv)
print(output_data)# ]]
# <NDArray 1x1x3 @cpu(0)>
Advanced: 入力データの次元はレイアウトと呼ばれる特定の順序に従わなければなりません。 デフォルトでは1次元の畳み込みは’NCW’、すなわちバッチサイズ (N) * チャンネル (C) * 幅/時間 (W) のフォーマットの入力データに適用されることを想定しています。 そして、2次元コンボリューションのデフォルトはNCHW、すなわち、バッチサイズ (N) * チャンネル (C) * 高さ (H) * 幅 (W)です。
Conv1D
とConv2D
.
の layout
引数をチェックしてください。