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