転置畳み込みの個人的理解(例としてpytorchを取り上げます)



Transposed Convolution Personal Understanding Take Pytorch



直感的な理解は、畳み込みの逆の操作です。たとえば、4 * 4の画像が3 * 3の畳み込みカーネルで畳み込まれ、s = 1、p = 0、および2 * 2サイズの画像が取得されます。デコンボリューションは入力を行うことです。 2 * 2の出力は4 * 4です。

pytorchで使用



クラスtorch.nn.ConvTranspose2d(in_channels、out_channels、kernel_size、stride = 1、padding = 0、output_padding = 0、groups = 1、bias = True、dilation = 1)

上記のストライド、パディングは、元の畳み込みのストライドとパディング用であることに注意してください。



といった

from torch import nn import torch upsample=nn.ConvTranspose2d(3,3,kernel_size=3,stride= 1,padding=0) in_=torch.randn(1,3,2,2) out_=upsample(in_) print(out_.size())

出力:torch.Size([1、3、4、4])

元の畳み込み式(xは入力サイズ、yは出力サイズ):



(x-k + 2 * p)/ s + 1 = y

デコンボリューション:

この時点で、xはデコンボリューションの出力として使用されます。 pytorchにはoutput_paddingパラメータがあるため、出力サイズは次のようになります。 別のoutput_paddingを追加します

デコンボリューションの実装原理は実際にはコンボリューションですが、出力のサイズを大きくするために、入力イメージにパディングが追加されます。

このパディングの追加には、元の畳み込みピクセル間の接続関係を維持するための注意が必要です。たとえば、直接畳み込み入力の左上のピクセルは出力の左上のピクセルにのみ寄与し、右上のピクセルは右上の出力ピクセルにのみ接続されます。これは参照できます https://blog.csdn.net/isMarvellous/article/details/80087705 理解

ストライドが1より大きい場合も同様ですが、上記の要件を満たすためにピクセル間にパディングを追加します。

from torch import nn import torch upsample=nn.ConvTranspose2d(3,3,kernel_size=3,stride= 2,padding=0) in_=torch.randn(1,3,2,2) out_=upsample(in_) print(out_.size())

出力torch.Size([1、3、5、5])

なぜそれは転置畳み込みと呼ばれるのですか?

これは、転置された畳み込みが、直接畳み込みと比較して、実際の計算プロセスで重み行列を転置し、次に左の乗算入力を転置するためです。

これが知識への答えです。 https://www.zhihu.com/question/43609045/answer/120266511