1. ホーム
  2. ピトーチ

torch.nn.Conv1dと1次元畳み込みの説明

2022-02-28 03:13:53
<パス

最近、wavenetの作業をしていて、1次元畳み込みに出会ったので、次回の使用のために、1次元畳み込みとそのAPIをpytorchでまとめておきます。

私が初めて1次元畳み込みに出会ったとき、1次元畳み込みカーネルが1行で畳み込んでいるのだと思ったが、この理解は間違っていた。1次元畳み込みは、畳み込みカーネルが1次元であるということではなく、また畳み込まれる特徴量も1次元であるということでもない。1次元とは、畳み込みの方向が1次元であることを意味する。

まず、1次元畳み込みの簡単な例(バッチサイズが1で、カーネルが1つだけの場合)を見てみよう。

入力

長さ35のシーケンスで、シーケンスの各要素は256次元の特徴を持つので、入力は (35,256) と見なすことができる。
コンボリューションカーネル:size = (k,) , (k = 2)

この画像はデータが1つしかない場合のみで、データがバッチにまとめられている場合は、次のようにコードで表現することができます。

    from torch.autograd import Variable
    conv1 = nn.Conv1d(in_channels=256,out_channels = 100, kernel_size = 2)
    input = torch.randn(32, 35, 256)
    # batch_size x text_len x embedding_size -> batch_size x embedding_size x text_len
    input = input.permute(0, 2, 1)
    input = Variable(input)
    out = conv1(input)
    print(out.size())


出力します。

torch.Size([32, 100, 34])


この結果を分析する前に、nn.Conv1dの公式ドキュメントをご覧ください。

// This can be interpreted as the dimensionality of the features
in_channels - Number of channels in the input image 
// The number of channels produced by the convolution kernel
out_channels - Number of channels produced by the convolution
// Size of the convolution kernel, only the size of the convolution direction needs to be specified (since it is one-dimensional)
kernel_size - Size of the convolving kernel
stride - Stride of the convolution
padding - Zero-padding added to both sides of the input
dilation - Spacing between kernel elements
groups - Number of blocked connections from input channels to output channels
bias - If True, adds a learnable bias to the output


もう一度出力を見てみましょう:torch.Size([32, 100, 34])

入力データの最初の次元はバッチサイズ、次の2次元は前の例と同じ、違いは出力で、長さは34になり(畳み込みカーネルのサイズは2)、100個の畳み込みカーネルがあるので、100個の特徴マップが生成される

これは、nn.Conv1dが入力データの最後の次元に対して1次元の畳み込みを行うためである。畳み込み方向を正しく設定するためには,入力配列の長さの次元を最後に置く,つまりpermute関数を用いて1次元の畳み込みを実現する必要があります.