5

在此处输入图像描述我正在使用 Pytorch 0.4.0 使用类似 UNet 的 CNN 架构进行图像分割。它在最终分割结果中将前景标记为 1,背景标记为 0。我使用预训练的 VGG 特征提取器作为我的编码器,所以我需要多次对编码器输出进行上采样。但结果显示结果中有一个奇怪的格子部分,如下所示:

我怀疑这些不同形状的黑色部分是由反卷积层引起的。官方文档中说反卷积层在输入像素之间添加(s-1)零。反卷积层的超参数如下所示:

kernel_size=3,stride=2,padding=1,output_padding=1

(output_padding 用于拟合跳跃连接特征大小,例如,输入大小为 40*30,我希望它在一个反卷积层中放大两倍,根据我的计算公式:out=s(in-1) +k-2p,我必须使用 padding 1 和 output-padding 1 来保持大小,否则可能有其他更好的选择我不知道。)

我想知道生成黑色格子的原因。它们看起来像网格或正方形部分。以及如何解决它。此外,我需要将所有反卷积层超参数调整为一个统一或单独修改它们?

环境:Ubuntu 16.04,Pytorch 0.4.0,GTX 1080Ti,上采样的架构是三层deconv,一层一层。

更新

在我修改了 deconv 超参数之后,(受图像分割结果使用中的噪声启发

kernel_size=4,stride=2,padding=1

从而避免输出填充并满足大小。但是在 100 epoch 之后我遇到了类似的问题。

又经过 30 个 epoch 的训练,看起来是这样的,在此处输入图像描述

刚刚散落的黑点,似乎这些黑点只是改变了它们的parttern并跳转到另一个parttern,我不知道为什么会发生。我不知道如何修改我的网络超参数。
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`
4

0 回答 0