所以我开始使用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%,我不知道为什么会发生这种情况,因为我认为在每个线性层之后使用激活总是更好的,以获得更好的准确性分类。我一直认为,如果我们有分类问题,我们应该总是使用激活函数,而对于线性回归,我们不必这样做,但是在我的例子中,虽然这是一个分类问题,但是如果在线性层之后不使用激活函数,我会得到更好的性能。有人能给我澄清一下吗?你知道吗
CrossEntropyLoss
需要传入非规范化的logit(最后一个Linear
层的输出)。你知道吗如果你用
ReLU
作为最后一层的输出,你只输出[0, inf)
范围内的值,而神经网络倾向于用小值表示错误的标签,用高值表示正确的标签(我们可以说它对自己的预测过于自信)。哦,logit值最高的那个被argmax
选为正确的标签。你知道吗所以这条线肯定不行:
尽管它应该在它前面加上
ReLU
。记住,更多的非线性并不总是对网络有利。你知道吗相关问题 更多 >
编程相关推荐