Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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 pytorch:“;“不支持多目标”;错误消息_Python_Machine Learning_Pytorch_Tensor - Fatal编程技术网

Python pytorch:“;“不支持多目标”;错误消息

Python pytorch:“;“不支持多目标”;错误消息,python,machine-learning,pytorch,tensor,Python,Machine Learning,Pytorch,Tensor,所以我想对一些(3,50,50)图片进行分类。首先,我从没有数据加载器或批处理的文件中加载了数据集,它成功了。现在,在添加了这两项之后,我得到了一个错误: RuntimeError: multi-target not supported at /pytorch/aten/src/THCUNN/generic/ClassNLLCriterion.cu:15 我在网上找到了很多答案,大多是使用“target.squeeze(1)”,但这对我来说并不适用。 我的目标批处理如下所示: tensor([

所以我想对一些(3,50,50)图片进行分类。首先,我从没有数据加载器或批处理的文件中加载了数据集,它成功了。现在,在添加了这两项之后,我得到了一个错误:

RuntimeError: multi-target not supported at /pytorch/aten/src/THCUNN/generic/ClassNLLCriterion.cu:15
我在网上找到了很多答案,大多是使用“target.squeeze(1)”,但这对我来说并不适用。 我的目标批处理如下所示:

tensor([[1, 0],
        [1, 0],
        [1, 0],
        [1, 0],
        [1, 0],
        [1, 0],
        [1, 0],
        [1, 0]], device='cuda:0')
那不好吗

这里是完整的代码(请注意,我只创建了模型的结构,之后我将在其上应用完整和正确的数据集,因为我还没有完整的数据,只有32张图片,没有标签,这就是为什么我添加了“torch.tensor([1,0])作为所有标签的占位符):

导入火炬
导入torch.utils.data
导入torch.nn作为nn
导入torch.nn.功能为F
导入torch.optim
从torch.autograd导入变量
将numpy作为np导入
从PIL导入图像
类模型(nn.Module):
定义初始化(自):
超级(模型,自我)。\uuuu初始化
#模型结构:
self.conv1=nn.Conv2d(3,10,内核大小=(5,5),步长=(1,1))
self.conv2=nn.Conv2d(10,20,内核大小=(5,5),步幅=(1,1))35;使用mapool:output=20*(9,9)功能映射->展平
self.fc1=nn.线性(20*9*9250)
self.fc2=nn.线性(250100)
self.fc3=nn.线性(100,2)
def前进(自身,x):
#conv层
x=F.relu(self.conv1(x))#形状:1,10,46,46
x=F.max_pool2d(x,2,2)#形状:1,10,23,23
x=F.relu(self.conv2(x))#形状:1,20,19,19
x=F.max_pool2d(x,2,2)#形状:1,20,9,9
#展平至密实层:
x=x.view(-1,20*9*9)
#致密层
x=F.relu(自fc1(x))
x=F.relu(自身fc2(x))
输出=F.log\u softmax(自身fc3(x),尺寸=1)
返回输出
班级跑步:
定义初始(自我、时代、学习率、辍学率、势头):
#负荷模型
self.model=model().cuda()
#超参数:
self.epochs=epochs
自学习率=学习率
self.dropout=退出
def预增强(自我):
dataset_folder=“/media/theodor/hdd/Programming/BWKI/dataset/bilder/”
数据集=[]
对于范围(0,35)内的i:
sample_image=image.open(数据集_文件夹+str(i)+“.png”)
数据=torch.from_numpy(np.array(sample_image)).类型(“torch.Tensor”).重塑(3,50,50)
目标=火炬张量([[1,0]])
样本=(数据,目标)
dataset.append(示例)
火车装载机=torch.utils.data.DataLoader(数据集,批量大小=8)
回程列车装载机
def系列(自):
列车组=自我预加固()
标准=nn.CrossEntropyLoss()
optimizer=torch.optim.SGD(self.model.parameters(),lr=self.learning\u rate)
对于范围内的历元(self.epochs):
历元损失=0
对于i,枚举中的数据(列集合,0):
样本,目标=数据
#将数据设置为cuda varibale
sample=变量(sample.float().cuda())
target=变量(target.cuda())
#初始化优化器
optimizer.zero_grad()
#预测
输出=自我模型(示例)
#反向传播
打印(输出、目标压缩(1))
loss=标准(输出,target.squence(1))#错误消息:RuntimeError:multi-target不支持在/pytorch/aten/src/THCUNN/generic/classnlcriterion.cu:15
loss.backward()
optimizer.step()
历元损失+=损失项目()
打印(“历元[”,历元,|“,self.epochs,”]:“,历元损失后的损失)
def测试(自我):
通过
运行=运行(10,0.001,0.5,0.9)
run.train()
所以我希望它开始训练(当然,因为标签是错误的,所以什么也学不到),
提前感谢!

对于
nn.CrossEntropyLoss
目标必须是间隔[0,#classes]中的单个数字,而不是一个热编码的目标向量。您的目标是[1,0],因此Pytork认为您希望每个输入有多个标签,这是不受支持的

替换一个热编码目标:

[1,0]-->0


[0,1]->1

谢谢:),这是可行的,但我为什么在我离开最后一个密集层2的输出时(或将其更改为123)它也会起同样的作用?我是否用4替换[0,0,0,1]呢?你的目标始终是整数,而不是向量。对于两个类,它可以是0或1;对于123,它在0和122之间。[0,0,0,1]将是3,因为你开始计数在0,但我认为你有这个概念。如果这回答你的问题,考虑把它标记为正确的。应该分配目标=火炬。张量(y)的标签编码目标。