Python 3.x PyTorch can';不要使用浮动类型,但只能使用长

Python 3.x PyTorch can';不要使用浮动类型,但只能使用长,python-3.x,neural-network,pytorch,Python 3.x,Neural Network,Pytorch,我正在尝试运行这个非常基本的神经网络: import os; os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" import torch import torchvision import torch.nn as nn import torch.nn.functional as F import matplotlib.pyplot as plt import time ########################

我正在尝试运行这个非常基本的神经网络:

import os; os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
import time

#####################################################
#             Create the neural network             #
#####################################################

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1, 10)
        self.fc2 = nn.Linear(10, 10)
        self.fc3 = nn.Linear(10, 1)

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


net = Net()

#####################################################
#                   Create the datasets             #
#####################################################


trainset = [torch.tensor([1., 1.**2]), torch.tensor([2., 2.**2]), torch.tensor([3., 3.**2]), torch.tensor([4., 4.**2]), torch.tensor([5., 5.**2]), torch.tensor([6., 6.**2]), torch.tensor([7., 7.**2]), torch.tensor([8., 8.**2])]

testset = [torch.tensor([1.1, 1.1**2]), torch.tensor([2.3, 2.3**2]), torch.tensor([3.1, 3.1**2]), torch.tensor([4.5, 4.5**2]), torch.tensor([5.9, 5.9**2]), torch.tensor([6.1, 6.1**2]), torch.tensor([7.3, 7.3**2]), torch.tensor([8.01, 8.01**2])]

#####################################################
#               Optimize the parameters             #
#####################################################

optimizer = torch.optim.Adam(net.parameters(), lr=0.001)


EPOCHS = 3

for epoch in range(EPOCHS):
    for data in trainset:
        x, y = data
        net.zero_grad()
        output = net(x.view(-1,1))
        loss = F.nll_loss(output, y.view(-1,1)[0])
        loss.backward()
        optimizer.step()
    print(loss)

#####################################################
#           Calculate the accuracy rate             #
#####################################################

correct = 0
total = 0

with torch.no_grad():
    for data in trainset:
        x, y = data
        output = net(x)
        if y - 0.01 < output < y + 0.01:
            correct += 1
        total += 1

print("Accuracy: %.2f" % (correct / total))
导入操作系统;os.environ[“KMP_DUPLICATE_LIB_OK”]=“TRUE”
进口火炬
进口火炬视觉
导入torch.nn作为nn
导入torch.nn.功能为F
将matplotlib.pyplot作为plt导入
导入时间
#####################################################
#创建神经网络#
#####################################################
类别网络(nn.模块):
定义初始化(自):
超级(网络,自我)。\uuuu初始化
self.fc1=nn.线性(1,10)
self.fc2=nn.线性(10,10)
self.fc3=nn.线性(10,1)
def前进(自身,x):
x=F.relu(自fc1(x))
x=F.relu(自身fc2(x))
x=自身.fc3(x)
返回x
net=net()
#####################################################
#创建数据集#
#####################################################
列车组=[火炬张量([1,1.*2])、火炬张量([2,2.*2])、火炬张量([3,3.*2])、火炬张量([4,4.*2])、火炬张量([5,5.*2])、火炬张量([6,6.*2])、火炬张量([7,7.*2])、火炬张量([8,8.*2])]
测试集=[火炬.张量([1.1,1.1**2]),火炬.张量([2.3,2.3**2]),火炬.张量([3.1,3.1**2]),火炬.张量([4.5,4.5**2]),火炬.张量([5.9,5.9**2]),火炬.张量([6.1,6.1**2]),火炬.张量([7.3,7.3**2]),火炬.张量([8.01,8.01**2])
#####################################################
#优化参数#
#####################################################
optimizer=torch.optim.Adam(net.parameters(),lr=0.001)
纪元=3
对于范围内的历元(历元):
对于列车组中的数据:
x、 y=数据
净零度梯度()
输出=净(x.view(-1,1))
损耗=F.nll\U损耗(输出,y.view(-1,1)[0])
loss.backward()
optimizer.step()
打印(丢失)
#####################################################
#计算准确率#
#####################################################
正确=0
总数=0
使用手电筒。无梯度()
对于列车组中的数据:
x、 y=数据
输出=净(x)
如果y-0.01<输出
但我得到了以下错误:

回溯(最近一次调用上次):文件 “C:\Users\Andrea\Desktop\pythonProject\main.py”,第52行,在 loss=F.nll\u loss(输出,y.view(-1,1)[0])文件“C:\WinPython\python-3.9.1.amd64\lib\site packages\torch\nn\functional.py”, 第2235行,在nll_损耗中 ret=torch.\u C.\u nn.nll\u损失(输入、目标、权重、减少.获取枚举(减少),忽略索引)运行时错误:预期标量类型长,但找到浮点


为什么我不能使用浮点类型?

原因是我们的标签应该是
F.nll\u loss
读取方法中的整数标量。
让我举一个例子,假设您想进行图像分类,您不能将标签指定为
0.1、0.2等
,而应该是
0,1,2..

我还看到,你的标签比你的模型的输出更重要

工作代码应该是这样的:

import os; os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
import time

#####################################################
#             Create the neural network             #
#####################################################

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1, 10)
        self.fc2 = nn.Linear(10, 10)
        self.fc3 = nn.Linear(10, 2) #  CHANGED TO 2 CLASS

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


net = Net()

#####################################################
#                   Create the datasets             #
#####################################################


trainset = [torch.tensor([1., 0.]), torch.tensor([2., 0.]), torch.tensor([3., 0.]), torch.tensor([4., 0.]), torch.tensor([5., 1.]), torch.tensor([6., 1.]), torch.tensor([7., 1.]), torch.tensor([8., 1.])]

testset = [torch.tensor([1.1, 0.]), torch.tensor([2.3, 0.]), torch.tensor([3.1, 0.]), torch.tensor([4.5, 0.]), torch.tensor([5.9, 1.]), torch.tensor([6.1, 1.]), torch.tensor([7.3,1.]), torch.tensor([8.01, 1.])]

#####################################################
#               Optimize the parameters             #
#####################################################

optimizer = torch.optim.Adam(net.parameters(), lr=0.001)


EPOCHS = 3

for epoch in range(EPOCHS):
    for data in trainset:
        x, y = data
        net.zero_grad()
        #print(x.view(-1,1).shape)
        y = torch.tensor([y.type(torch.LongTensor)])
        #print(y.shape)
        #print(y)
        output = net(x.view(-1,1))
        loss = F.nll_loss(output, y)
        loss.backward()
        optimizer.step()
    print(loss)

负对数似然损失(NLLLoss)适用于输出为C类中的一类的分类问题。因为类是离散的,所以标签需要是long类型

在你的例子中,你在评论中说:

我想创建一个模拟二次函数的网络,输入x,输出x**2


这是一个回归问题,其中输出可以有一个真实的、连续的值。为此,应使用适当的损失函数,如均方误差损失()。因此,一种修复方法是将代码中的
F.nll\u损失
更改为
F.mse\u损失

,这是否回答了您的问题?为什么我不能创建一个只返回一个值的nn?我想创建一个网络,模拟一个二次函数,输入x,输出x**2function@Andrea