逆ボリュームの詳細


深く理解して反ボリュームというのを書きたかったのですが、後から考えると「C++に精通している」と書いたのと同じではないでしょうか.书き终わったら、何も书いていないようで、书きたいことがたくさんありますが、书くことができません...
まず、mxnetとpytorchのボリュームと逆ボリュームがどのように使われているかを見てみましょう.
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True)
torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, bias=True)

mxnet.gluon.nn.Conv2D(channels, kernel_size, strides=(1, 1), padding=(0, 0), dilation=(1, 1), groups=1, layout='NCHW', activation=None, use_bias=True, weight_initializer=None, bias_initializer='zeros', in_channels=0, **kwargs)
mxnet.gluon.nn.Conv2DTranspose(channels, kernel_size, strides=(1, 1), padding=(0, 0), output_padding=(0, 0), dilation=(1, 1), groups=1, layout='NCHW', activation=None, use_bias=True, weight_initializer=None, bias_initializer='zeros', in_channels=0, **kwargs)[source]

何というか、パラメータは基本的に同じですが、mxnetのメリットは、入力するchannelを指定せずに、最初のデータ入力を待ってから入力するチャネル数を特定できることです.他の文章の言い方を参考にします.
o=[(i+2 p-k)/s]+1(1)そのうち:O:output size i:input size p:padding size k:kernel size s:stride size[]は下取整演算
ここでは、アニメーションのデモを行います.https://github.com/vdumoulin/conv_arithmeticしかし、果たしてそうなのか、pytorchソースコードにはpytorch/aten/src/THNN/generic/spatialConvolutionMMが見られる.c(https://github.com/pytorch/pytorch/blob/04fe2453c450d51b3a611cdcd1e2661e1fdf2e44/aten/src/THNN/generic/SpatialConvolutionMM.c)54行目:
  int64_t outputHeight = div_rtn(exactInputHeight - kH, dH) + 1;
  int64_t outputWidth  = div_rtn(exactInputWidth - kW, dW) + 1;

ここでのpadding作業は前のステップで完了しており,確かに上記の式と対応している.
いくつかの原理解釈のリンクを添付します.https://blog.csdn.net/lanadeus/article/details/82534425(反畳み込み行列の説明)
実は中にはもう一つの目立たないパラメータがあります:group、ここのgroupの使い方もおかしいです:
inputs = torch.randn(1, 4, 5, 5)
weights = torch.randn(4, 2, 3, 3)
z = F.conv_transpose2d(inputs, weights, padding=0,groups =4)
print (z.shape)

ここは実際にpytorchのバックエンドで実現され、さらに下にはtorch.CはC言語のソースコードに解析され、ここでは実際に入力関数とこのレイヤパラメータの計算をしていますが、docには重みの出力channelの数値がinputs/groupsと書かれています.これはどういう意味ですか.
実はgroupsは、対応する入力チャネルと出力チャネル数をグループ化することを意味し、デフォルト値は1、つまりデフォルト出力入力のすべてのチャネルが1つずつである.たとえば、入力データサイズが90 x 100 x 100 x 32、チャネル数32で、3 x 3 x 48のボリュームを通過するには、groupのデフォルトは1であり、全接続のボリューム層である.
groupが2である場合、入力される32チャネルを2つの16チャネルに分割し、出力される48チャネルを2つの24チャネルに分割する.出力された2つの24のチャネルに対して、第1の24チャネルは入力された第1の16チャネルとフルボリューム化され、第2の24チャネルは入力された第2の16チャネルとフルボリューム化される.
極端な場合、入出力チャネル数は同じであり、例えば24であり、groupサイズも24であると、出力ボリュームコア毎に、入力に対応するチャネルのみがボリューム化される.
この考えは最初にAlexnetから来て、当時このようにしたのは実際には当時の顕存が限られていたためで、彼は2つのカードを計算して、当時ももっと良い並列ニューラルネットワークの枠組みがなくて、そこでこのようにして、それから別の論文の中で、この方法はあまり使いにくいと指摘して、そこでみんなはあまりこのパラメータに関心を持っていませんでした.いずれもデフォルト1で全ボリューム化されます.最近mxnetフレームワークが逆ボリュームでサンプリングされていることがわかり、groupは入力と一致しなければならない.