向简单CNN添加剩余连接



我用残差连接实现了以下CNN,用于在CIFAR10上分类10个类:

class ConvolutionalNetwork(nn.Module):  
def __init__(self, filters=[32, 32, 32]):
super(ConvolutionalNetwork, self).__init__()
self.conv = []
self.filters = filters
in_channels = 3
for out_channels in self.filters:
self.conv.append(nn.Conv2d(in_channels, out_channels, 5, padding=2))
in_channels = out_channels
self.conv = nn.ModuleList(self.conv)
self.fc = nn.Linear(self.filters[-1] * 32 * 32, 10)
def forward(self, X):
X = X.contiguous()
for i, conv in enumerate(self.conv):
res = X
X = F.relu(conv(X))
X += res
X = X.reshape(-1,self.filters[-1]*self.size*self.size)
X = self.fc(X)
return F.log_softmax(X, dim=1)

基本上:Conv2d(5x5(-->ReLU-->Conv2d有剩余连接的性能比没有更差。我想知道:

  1. 也许我没有正确使用它(我应该使用nn.Identity((或其他pytorch类吗?(
  2. 过滤器数量(我尝试了[32,32,32]和[64,64,64](和跳过次数(跳了多少次?我跳了一次,但可能这就是问题所在?(
  3. 我如何改变恒等式的维数以适应卷积网络的不同维数(即[16,32,64]滤波器(

我认为只有三层不够深,不能让剩余的链接"踢入"-我想这就是为什么没有残余联系的训练效果更好的主要原因。此外,你的全连接层有32K的输入尺寸——这是巨大的。

对于res有3个信道,X有32个信道的第一个conv层,您的剩余链路是如何工作的?

我会尝试以下方法:

  1. 不要为第一个conv层添加剩余链接
  2. 在conv之后和relu之前添加nn.BatchNorm2d
  3. 添加跨步-对特征图进行子采样,因此对于完全连接的层,最终的特征将明显少于32K

最新更新