pytorch MNIST神经网络产生几个非零输出



我尝试在MNIST数据集上运行一个神经网络。我大部分时间都在学习pytorch.nn教程。结果,我得到了一个可以学习的模型,但过程或模型本身有问题。我收到的不是输出端的一个活动神经元,而是多个。

这是模型本身:

model = nn.Sequential(
nn.Linear(784, 64),
nn.ReLU(),
nn.Linear(64, 10),
nn.ReLU(),
)

以下是培训过程:

loss_func = nn.CrossEntropyLoss()
opt = optim.SGD(model.parameters(), lr=lr)
for epoch in range(epochs):
model.train()
for xbt, ybt in train_dl:
pred = model(xbt)
loss = loss_func(pred, ybt)
opt.zero_grad()
loss.backward()
opt.step()

model.eval()
# Validation
if epoch % 10 == 0:
with torch.no_grad():
losses, nums = zip(
*[(loss_func(model(xbv), ybv), len(xbv)) for xbv, ybv in valid_dl]
)
val_loss = np.sum(np.multiply(losses, nums)) / np.sum(nums)
print(epoch, val_loss)

以下是每10个时期的平均损失:

0 0.13384412774592638
10 0.0900113809091039
20 0.09795805384699234
30 0.10341344920364791
40 0.10804545368137551

这就是将模型应用于验证集的结果:

[[ 0.         0.         0.        ... 28.436266   0.         5.001435 ]
[ 7.3331523 12.666427  31.898096  ...  0.         0.         0.       ]
[ 0.        18.116354   8.049953  ...  4.330721   0.         0.       ]
...
[ 8.504517   0.         6.302228  ...  0.         0.         0.       ]
[ 1.7339934  0.         0.        ...  0.         2.1565871  0.       ]
[45.750134   0.         6.2685804 ...  2.247082   0.         0.       ]]
Shape: (9984, 10)

我试着改变学习速度、模型层、时代数量,但似乎什么都不起作用。

最后一层有10个ReLU神经元,是的,所有神经元都会启动/激活。在这种情况下,每个神经元在线性激活的输出上应用ReLu函数。即CCD_ 2。有10个这样的神经元,它们都会根据输入发出特定的输出,是的,它们都被激发/激活了。从中推断输出的方法是,取与具有最大激活的神经元对应的类(使用np.argmax或torc.max(

这是绝对正常的:您的输出应该是[bacth_size, 10]的形状,因为在每次迭代时,您都会向其提供一批batch_size图像,并且输出层具有10神经元。

对此的解释如下:

  • 输出张量的每一行都是对批处理中一个输入图像的预测
  • 对于一行,如果你只想分类,你的猜测将是该行的argmax。例如,如果output[0] = [ 0. , 0. , 0. , 2.1, 3.0, 0., 4., 28.436266 0., 5.001435 ],则意味着您的网络已预测图像属于类别n°7(28.436266是索引7处的最大值(

现在,您还可以使用某种概率来解释结果。为此,您需要将softmax层应用于您的输出。值CCD_ 8将可解释为图像CCD_ 9属于类别CCD_。

相关内容