Python 预期目标大小(50,88),获得火炬。大小([50,288,88])

Python 预期目标大小(50,88),获得火炬。大小([50,288,88]),python,pytorch,loss-function,Python,Pytorch,Loss Function,我正在努力训练我的神经网络。模型中的列车是正确的,但我不能计算损失。输出和目标具有相同的维度 我曾尝试使用torch.stack,但我不能,因为每个输入的大小是(252,x),其中x在252个元素中是相同的,但对于其他输入是不同的 我使用自定义数据集: class MusicDataSet(Dataset): def __init__(self, transform=None): self.ms, self.target, self.tam = sd.cargarDatos()

我正在努力训练我的神经网络。模型中的列车是正确的,但我不能计算损失。输出和目标具有相同的维度

我曾尝试使用torch.stack,但我不能,因为每个输入的大小是(252,x),其中x在252个元素中是相同的,但对于其他输入是不同的

我使用自定义数据集:

class MusicDataSet(Dataset):
def __init__(self, transform=None):
    self.ms, self.target, self.tam = sd.cargarDatos()  
    self.mean, self.std = self.NormalizationValues()                    
def __len__(self):
    return self.tam

def __getitem__(self, idx):
    #Normalize
    inp = (self.ms[idx]-self.mean)/self.std
    inp = torch.from_numpy(inp).float()    
    inp = inp.t()
    inp = inp.to('cuda')

    target= torch.from_numpy(self.target[idx])
    target = target.long()
    target = target.t()
    target = target.to('cuda')

    return inp, target
我必须说,列表不能像:target=torch.Tensor()或torch.stack()那样进行转换,因为这是(252,x),我已经说过了

def music_collate_fn(batch):
    data = [item[0] for item in batch]
    data = pad_sequence(data, batch_first=True)
    target = [item[0] for item in batch]
    target = pad_sequence(target, batch_first=True)
    return data, target


musicSet = mds.MusicDataSet()
train_loader = torch.utils.data.DataLoader(musicSet,batch_size=50, collate_fn = music_collate_fn, shuffle=False)

input_dim = 252
hidden_dim = (512,1024,512)
output_dim = 88
mlp = rn.MLP(input_dim, hidden_dim, output_dim).to(device)

optimizer = torch.optim.RMSprop(mlp.parameters(), lr = learning_rate)
criterion = nn.CrossEntropyLoss()
for batch_idx, (x,y) in enumerate(train_loader):
    outputs = mlp(x.to(device))
    loss = criterion(outputs, y)
    optimizer.zero_grad()           
    loss.backward()                 
    optimizer.step()
输出和目标的大小相同

output: torch.Size([50, 288, 88])
target:  torch.Size([50, 288, 88])
但当我试图计算损失时,出现了下一个错误:

  File "<ipython-input-205-3c47d7aa11a4>", line 32, in <module>
    loss = criterion(outputs, y)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\nn\modules\module.py", line 489, in __call__
    result = self.forward(*input, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\nn\modules\loss.py", line 904, in forward
    ignore_index=self.ignore_index, reduction=self.reduction)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\nn\functional.py", line 1970, in cross_entropy
    return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch
\nn\functional.py", line 1800, in nll_loss
    out_size, target.size()))

ValueError: Expected target size (50, 88), got torch.Size([50, 288, 88])
文件“”,第32行,在
损耗=标准(输出,y)
文件“C:\ProgramData\Anaconda3\lib\site packages\torch\nn\modules\module.py”,第489行,在调用中__
结果=自我转发(*输入,**kwargs)
文件“C:\ProgramData\Anaconda3\lib\site packages\torch\nn\modules\loss.py”,第904行,前进
忽略索引=自我。忽略索引,减少=自我。减少)
文件“C:\ProgramData\Anaconda3\lib\site packages\torch\nn\functional.py”,第1970行,交叉显示
返回nll_损失(log_softmax(输入,1),目标,重量,无,忽略索引,无,减少)
文件“C:\ProgramData\Anaconda3\lib\site packages\torch
\nn\functional.py“,第1800行,nll\U损耗
out_size,target.size())
ValueError:预期目标大小(50,88),已获取火炬。大小([50,288,88])

我认为您使用的
交叉入口权限不正确。请参阅文档


特别是,如果输入为[NxCxd]形状,则目标应为[Nxd]形状,且目标中的值为0到C-1之间的整数,即您可以只提供类标签,而不需要对目标变量进行一次热编码。错误消息也说明了这一点

我不清楚您的问题,但我敢打赌您在进行培训时对批次大小感到困惑。我的模型的输入是[batch_size,input,variableData]。目标具有形状[batch_size,variabledata,target]。我试图使用torch.transpose(1,2)将variableData放在目标位置,但它不起作用。@LeonLopez CrossEntropyLoss需要(minibatch,C)作为输入,C是类分类的编号。我需要确定你想做什么,才能提出建议(1)改变形状或(2)改变损失函数。