Pytorch 的准确性并没有提高

问题描述 投票:0回答:1

我目前正在使用 Pytorch 进行一个项目。我想评估神经网络的准确性,但测试运行时它似乎没有增加。我得到的输出是:

如您所见,我打印每个纪元的准确性总是得到相同的数字。

这是我的分类器的代码:

class Classifier(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.layer1 = torch.nn.Linear(in_features=6, out_features=2, bias=True)
        self.layer2 = torch.nn.Linear(in_features=2, out_features=1, bias=True)
        self.activation = torch.sigmoid

    def forward(self, x):
        x=self.activation(self.layer1(x))
        x=self.activation(self.layer2(x))
        return x

model=Classifier()

def setParameters(m):
  if type(m) == torch.nn.Linear:
      torch.nn.init.uniform_(m.weight.data, -0.3, 0.3)
      torch.nn.init.constant_(m.bias.data, 1)

model.apply(setParameters)
model.layer1.bias.requires_grad = False
model.layer2.bias.requires_grad = False

我用来训练网络的代码如下:

from google.colab import drive
import torch
import random

drive.mount('/content/drive')
%cd drive/MyDrive/deeplearning/ass1/data

numbers = []
results = []
with open('data.txt') as f:
  lines = f.readlines()
  random.shuffle(lines)
  for line in lines:
    digitsOfNumber = [int(x) for x in str(line[0:6])]
    resultInteger = int(line[7:8])
    numbers.append(digitsOfNumber)
    results.append(resultInteger)

numbersTensor = torch.Tensor(numbers)
resultsTensor = torch.tensor(results)

dataset = torch.utils.data.TensorDataset(numbersTensor, resultsTensor)

trainsetSize = int((80/100) * len(dataset))

trainset, testset = torch.utils.data.random_split(dataset, [trainsetSize, len(dataset) - trainsetSize])
print(len(trainset), len(testset))
testloader = torch.utils.data.DataLoader(testset, batch_size=len(testset), shuffle=False)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=len(trainset), shuffle=False)

def get_accuracy(model, dataloader):
    model.eval()
    with torch.no_grad():
        correct=0
        for x, y in iter(dataloader):
            out=model(x)
            correct+=(torch.argmax(out, axis=1)==y).sum()
        return correct/len(dataloader.dataset)

epochs=1425
losses=[]
for epoch in range(epochs):
    print("Test accuracy: ", get_accuracy(model, testloader).item())
    model.train()
    print("Epoch: ", epoch)
    for x, y in iter(trainloader):
        out=model(x)
        l=loss(out, y)
        optimizer.zero_grad()
        l.backward()
        optimizer.step()
        losses.append(l.item())
print("Final accuracy: ", get_accuracy(model, testloader))

for name, param in model.named_parameters():
  print(name, param)

最后一部分是我用来打印准确性并相应地训练网络的部分。我该如何解决我的问题?

预先感谢您的时间和耐心。

python machine-learning deep-learning neural-network pytorch
1个回答
-1
投票

模型的最后一层会产生形状为

(batch size, 1)
的张量,因为您已经设置了
out_features = 1
。我假设你的数据集有超过 1 个类?

当您计算准确性时,

torch.argmax(out, axis=1)
将始终给出相同的类别索引,在本例中为 0。这解释了为什么您的准确性是恒定的。

我建议查看您的数据集并找出您有多少个类,并据此修改您的模型。如果您有 10 个类,那么最后一层应该有 10 个输出特征,具体取决于其余代码的设置方式。

© www.soinside.com 2019 - 2024. All rights reserved.