Python 神经网络简单例子中的熵误差

Python 神经网络简单例子中的熵误差,python,pytorch,loss-function,Python,Pytorch,Loss Function,H1,我正在尝试制作满足简单公式的NN模型。 y=X1^2+X2^2 但当我使用CrossEntropyLoss作为loss函数时,会得到两条不同的错误消息 首先,当我这样设置代码时 x = torch.randn(batch_size, 2) y_hat = model(x) y = answer(x).long() optimizer.zero_grad() loss = loss_func(y_hat, y) loss.backward() optimizer.step() x = t

H1,我正在尝试制作满足简单公式的NN模型。
y=X1^2+X2^2

但当我使用CrossEntropyLoss作为loss函数时,会得到两条不同的错误消息
首先,当我这样设置代码时

x = torch.randn(batch_size, 2)
y_hat = model(x)
y = answer(x).long()

optimizer.zero_grad()
loss = loss_func(y_hat, y)
loss.backward()
optimizer.step()
x = torch.randn(batch_size, 2)
y_hat = model(x)
y = answer(x).long().view(batch_size,1,1)

optimizer.zero_grad()
loss = loss_func(y_hat, y)
loss.backward()
optimizer.step()
我收到这个消息

RuntimeError: Assertion `cur_target >= 0 && cur_target < n_classes' failed.  at 
c:\programdata\miniconda3\conda-bld\pytorch_1533090623466\work\aten\src\thnn\generic/Cl 
然后我会收到类似

RuntimeError: multi-target not supported at c:\programdata\miniconda3\conda-bld\pytorch_1533090623466\work\aten\src\thnn\generic/ClassNLLCriterion.c:21
我怎样才能解决这个问题?谢谢。(对不起我的英语)
这是我的密码

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

def answer(x):

    y = x[:,0].pow(2) + x[:,1].pow(2)

    return y

class Model(nn.Module):

    def __init__(self, input_size, output_size):
        super(Model, self).__init__()

        self.linear1 = nn.Linear(input_size, 10)
        self.linear2 = nn.Linear(10, 1)

    def forward(self, x):

        y = F.relu(self.linear1(x))
        y = F.relu(self.linear2(y))

        return y

model = Model(2,1)
print(model, '\n')

loss_func = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr = 0.001)

batch_size = 3
epoch_n = 100
iter_n = 100

for epoch in range(epoch_n):
    loss_avg = 0

    for i in range(iter_n):

        x = torch.randn(batch_size, 2)
        y_hat = model(x)
        y = answer(x).long().view(batch_size,1,1)

        optimizer.zero_grad()
        loss = loss_func(y_hat, y)
        loss.backward()
        optimizer.step()

        loss_avg += loss

    loss_avg = loss_avg / iter_n

    if epoch % 10 == 0:
        print(loss_avg)

    if loss_avg < 0.001:
        break
导入火炬
导入torch.nn作为nn
将torch.optim导入为optim
导入torch.nn.功能为F
def答案(x):
y=x[:,0]。功率(2)+x[:,1]。功率(2)
返回y
类模型(nn.Module):
定义初始大小(自身大小、输入大小、输出大小):
超级(模型,自我)。\uuuu初始化
self.linear1=nn.Linear(输入大小,10)
自线性2=nn线性(10,1)
def前进(自身,x):
y=F.relu(自线性1(x))
y=F.relu(自线性2(y))
返回y
模型=模型(2,1)
打印(型号“\n”)
损失函数=nn.CrossEntropyLoss()
optimizer=optim.SGD(model.parameters(),lr=0.001)
批量大小=3
历元n=100
国际热核实验堆n=100
对于范围内的历元(历元):
平均损耗=0
对于范围内的i(iter\n):
x=焊炬randn(批次尺寸,2)
y_hat=型号(x)
y=答案(x).long().视图(批量大小,1,1)
optimizer.zero_grad()
损失=损失函数(y,y)
loss.backward()
optimizer.step()
平均损耗=损耗
平均损耗=平均损耗/iter\n
如果历元%10==0:
打印(平均损耗)
如果损失平均值<0.001:
打破

我可以使用pytorch中的dataloader制作这些数据集吗?谢谢您的帮助。

您使用了错误的丢失功能
CrossEntropyLoss
通常用于分类问题,而您的问题是回归问题。因此,您应该使用用于回归的损失,如任务,等等。请看,和。

哦,我不知道交叉熵通常可以用于分类。。。。非常感谢你!如果这解决了你的问题,考虑“接受”这个答案,对不起。我忘了!没问题。很高兴我能帮忙。