为什么在线性层之后使用ReLu激活时精度会降低

2024-04-20 12:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我开始使用Pytorch,我正在建立一个非常基本的CNN关于时尚主义者的数据集。我注意到一些奇怪的行为,而使用神经网络,我不知道为什么会发生这种情况,在正向函数的精度下降,当我使用一个Relu函数后,每一个线性层。你知道吗

以下是我的自定义NN的代码:

# custom class neural network 
class FashionMnistClassifier(nn.Module):
  def __init__(self, n_inputs, n_out):
    super().__init__()
    self.cnn1 = nn.Conv2d(n_inputs, out_channels=32, kernel_size=5).cuda(device)
    self.cnn2 = nn.Conv2d(32, out_channels=64, kernel_size=5).cuda(device)
    #self.cnn3 = nn.Conv2d(n_inputs, out_channels=32, kernel_size=5)
    self.fc1 = nn.Linear(64*4*4, out_features=100).cuda(device)
    self.fc2 = nn.Linear(100, out_features=n_out).cuda(device)
    self.relu = nn.ReLU().cuda(device)
    self.pool = nn.MaxPool2d(kernel_size=2).cuda(device)
    self.soft_max = nn.Softmax().cuda(device)

  def forward(self, x):
    x.cuda(device)
    out = self.relu(self.cnn1(x))
    out = self.pool(out)
    out = self.relu(self.cnn2(out))
    out = self.pool(out)
    #print("out shape in classifier forward func: ", out.shape)
    out = self.fc1(out.view(out.size(0), -1))
    #out = self.relu(out) # if I uncomment these then the Accuracy decrease from 90 to 50!!!
    out = self.fc2(out)
    #out = self.relu(out) # this too
    return out

n_batch = 100
n_outputs = 10
LR = 0.001

model = FashionMnistClassifier(1, 10).cuda(device)
optimizer = optim.Adam(model.parameters(), lr=LR)
criterion = nn.CrossEntropyLoss()

因此,如果我只在CNN层之后使用ReLu,我会得到90%的准确率,但是当我取消注释该部分并在线性层之后使用ReLu激活时,准确率会降低到50%,我不知道为什么会发生这种情况,因为我认为在每个线性层之后使用激活总是更好的,以获得更好的准确性分类。我一直认为,如果我们有分类问题,我们应该总是使用激活函数,而对于线性回归,我们不必这样做,但是在我的例子中,虽然这是一个分类问题,但是如果在线性层之后不使用激活函数,我会得到更好的性能。有人能给我澄清一下吗?你知道吗


Tags: 函数selfsizedevice分类线性nnout
1条回答
网友
1楼 · 发布于 2024-04-20 12:55:02

CrossEntropyLoss需要传入非规范化的logit(最后一个Linear层的输出)。你知道吗

如果你用ReLU作为最后一层的输出,你只输出[0, inf)范围内的值,而神经网络倾向于用小值表示错误的标签,用高值表示正确的标签(我们可以说它对自己的预测过于自信)。哦,logit值最高的那个被argmax选为正确的标签。你知道吗

所以这条线肯定不行:

# out = self.relu(out) # this too

尽管它应该在它前面加上ReLU。记住,更多的非线性并不总是对网络有利。你知道吗

相关问题 更多 >