Neural network ValueError:目标大小(火炬大小([1000])必须与输入大小(火炬大小([1000,1])相同
我正在尝试用pyTorch训练我的第一个神经网络(我不是程序员,只是一个困惑的化学家) 网络本身应该接受1064个元素向量,并用浮点数对它们进行评级 到目前为止,我遇到了各种各样的错误,从“float代替long”到“Target 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
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