【问题标题】:Why is my CNN program not improving in accuracy after I add a dropout?为什么添加 dropout 后,我​​的 CNN 程序的准确性没有提高?
【发布时间】:2020-08-02 12:11:56
【问题描述】:

我正在使用 CNN 来识别 CiFar10 数据集中的图像,在添加 dropout 之前,cnn 的准确率达到了 58%,但在添加之后,它下降到了 52%。是不是网络没有过拟合?因为我怀疑是这样的。再添加两个 dropout 后,准确率上升到 55%,但我仍然对为什么它首先下降感到困惑。这是我的代码:

class Net(nn.Module):
def __init__(self):
    super(Net, self).__init__()
    self.conv1 = nn.Conv2d(3, 12, 3, padding=1)
    self.pool = nn.MaxPool2d(2, 2)
    self.conv2 = nn.Conv2d(12, 24, 3, padding=1)
    self.conv3 = nn.Conv2d(24, 48, 3, padding=1)
    self.conv4 = nn.Conv2d(48, 48, 3, padding=1)
    self.dropout1 = nn.Dropout(p=0.2)
    self.dropout2 = nn.Dropout(p=0.2)
    self.dropout3 = nn.Dropout(p=0.3)
    self.fc1 = nn.Linear(48 * 2 * 2, 120)
    self.fc2 = nn.Linear(120, 84)
    self.fc3 = nn.Linear(84, 10)


def forward(self, x):
    x = self.pool(self.dropout1(F.relu(self.conv1(x))))
    x = self.pool(self.dropout2(F.relu(self.conv2(x))))
    x = self.pool(self.dropout3(F.relu(self.conv3(x))))
    x = self.pool(F.relu(self.conv4(x)))
    x = x.view(-1, 48 * 2 * 2)
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = self.fc3(x)
    return x

【问题讨论】:

  • 尝试绘制损失图以检查是否存在过拟合,因为 dropout 只有在过拟合时才有帮助。

标签: python pytorch conv-neural-network dropout


【解决方案1】:

如果您是从头开始训练和初始化,您还需要小心比较运行。随机权重初始化有时会产生您所看到的变化,尤其是在其他超参数(例如学习率、批量大小等)尚未优化的情况下。即便如此,批量改组也会导致变化。您应该在调试所有这些时设置随机种子和/或保存权重参数。

【讨论】:

  • 初始化权重时如何设置权重不是随机的?抱歉,如果这是一个愚蠢的问题,我是 PyTorch 的新手。
  • 不是一个愚蠢的问题,我可能不太清楚。你肯定想要/需要随机权重,但是为了调试运行到运行,你希望这些随机权重是可重复的。您可能只想淡化一些随机的事情,例如也许让洗牌在运行中随机但保持权重相同(在这种情况下,您可以在初始化后立即保存模型)。由于您使用的是 Pytorch,因此这里有一篇很好的文章来解决可重复的结果。 pytorch.org/docs/stable/notes/randomness.html
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 2020-06-20
  • 2019-03-13
  • 2020-11-19
  • 1970-01-01
  • 2022-10-15
  • 2019-11-27
  • 2020-09-01
相关资源
最近更新 更多