我知道这是一个原始问题但是我应该在我的代码中添加什么来输出神经网络的训练准确度以及损失,我查看了 PyTorch 教程,它们展示了如何在图像分类中添加训练/测试准确度但是我不知道如何在我的简单 XOR 求解 NN 中做到这一点,以下是代码:
# Step 1: importing our dependencies
import torch
from torch.autograd import Variable
import numpy as np
# Our data
x = Variable(torch.Tensor([[0, 0, 1], [0, 1, 1], [1, 0, 1], [0, 1, 0], [1, 0, 0],
[1, 1, 1], [0, 0, 0]]))
y = Variable(torch.Tensor([[0], [1], [1], [1], [1], [0], [0]]))
# Step 2: building our class model
class NeuralNetwork(torch.nn.Module):
def __init__(self):
super(NeuralNetwork, self).__init__()
self.linear_ij = torch.nn.Linear(3, 4)
self.linear_jk = torch.nn.Linear(4, 1)
def forward(self, x):
matmul = self.linear_ij(x)
activation = torch.sigmoid(matmul)
matmul = self.linear_jk(activation)
prediction = torch.sigmoid(matmul)
return prediction
# Our model
model = NeuralNetwork()
# Constructing the loss function and the optimization algorithm
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=1)
# Step 3: the training process
for epoch in range(10000):
prediction = model(x)
loss = criterion(prediction, y)
if epoch % 1000 == 0 or epoch == 10000 - 1:
print("epoch ", epoch, ",", "loss: ", loss.item())
# Backpropagation process
optimizer.zero_grad()
loss.backward()
optimizer.step()
这就是它作为输出给出的内容:
epoch 0 , loss: 0.6983293294906616
epoch 1000 , loss: 0.015215665102005005
epoch 2000 , loss: 0.0048239342868328094
epoch 3000 , loss: 0.00280318153090775
epoch 4000 , loss: 0.001963752554729581
epoch 5000 , loss: 0.0015071843517944217
epoch 6000 , loss: 0.0012211233843117952
epoch 7000 , loss: 0.0010254186345264316
epoch 8000 , loss: 0.000883264874573797
epoch 9000 , loss: 0.0007753585232421756
epoch 9999 , loss: 0.0006908221403136849
至于测试:
# Testing our model
model.eval()
x_test = Variable(torch.Tensor([[1, 1, 0], [0, 0, 1], [0, 1, 1]]))
y_test = Variable(torch.Tensor([[0], [0], [1]]))
y_pred = model(x_test)
print(model(x_test))
输出:
tensor([[0.0026],
[0.0011],
[0.9991]], grad_fn=<SigmoidBackward>)
最佳答案
要增加准确性,您只需要一行,即:
print("Accuracy: ", ((prediction > 0.5) == y).float().mean().item())
当您使用
sigmoid
任何大于 0.5
被认为是积极的,任何低于消极的东西。 (prediction > 0.5)
创建一个 tensor
的 bool
键入并检查其中哪些等于 y
. float()
需要,因为您无法计算 mean
的 bool
张量。 item()
不需要但从单值返回 python 值 tensor
这样 IMO 看起来更干净。您可以对
test
执行相同操作,因此它将是:model.eval()
x_test = Variable(torch.Tensor([[1, 1, 0], [0, 0, 1], [0, 1, 1]]))
y_test = Variable(torch.Tensor([[0], [0], [1]]))
with torch.no_grad():
y_pred = model(x_test)
print("Accuracy: ", ((y_pred > 0.5) == y_test).float().mean().item())
请注意
torch.no_grad()
.此上下文管理器禁用 autograph
当你在它的范围内时。由于您只是通过神经网络传递输入,而不是使用梯度对其进行训练,因此无需将签名作为等式的一部分。使用 logits
这通常是一个好习惯不使用最终激活 在你的神经网络中(除非你真的需要它)。因此,您的转发将如下所示:
def forward(self, x):
matmul = self.linear_ij(x)
activation = torch.sigmoid(matmul)
# Notice no sigmoid
return self.linear_jk(activation)
这输出
logits
(假设非归一化概率范围为 [-inf, inf]
)表明您的神经网络是正类( +inf
)或负类的置信度。您必须相应地更改损失函数,例如
torch.nn.BCEWithLogitsLoss
( mean
是默认的归约,这里不需要明确说明):criterion = torch.nn.BCEWithLogitsLoss()
最后,准确性也略有变化。现在任何大于
0
被认为是积极的,因此你会这样做:print("Accuracy: ", ((prediction > 0) == y).float().mean().item())
如果你需要概率,你可以使用
torch.sigmoid
仍然在输出上,但您甚至可能不需要它(在本例中似乎如此)。编辑
您还应该将您的数据指定为
torch.Tensor
, torch.Variable
已弃用( tensors
已经有 requires_grad=True
),例如:x = torch.Tensor(
[[0, 0, 1], [0, 1, 1], [1, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1], [0, 0, 0]]
)
y = torch.Tensor([[0], [1], [1], [1], [1], [0], [0]])
编辑2:
它应该放置在您的损失打印下方(或上方),例如:
for epoch in range(10000):
prediction = model(x)
loss = criterion(prediction, y)
if epoch % 1000 == 0 or epoch == 10000 - 1:
# Here is fine
print("Accuracy: ", ((prediction > 0.5) == y).float().mean().item())
print("epoch ", epoch, ",", "loss: ", loss.item())
# Backpropagation process
optimizer.zero_grad()
loss.backward()
optimizer.step()
关于python - 为 PyTorch 中的简单神经网络增加训练和测试精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60171198/