【问题标题】:Why is my VGG-19 implementation not performing well?为什么我的 VGG-19 实施效果不佳?
【发布时间】:2019-09-21 11:17:36
【问题描述】:

为了在 CIFAR-10 数据测试中获得最佳准确率,我必须手动实现 VGG-19。

我阅读了关于 VGGNet 的论文并实现了 VGG-19 网络,但我在测试数据集上的准确率为 10%……我尝试更改 Batch 大小、学习率,但没有任何改善。

class MyClassifier(nn.Module):
  def __init__(self):
        super(MyClassifier, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)
        self.conv12 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1)

        self.conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1)
        self.conv22 = nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, padding=1)

        self.conv3 = nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1)
        self.conv32 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1)

        self.conv4 = nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1)
        self.conv42 = nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1)


        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)

        self.Dropout = nn.Dropout(p=0.5)
        self.fc1 = nn.Linear(in_features=512*1*1, out_features=4096)
        self.fc2 = nn.Linear(in_features=4096, out_features=4096)
        self.fc3 = nn.Linear(in_features=4096, out_features=output_dim)

  def forward(self, x):
      x = self.relu(self.conv1(x))
      x = self.pool(self.relu(self.conv12(x)))

      x = self.relu(self.conv2(x))
      x = self.pool(self.relu(self.conv22(x)))

      x = self.relu(self.conv3(x))
      x = self.pool(self.relu(self.conv32(x)))

      x = self.relu(self.conv4(x))
      x = self.relu(self.conv42(x))
      x = self.relu(self.conv42(x))
      x = self.pool(self.relu(self.conv42(x)))

      x = self.relu(self.conv42(x))
      x = self.relu(self.conv42(x))
      x = self.relu(self.conv42(x))
      x = self.pool(self.relu(self.conv42(x)))

      x = x.view(-1, 512*1*1)
      x = self.Dropout(self.relu(self.fc1(x)))
      x = self.Dropout(self.relu(self.fc2(x)))
      outputs = self.fc3(x)
      return outputs

这是我的结果:

[epoch:0, iteration:2000] train loss : 2.5708 train accuracy : 0.0000
[epoch:0, iteration:4000] train loss : 2.4595 train accuracy : 0.0000
[epoch:0, iteration:6000] train loss : 2.2051 train accuracy : 0.0000
[epoch:0, iteration:8000] train loss : 2.4449 train accuracy : 0.0000
[epoch:0, iteration:10000] train loss : 2.3113 train accuracy : 0.2500
[epoch:0, iteration:12000] train loss : 2.3602 train accuracy : 0.0000
[epoch:0, iteration:12500] test_loss : 2.3092 test accuracy : 0.1000
checkpoint is saved !

我的测试准确率在 epoch:0 为 0.1 (10%),但即使在 10 个 epoch 之后仍保持为 0.1。我相信使用 VGG-19 的代码我可以达到至少 0.8 (80%)。 您是否发现代码有任何问题或其他问题?

【问题讨论】:

  • 正规化输入是什么意思?我用过: transform_test = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) 我也使用相同的 Maxpool 和 Relu 函数,所以我不需要再次声明它们。我只声明了一次,然后使用了几次。

标签: artificial-intelligence conv-neural-network pytorch vgg-net


【解决方案1】:

如果我不得不猜测,我认为这与您在训练期间的损失函数有关。您是否使用交叉熵损失?如果您使用的是 NLLLoss,则需要在网络末端有一个 log softmax 层。

【讨论】:

  • 感谢您的回答,但我使用的是交叉熵
猜你喜欢
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2019-06-15
  • 2021-01-12
  • 2017-05-17
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多