Pytorch 为什么我的CNN网络可以';不要学习高级功能

Pytorch 为什么我的CNN网络可以';不要学习高级功能,pytorch,conv-neural-network,prediction,loss-function,Pytorch,Conv Neural Network,Prediction,Loss Function,我正试图通过CNN网络预测数千张像下面这样的图片。下面你可以看到CNN的架构和一些细节。我想知道为什么网络学习不正常?如您所见,预测图像值(轮廓)与地面真实值相差甚远(预测值是真实值的10倍)。网络似乎在边缘检测(低级特征)方面做得很好,但在高级特征方面做得不好 kernel=3 num_filters=12 批量大小=128 lr=1e-5 类模型(nn.Module): def uu init uu(self,kernel,num_filters,res=ResidualBlock): 超级

我正试图通过CNN网络预测数千张像下面这样的图片。下面你可以看到CNN的架构和一些细节。我想知道为什么网络学习不正常?如您所见,预测图像值(轮廓)与地面真实值相差甚远(预测值是真实值的10倍)。网络似乎在边缘检测(低级特征)方面做得很好,但在高级特征方面做得不好

kernel=3
num_filters=12
批量大小=128
lr=1e-5
类模型(nn.Module):
def uu init uu(self,kernel,num_filters,res=ResidualBlock):
超级(模型,自我)。\uuuu初始化
self.conv0=nn.Sequential(
nn.Conv2d(4,num_过滤器,内核大小=内核*3,
填充=4),
nn.BatchNorm2d(num_过滤器),
nn.ReLU(就地=真))
self.conv1=nn.Sequential(
Conv2d(num_filters,num_filters*2,kernel_size=kernel,
步幅=2,填充=1),
nn.BatchNorm2d(num_filters*2),
nn.ReLU(就地=真))
self.conv2=nn.Sequential(
Conv2d(num_filters*2,num_filters*4,kernel_size=kernel,stride=2,padding=1),
nn.BatchNorm2d(num_filters*4),
nn.ReLU(就地=真))
self.conv3=nn.Sequential(
Conv2d(num_filters*4,num_filters*8,kernel_size=kernel,stride=2,padding=2),
nn.BatchNorm2d(过滤器数量*8),
nn.ReLU(就地=真))
self.conv4=nn.Sequential(
Conv2d(num_filters*8,num_filters*16,kernel_size=kernel,stride=2,padding=1),
nn.BatchNorm2d(过滤器数量*16),
nn.ReLU(就地=真))
self.tsconv0=nn.顺序(
nn.ConvTranspose2d(num_filters*16,num_filters*8,kernel_size=kernel,padding=1),
nn.上采样(比例系数=2,模式=双线性,对齐角=真),
nn.ReLU(就地=真),
nn.BatchNorm2d(num_filters*8))
self.tsconv1=nn.Sequential(
nn.ConvTranspose2d(num_filters*8,num_filters*4,kernel_size=kernel,padding=1),
nn.上采样(比例系数=2,模式=双线性,对齐角=真),
nn.ReLU(就地=真),
nn.BatchNorm2d(num_filters*4))
self.tsconv2=nn.Sequential(
nn.ConvTranspose2d(num_filters*4,num_filters*2,kernel_size=kernel,padding=1),
nn.上采样(比例系数=2,模式=双线性,对齐角=真),
nn.ReLU(就地=真),
nn.BatchNorm2d(num_filters*2))
self.tsconv3=nn.Sequential(
nn.ConvTranspose2d(num_filters*2,num_filters,kernel_size=kernel,padding=1),
nn.上采样(比例系数=2,模式=双线性,对齐角=真),
nn.ReLU(就地=真),
nn.BatchNorm2d(num_过滤器))
self.tsconv4=nn.Sequential(
Conv2d(num_filters,1,kernel_size=kernel*3,padding=0,bias=False),
nn.ReLU(就地=真))
def前进(自身,x):
x0=self.conv0(x)#([6600600])
#打印(x0.shape)
x1=self.conv1(x0)#([1230300])
#打印(x1.形状)
x2=自conv2(x1)#([24150150])
#打印(x2.形状)
x3=自我调节3(x2)#([48,76,76])
#打印(x3.形状)
x4=自我调节4(x3)#([96,38,38])
#打印(x4.形状)
x5=self.tsconv0(x4)#([48,76,76])
#打印(x5.形状)
x6=self.tsconv1(x5)#([24152152])
#打印(x6.形状)
x7=self.tsconv2(x6)#([12,304,304)
#打印(x7.形状)
x8=self.tsconv3(x7)#([6608608])
#打印(x8.shape)
x9=self.tsconv4(x8)#([1600600])
#打印(x9.形状)
返回x9


这是一个自动编码器,对吗?你只想重建输入图像?下面的图像是输出,上面的图像是地面真相? 那么我建议你做两件事: 首先,您的体系结构似乎并没有真正生成很多功能映射,而是生成了更大的功能映射。您将从6个功能映射增加到96个。通常在CNN中,您将从6个功能映射增加到512个。例如:

layer1: 6 - layer2: 64 - layer3: 128 - layer4: 256 - layer5: 512 ...
这可能就是它无法学习高级功能的原因,因为模型的维度不高。您还可以尝试使瓶颈层的功能映射大小小于38,可能在8-16左右

第二件事: 如果不使用瓶颈层,可以添加跳过连接。因此,从编码器中取出一个或所有层,并将它们添加到具有相同维度的解码器层。
我希望这能对您有所帮助!

谢谢,我将架构更改为以下内容,但情况变得更糟了。([126060600])([24300300300])([48150150])([967575])([19238038])([38441919])([38441919])([19238038])([967575])([48150150])([24300300])([1260600])([1600600]))也许试着减少层数并检查你的数据集!我做了,但仍然无法检测到高级特征!你认为在最后一层中使用sigmoid函数并将每个像素的损失从MSE更改为CrossEntropy会有帮助吗?