Pytorch 0.4.0 による UNet のような CNN アーキテクチャを使用して画像セグメンテーションを行っています。最終的なセグメンテーション結果では、フォアグラウンドを 1、バックグラウンドを 0 としてマークします。事前にトレーニングされた VGG の特徴抽出器をエンコーダとして使用するため、エンコーダー出力を何度もアップサンプリングします。
kernel_size=3、stride=2、padding=1、output_padding=1
(output_padding は、たとえば、入力サイズが 40*30 のスキップ接続機能のサイズに合わせて使用されます。式:out=s(in-1) を使用した計算の下で、1 つのデコンボリューション レイヤーでサイズを 2 回拡大します。 +k-2p, サイズを維持するためにパディング 1 と出力パディング 1 を使用する必要があります。黒い格子を生成する理由が気になります.それらは格子状または正方形の部分のように見えます.そしてそれを解決する方法.さらに、すべての deconv レイヤーのハイパーパラメータを 1 つの均一に調整するか、個別に変更する必要がありますか?
環境:Ubuntu 16.04、Pytorch 0.4.0、GTX 1080Ti、アップサンプリングのアーキテクチャは3つのdeconvレイヤーで、次々と。
アップデート
deconv ハイパーパラメータを変更した後 (画像セグメンテーション結果のノイズに触発されて使用)
kernel_size=4、ストライド=2、パディング=1
したがって、出力パディングを回避し、サイズを満たすために.しかし、100エポックの後、私は同様の問題に遭遇しました.
さらに 30 エポックのトレーニングを行うと、次のようになります。
self.conv1=Basic(1024,512,kernel_size=3,stride=1,padding=1)
self.conv2=Basic(512,512,kernel_size=3,stride=1,padding=1)
self.deconv1=Basic(512,256,kernel_size=4,stride=2,conv=False,padding=1)
self.deconv2=Basic(256,128,kernel_size=4,stride=2,conv=False,padding=1)
self.deconv3=Basic(128,64,kernel_size=4,stride=2,conv=False,padding=1)
#output 480*640 segmap
self.conv4=Basic(64,2,kernel_size=1,stride=1)
# self.avgpool=nn.AvgPool2d(kernel_size=2,stride=2)
def forward(self, input):
input=self.conv1(input)
input=self.conv2(input)
input=self.deconv1(input)
input=self.deconv2(input)
input=self.deconv3(input)
input=self.conv4(input)
# print(input.shape)
#a channel-wise probability map
raw=input
return raw`