Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每个历元后神经网络的精度评价_Python_Machine Learning_Neural Network - Fatal编程技术网

Python 每个历元后神经网络的精度评价

Python 每个历元后神经网络的精度评价,python,machine-learning,neural-network,Python,Machine Learning,Neural Network,这是我用PyTorch在one-by的基础上制作的神经网络。我正在使用大学课程管理员提供给我的数据集,该数据集是通过函数获取奇怪符号加载程序(batch\u size=128)导入的 当我运行这段代码时,它告诉我每个时代的精度都应该是1.0。然而,在包含epoch的for循环迭代之后运行#测试块会给出更现实的结果。为什么会发生这种情况 我在这里的目标是根据历元数绘制测试精度图,以便在模型开始过度拟合之前找到最佳历元数 您正在增加块中的correct和total from dataset impo

这是我用PyTorch在one-by的基础上制作的神经网络。我正在使用大学课程管理员提供给我的数据集,该数据集是通过函数
获取奇怪符号加载程序(batch\u size=128)
导入的

当我运行这段代码时,它告诉我每个时代的精度都应该是
1.0
。然而,在包含epoch的for循环迭代之后运行#测试块会给出更现实的结果。为什么会发生这种情况


我在这里的目标是根据历元数绘制测试精度图,以便在模型开始过度拟合之前找到最佳历元数

您正在增加块中的
correct
total

from dataset import get_strange_symbol_loader, get_strange_symbols_test_data
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim


class Net(nn.Module):
   def __init__(self):
    super().__init__()
    self.fc1 = nn.Linear(28*28, 512)
    self.fc2 = nn.Linear(512, 256)
    self.fc3 = nn.Linear(256, 15)

def forward(self,x):
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = self.fc3(x)

    return F.softmax(x, dim=1)


if __name__ == '__main__':
   net = Net()
   train, test = get_strange_symbol_loader(batch_size=128)
   loss_function = nn.CrossEntropyLoss()
   optimizer = optim.Adam(net.parameters(), lr=1e-3)
   Accuracy = []

   for epoch in range(30):   
       print("epoch",epoch)
       #Train
       for data in train:
           img, label = data  
           net.zero_grad()
           output = net(img.view(-1,28*28))
           loss = F.nll_loss(output, label)
           loss.backward()
           optimizer.step()
       #Test    
       correct, total = 0, 0
       with torch.no_grad():
          for data in test:
               img, label = data
               output = net(img.view(-1,784))
               for idx, i in enumerate(output):
                   if torch.argmax(i) == label[idx]:
                       correct += 1
                       total += 1
       Accuracy.append(round(correct/total, 3))
       print("Accuracy: ",Accuracy)
因此,两者的值总是相同的,一个除以另一个得到1.0

检查您的计划,我认为从
total+=1
中删除一个选项卡就可以了


编辑:我假设“在…之后运行#测试块”是指您运行另一个可能不同的代码段(可能是正确的意图)

请更具体一些。代码在哪里告诉你“每个时代的准确度都应该是1.0”?为什么会发生这种情况呢?我的意思是,在for循环之后在各个时代运行测试块会返回一个更可信的精度,比如85%
if torch.argmax(i) == label[idx]:
    correct += 1
    total += 1