python - 为 PyTorch 中的简单神经网络增加训练和测试精度

标签 python python-3.x neural-network pytorch

我知道这是一个原始问题但是我应该在我的代码中添加什么来输出神经网络的训练准确度以及损失,我查看了 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)创建一个 tensorbool键入并检查其中哪些等于 y . float()需要,因为您无法计算 meanbool张量。 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/

相关文章:

python - 实现 FTP 接口(interface)/协议(protocol)

python - 合并两个数组并排序

javascript - Python Flask 在 javascript 文件中使用 config.py 中的变量

Python3 属性错误 : 'list' object has no attribute 'clear'

python - 使用 Theano 通过 NN 逼近非线性函数

python - "TypeError: ' 执行 sess.run() 时键入 ' object is not subscriptable"

python - 在 Windows 上安装 rpy2

python - 导入错误/无法导入名称截断器

python - 以正常形式打印 float ,而不是指数形式/科学记数法

artificial-intelligence - 我应该为这个神经网络使用哪个激活函数?