pytorch padding='SAME'解決方法
1695 ワード
tensorflowのconv 2にはpadding="SAME"というパラメータがあります.オ氏は、padding=(f-1)/2(fはボリュームコアサイズ)の場合、SAME戦略だと講義した.しかし、これは空洞の積み重ねを考慮していないし、stridesの場合も考慮していない.資料を調べてみると、ネット上の方法が面倒だと気づきました.手算、実験して1つの朝、ついに初歩的に問題を解決しました.2つのステップに分けられます.
どれくらい埋めるか
中国語ドキュメントに計算式があります.入力:(N,C i n,H i n,W i n)(N,C_in,H_in,W_in)(N,Cin,Hin,Win)出力:(N,C o u t,H o u t,W o u t)(N,C_out,H_out,W_out)(N,Co ut,Hout,Wout)H o u t=(H i n−1)s t r i d e[0]−2 p a d i n g[0]+k e r n s s i i i i s s i i d d d d[0]+k e n n n n s s i i i i i d d d e[0]+k e r n n n s s s i i i i i s s s i i i i z e[0]+o u t p u t p a d i n g[0] H_{out}=(H_{in}-1)stride[0]-2padding[0]+kernel_size[0]+output_padding[0] Hout=(Hin−1)stride[0]−2padding[0]+kernelsize[0]+outputpadding[0]
W o u t = ( W i n − 1 ) s t r i d e [ 1 ] − 2 p a d d i n g [ 1 ] + k e r n e l s i z e [ 1 ] + o u t p u t p a d d i n g [ 1 ] W_{out}=(W_{in}-1)stride[1]-2padding[1]+kernel_size[1]+output_padding[1]Wout=(Win−1)stride[1]−2 padding[1]+kernels ize[1]+outputp adding[1]ボリューム後のピクチャサイズがボリューム前となるため、ここでW_out=W_in, H_out=H_in.一元一次方程式を解くとよい.結果はceilを取ります.
どのように充填するか
torchは先に充填してからボリューム化します.conv 2 dのポリシーはこうです.そこでforwardで上記の方程式に必要なパラメータを取得します.それからtorchを使います.nn.functional.pad充填すればいいです.そして
2つの発見があります padは対称な両辺が充填するので、上記合計2行/列 を充填する.パラメータのpadding=(1,0)の効果は、F.pad(t 2,(0,0,1,1)の効果と同じです.F.pad(t 2,1,1,0,0)と同じ効果ではありません.不思議です.本来(1,0)は解視で1がH辺(左右)である.0はW辺(上下)です.(0,0,1,1)解釈では左右を埋めず、上下を埋めます.結果は正反対だった.
これで大丈夫だと思います.その後,逆ボリューム化とプール化のpooling=’SAME’がどのように実現されるかを見る必要がある.
どれくらい埋めるか
中国語ドキュメントに計算式があります.入力:(N,C i n,H i n,W i n)(N,C_in,H_in,W_in)(N,Cin,Hin,Win)出力:(N,C o u t,H o u t,W o u t)(N,C_out,H_out,W_out)(N,Co ut,Hout,Wout)H o u t=(H i n−1)s t r i d e[0]−2 p a d i n g[0]+k e r n s s i i i i s s i i d d d d[0]+k e n n n n s s i i i i i d d d e[0]+k e r n n n s s s i i i i i s s s i i i i z e[0]+o u t p u t p a d i n g[0] H_{out}=(H_{in}-1)stride[0]-2padding[0]+kernel_size[0]+output_padding[0] Hout=(Hin−1)stride[0]−2padding[0]+kernelsize[0]+outputpadding[0]
W o u t = ( W i n − 1 ) s t r i d e [ 1 ] − 2 p a d d i n g [ 1 ] + k e r n e l s i z e [ 1 ] + o u t p u t p a d d i n g [ 1 ] W_{out}=(W_{in}-1)stride[1]-2padding[1]+kernel_size[1]+output_padding[1]Wout=(Win−1)stride[1]−2 padding[1]+kernels ize[1]+outputp adding[1]ボリューム後のピクチャサイズがボリューム前となるため、ここでW_out=W_in, H_out=H_in.一元一次方程式を解くとよい.結果はceilを取ります.
どのように充填するか
torchは先に充填してからボリューム化します.conv 2 dのポリシーはこうです.そこでforwardで上記の方程式に必要なパラメータを取得します.それからtorchを使います.nn.functional.pad充填すればいいです.そして
t2=torch.randn([1,1,4,4])
print(t2.size())
m1 = torch.nn.Conv2d(1, 1, 1, padding=(1,0))
print(m1(t2).size())
t2=F.pad(t2,(0,0,1,1))
print(t2.size())
2つの発見があります
これで大丈夫だと思います.その後,逆ボリューム化とプール化のpooling=’SAME’がどのように実現されるかを見る必要がある.