gpt4 book ai didi

python - 将剩余连接添加到简单的 CNN

转载 作者:行者123 更新时间:2023-12-05 07:09:25 27 4
gpt4 key购买 nike

我使用剩余连接实现了以下 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有剩余连接的性能比没有时差。我想知道:

  1. 也许我没有正确使用它(我应该使用 nn.Identity() 还是其他一些 pytorch 类?)
  2. 过滤器数量(我尝试了 [32,32,32] 和 [64,64,64])和跳过(多少跳?我做了一个,但也许这就是问题所在?)的最佳实践是什么?
  3. 如何更改身份的维度以适应卷积网络的不同维度(即 [16, 32, 64] 过滤器)

最佳答案

我认为只有三层深度不足以让残差链接“启动”——我想这就是为什么没有残差连接的训练效果更好的主要原因。此外,您的全连接层具有 32K 的输入维度 - 这是巨大的。

对于 res 有 3 个 channel 而 X 有 32 个 channel 的第一个转换层,你的残差链接是如何工作的?

我会尝试以下方法:

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

关于python - 将剩余连接添加到简单的 CNN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61570990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com