python - 将残差连接添加到简单的 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(5x5) --> ReLU --> Conv2d(5x5) --> ReLU --> 全连接层 --> SoftMax 有残差连接的性能更差然后没有。我想知道:
- 也许我没有正确使用它(我应该使用 nn.Identity() 还是其他一些 pytorch 类?)
- 过滤器数量(我尝试过 [32,32,32] 和 [64,64,64])和跳过(多少跳?我做了一个但也许这就是问题所在?)
- 如何更改身份的维度以适应卷积网络的不同维度(即 [16, 32, 64] 过滤器)
解决方案
我认为只有三层不足以让残差链接“启动” - 我想这是没有残差连接的训练效果更好的主要原因。此外,您的全连接层具有 32K 输入维度 - 这是巨大的。
您的残差链接如何适用于res
具有 3 个通道和X
32 个通道的第一个卷积层?
我会尝试以下方法:
- 不要为第一个 conv 层添加残差链接。
nn.BatchNorm2d
在 conv 之后和relu
.- 添加步幅 - 对特征图进行子采样,因此对于全连接层,您最终会得到明显少于 32K 的特征。
推荐阅读
- c# - 服务器端排序和分页 Mvc
- dart - 糟糕的 PageView 性能
- python - 如何从 Python 打印弹出评论到 Excel?
- javascript - 计时器位置在 JQuery 中显示双倍
- sql - 枢轴考勤
- import - 通过硬编码边界值来调整 sqoop 导入性能
- payara - java -jar payara-micro-4.1.2.181.jar throwing 找不到 javadb 客户端 jar 文件
- keras - 当Keras中的batch_size = None时如何处理批处理数据
- codeigniter - 动态显示单个配置文件图像
- ajax - 使用ajax发布带有url的id