Neural network ValueError:目标大小(火炬大小([1000])必须与输入大小(火炬大小([1000,1])相同

Neural network ValueError:目标大小(火炬大小([1000])必须与输入大小(火炬大小([1000,1])相同,neural-network,pytorch,loss-function,Neural Network,Pytorch,Loss Function,我正在尝试用pyTorch训练我的第一个神经网络(我不是程序员,只是一个困惑的化学家) 网络本身应该接受1064个元素向量,并用浮点数对它们进行评级 到目前为止,我遇到了各种各样的错误,从“float代替long”到“Target 1超出范围”。因此,我重新定义了数据类型,修正了输入向量的维数,改变了损失函数,现在我陷入了这样的境地:修正当前错误使我回到以前的错误 即: ValueError: Target size (torch.Size([1000])) must be the same a

我正在尝试用pyTorch训练我的第一个神经网络(我不是程序员,只是一个困惑的化学家)

网络本身应该接受1064个元素向量,并用浮点数对它们进行评级

到目前为止,我遇到了各种各样的错误,从“float代替long”到“Target 1超出范围”。因此,我重新定义了数据类型,修正了输入向量的维数,改变了损失函数,现在我陷入了这样的境地:修正当前错误使我回到以前的错误

即:

ValueError: Target size (torch.Size([1000])) must be the same as input size (torch.Size([1000, 1]))
'loss=loss_calc(输出,目标)

在数据集类定义期间,我尝试取消对标签的查询,但此解决方案使我倒退。当我尝试
label=label.view(1,1)
时,结果错误更改为

目标尺寸(火炬尺寸([1000,1,1])必须与输入尺寸(火炬尺寸([1000,1])相同

有人能帮我弄清楚吗

import pandas as pd
import numpy as np
import rdkit
from rdkit import Chem
from rdkit.Chem import AllChem
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader

class dataset(Dataset):
    def __init__(self, path, transform=None):
        self.data = pd.read_excel(path)
        self.transform = transform
        
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, index):
        smiles=self.data.at[index, 'smiles']
        mol=Chem.MolFromSmiles(smiles)
        morgan = torch.tensor(list(AllChem.GetMorganFingerprintAsBitVect(mol, 1, nBits=1064)), dtype=torch.float)
        
        label=torch.tensor(self.data.at[index, 'score'], dtype=torch.long)
        
        if self.transform is not None:
            morgan=self.transform(morgan)
        
        return morgan, label

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1064, 1064)
        self.fc2 = nn.Linear(1064, 1)
        self.act = nn.Tanh()
    
    def forward(self, x):
        x = self.act(self.fc1(x))
        x = self.act(self.fc2(x))
        x = self.fc2(x)
        return x

trainSet=dataset(r'C:\Users\BajMic\Peptides\trainingSet.xlsx')
testSet=dataset(r'C:\Users\BajMic\Peptides\testSet.xlsx')

net = Net()
loss_calc = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch in range(2):
    running_loss=0.0
    for data in DataLoader(trainSet, batch_size=1000, shuffle=True):
        inputs, target = data
        optimizer.zero_grad()
        outputs = net(inputs)
        print(outputs)
        loss = loss_calc(outputs, target)
        loss.backward()
        optimizer.step()        # print statistics
        running_loss += loss.item()
        print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss))
        running_loss = 0.0
print('Finished Training')

使用丢失函数时,如果形状出现问题,通常会出现以下类型的错误消息:

目标大小(torch.size([…])必须与输入大小(torch.size([…])相同

“目标”指的是标签,即基本事实,“输入”指的是模型的输出。在这种情况下,输出是1个标量值的1000个预测(您设置了
batch\u size=1000
)。因此,形状为
(1000,1)
。这最后一个轴让您感到困扰,因为预测向量只是一个包含1000个标量的一维张量,即
(1000)

为了解决这个问题,你可以用一个额外的维度展开你的目标张量。与:


这回答了你的问题吗?
target = target.unsqueeze(-1) # -1 stands for last here equivalent to 1