【问题标题】:Pytorch Multiclass Logistic Regression Type ErrorsPytorch 多类逻辑回归类型错误
【发布时间】:2020-09-21 08:51:52
【问题描述】:

我是 ML 新手,对 Pytorch 更加天真。这就是问题所在。 (我已经跳过了某些部分,比如 random_split() 似乎工作得很好)

我必须从数据集中预测葡萄酒的质量(红色),它是包含 6 个类别的最后一列

That's what my dataset looks like

The link to the dataset (winequality-red.csv)

features = df.drop(['quality'], axis = 1)
targets = df.iloc[:, -1] # theres 6 classes

dataset = TensorDataset(torch.Tensor(np.array(features)).float(), torch.Tensor(targets).float())
# here's where I think the error might be, but I might be wrong

batch_size = 8
# Dataloader

train_loader = DataLoader(train_ds, batch_size, shuffle = True)
val_loader = DataLoader(val_ds, batch_size)
test_ds = DataLoader(test_ds, batch_size)

input_size = len(df.columns) - 1
output_size = 6
threshold = .5

class WineModel(nn.Module):

  def __init__(self):
    super().__init__()
    self.linear = nn.Linear(input_size, output_size)

  def forward(self, xb):
    out = self.linear(xb)
    return out

model = WineModel()
n_iters = 2000
num_epochs = n_iters / (len(train_ds) / batch_size)
num_epochs = int(num_epochs)

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)

# the part below returns the error on running
iter = 0 
for epoch in range(num_epochs):
  for i, (x, y) in enumerate(train_loader):
    optimizer.zero_grad()
    outputs = model(x)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

RuntimeError: 预期标量类型 Long 但发现 Float

希望这是足够的信息

【问题讨论】:

    标签: machine-learning pytorch logistic-regression


    【解决方案1】:

    nn.CrossEntropyLoss作为类指标给出,它需要是整数的索引,所以要精确地为torch.long,它相当于torch.int64

    您将目标转换为floats,但您应该将它们转换为龙:

    dataset = TensorDataset(torch.Tensor(np.array(features)).float(), torch.Tensor(targets).long())
    

    由于目标是类的索引,它们必须在范围 [0,num_classes - 1] em>。正如您所拥有的6个课程范围[0,5]。快速查看数据,质量在范围内使用值[3,8]。即使您有6个类,也不能直接使用该值作为类。如果将类列出为classes = [3, 4, 5, 6, 7, 8],则可以看到第一类是3,classes[0] == 3,最多一个类在classes[5] == 8

    您需要用索引替换类值,就像您用于命名类(例如,如果您有类 DOG EM>和 CAT EM>,狗) em>将是0和 cat em>是1),但是您可以避免立即查找它们,因为这些值简单地由3,即index = classes[index] - 3。因此,您可以从整个目标张量中减去3:

    torch.Tensor(targets).long() - 3
    

    【讨论】:

    • 嘿,谢谢很多!那行得通。原因是为什么课程要被归咎于那样并转换为long()?刚刚弄清楚 span>而不是pytorch
    • 他们需要是指标,因为pytorch无法知道您可能的类是什么。它将如何知道3是您的第一堂课,特别是因为批处理并不总是包含所有可能的类。这就字面意思地告诉了Pytorch如何索引模型的输出。索引只能用整数完成,浮动不允许浮动,甚至纯Python禁止它(例如some_list[3.0]),并且Pytorch不会自动转换为长期,因为这将丢失信息(舍入到)torch.tensor(3.7).long() == 3和可能隐藏一个错误,例如传递错误的张量。 span>
    猜你喜欢
    • 2020-10-16
    • 2015-04-18
    • 1970-01-01
    • 2016-07-31
    • 2020-08-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多