目标尺寸(火炬)尺寸([32,9]))必须与输入尺寸(火炬.大小([32岁10]))



我有10个班级。我有一个模型,如;

from brevitas.nn import QuantLinear, QuantReLU
import torch.nn as nn
# Setting seeds for reproducibility
torch.manual_seed(0)
model = nn.Sequential(
QuantLinear(input_size, hidden1, bias=True, weight_bit_width=weight_bit_width),
nn.BatchNorm1d(hidden1),
nn.Dropout(0.5),
QuantReLU(bit_width=act_bit_width),
QuantLinear(hidden1, hidden2, bias=True, weight_bit_width=weight_bit_width),
nn.BatchNorm1d(hidden2),
nn.Dropout(0.5),
QuantReLU(bit_width=act_bit_width),
QuantLinear(hidden2, hidden3, bias=True, weight_bit_width=weight_bit_width),
nn.BatchNorm1d(hidden3),
nn.Dropout(0.5),
QuantReLU(bit_width=act_bit_width),
QuantLinear(hidden3, num_classes, bias=True, weight_bit_width=weight_bit_width)
)
model.to(device)

,我把我的训练阶段定义为:

def train(model, train_loader, optimizer, criterion):
losses = []
# ensure model is in training mode
model.train()    

for i, data in enumerate(train_loader, 0):        
inputs, target = data['pointcloud'].to(device).float(), data['category'].to(device)
target = torch.nn.functional.one_hot(target)
optimizer.zero_grad()   

# forward pass
output = model(inputs)
loss = criterion(output, target.float())

# backward pass + run optimizer to update weights
loss.backward()
optimizer.step()

# keep track of loss value
losses.append(loss.data.cpu().numpy()) 

return losses

当我运行训练代码时:

import numpy as np
from sklearn.metrics import accuracy_score
from tqdm import tqdm, trange
# Setting seeds for reproducibility
torch.manual_seed(0)
np.random.seed(0)
running_loss = []
running_test_acc = []
t = trange(num_epochs, desc="Training loss", leave=True)
for epoch in t:
loss_epoch = train(model, train_loader, optimizer,criterion)
test_acc = test(model, valid_loader)
t.set_description("Training loss = %f test accuracy = %f" % (np.mean(loss_epoch), test_acc))
t.refresh() # to show immediately the update           
running_loss.append(loss_epoch)
running_test_acc.append(test_acc)

我得到一个错误:

目标尺寸(火炬)Size([32,9]))必须与输入大小相同(火炬。大小([32岁10]))

请告诉我可能的解决方案。我添加了一个热编码,因为我以前见过一些这样的解决方案。

代码错误非常简单-criterion(您在代码中没有显示)期望inputtarget参数的大小相同,但它们不是。

问题是,你使用torch.nn.functional.one_hot(target)没有告诉它有多少类你需要一个热编码;然后将其推断为target+1中的最大值(参见:https://pytorch.org/docs/stable/generated/torch.nn.functional.one_hot.html)。你应该把它改成torch.nn.functional.one_hot(target, num_classes=10)

最新更新