1. ホーム
  2. ディープラーニング

Conv2d関数詳細説明(Pytorch)

2022-02-28 10:01:16
<パス <ブロッククオート

この記事は、PytorchフレームワークのAPIであるConv2d()に基づいています。この関数は2次元入力で使用されますが、1次元入力のConv1d()、3次元入力のConv3d()もあります。Conv2d()のパラメータは以下の通りです。

I. パラメータの紹介

 def __init__(
        self,
        in_channels: int,
        out_channels: int,
        kernel_size: _size_2_t,
        stride: _size_2_t = 1,
        padding: _size_2_t = 0,
        dilation: _size_2_t = 1,
        groups: int = 1,
        bias: bool = True,
        padding_mode: str = 'zeros' # TODO: refine this type
    ):


  • in_channels: ネットワーク入力のためのチャンネル数。
  • out_channels: ネットワーク出力のチャンネル数。
  • kernel_size: 畳み込みカーネルのサイズ、このパラメータが整数qの場合、畳み込みカーネルのサイズはqXqとなる。
  • stride: ステップサイズ。コンボリューション処理で移動するステップサイズである。一般にコンボリューションカーネルは,入力画像の左から右,上から下へと移動する.パラメータが整数の場合,水平方向,垂直方向ともにその整数がデフォルトとなる。stride=(2, 1)の場合、2は高さ(h)を2段階、1は幅(w)を1段階移動させることを意味する。
  • padding: パディング、デフォルトは0パディング。
  • dilation: 拡張。一般に、畳み込みカーネルと入力画像の対応する位置との間の計算は同じ大きさ、つまり、畳み込みカーネルの大きさが3X3であれば、それが一度に入力画像に作用する範囲は3X3であり、この場合、dilation=0となる。 dilation=1だと、下図のようなケースを意味する。
  • groups:グループ化。のグループ分けを指す。 入力チャネル groups=1の場合、入力は1つのグループ、出力は1つのグループとなります。groups=2の場合、入力は2つのグループに分けられ、対応する出力も2つのグループに分けられる。また、in_channelsとout_channelsはgroupsで割り切れる必要があることに注意してください。
  • bias: biasパラメータ。bool型で、bias=Trueのとき、後方フィードバックで学習されたパラメータbが適用されることを意味する。
  • padding_mode: パディングモード、padding_mode='zeros' はパディングが0であることを意味する。

次に、これらのパラメータを調整することで、感触を確かめます。
1. 結果 1

import torch
import torch.nn as nn

# The input is a vector with N=20, C=16, H=50, W=100
m = nn.Conv2d(16, 33, 3, stride=2)
input = torch.randn(20, 16, 50, 100)
output = m(input)

print(output.size())



  • nn.Conv2d()の第1引数は、入力のチャンネル数(16)と同じにすること。nn.Conv2d()の第2引数は出力のチャンネル数を表します. 出力は、N=20はそのまま、C=33となります。50X100 の入力は、ステップサイズ 2 の 3X3 コンボリューションカーネルによって 24X49 になります。
torch.Size([20, 33, 24, 49])


2. 結果 2

import torch
import torch.nn as nn

m = nn.Conv2d(16, 33, 3, stride=(1, 2))
input = torch.randn(20, 16, 50, 100)
output = m(input)

print(output.size())



-前のステップのstride=2はstride=(2, 2)を意味するが、ここではstride=(1, 2)を追加して、右へのステップを1、下へのステップを2とする。 出力は次のようになる。

torch.Size([20, 33, 48, 49])


3. 結果 3

import torch
import torch.nn as nn

m = nn.Conv2d(16, 33, (3, 5), stride=2, padding=(4, 2))
input = torch.randn(20, 16, 50, 100)
output = m(input)

print(output.size())



  • ここではpadding=(4, 2)を付けていますが、これは左右方向に4ターン、上下方向に2ターンの0パディングを意味し、58X104の入力に相当します(元の入力は50X100です)。
torch.Size([20, 33, 28, 50])


III. 概要
Conv2d()は畳み込みニューラルネットワークの演算関数で、この関数のパラメータを理解することがCNNをうまく使うためのポイントになります。