【问题标题】:'1D target tensor expected' error when using pytorch tensorDataset class使用 pytorch tensorDataset 类时出现“预期一维目标张量”错误
【发布时间】:2021-11-28 19:35:32
【问题描述】:

我想知道为什么会出现这个错误。我的直觉告诉我 tensorDataset 将最后一列读取为标签,但我不知道如果我输入一个单独的标签数据集作为第二个参数,它为什么会这样。另外,有人可以解释一下 one-hot 编码是如何工作的,以及我如何解决这个问题,因为我每个项目只需要一个标签吗?

Error: return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
RuntimeError: 1D target tensor expected, multi-target not supported

代码:

if __name__ == '__main__':

inputs_file = pd.read_csv('dataset.csv')
targets_file = pd.read_csv('labels.csv')

inputs = inputs_file.iloc[1:1001].values
targets = targets_file.iloc[1:1001].values

inputs = torch.tensor(inputs, dtype=torch.float32)
targets = torch.tensor(targets)

dataset = TensorDataset(inputs, targets)

val_size = 200
test_size = 100
train_size = len(dataset) - (val_size + test_size)

# Divide dataset into 3 unique random subsets
training_data, validation_data, test_data = random_split(dataset, [train_size, val_size, test_size])

batch_size = 50

train_loader = DataLoader(training_data, batch_size, shuffle=True, num_workers=4, pin_memory=True)
valid_loader = DataLoader(validation_data, batch_size*2, num_workers=4, pin_memory=True)

【问题讨论】:

  • 你的代码中targets的形状是什么?
  • targets.shape = (999, 1) inputs.shape = (999, 11)
  • 在创建张量数据集之前尝试targets = targets.squeeze(1)。
  • 现在我收到了这个错误:RuntimeError: mat1 and mat2 shapes can be multiplied (11x1 and 11x8)跨度>

标签: python numpy machine-learning deep-learning pytorch


【解决方案1】:

根据我从 cmets 讨论中收集到的信息,该错误由以下内容重现。

import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset, random_split

inputs = torch.randn(999, 11, dtype=torch.float32)
targets = torch.randint(5, (999, 1), dtype=torch.long)

# you need this to adapt from pandas, but not for this example code
# inputs = torch.tensor(inputs, dtype=torch.float32)
# targets = torch.tensor(targets)

dataset = TensorDataset(inputs, targets)

val_size = 200
test_size = 100
train_size = len(dataset) - (val_size + test_size)

# Divide dataset into 3 unique random subsets
training_data, validation_data, test_data = random_split(dataset, [train_size, val_size, test_size])

batch_size = 50

train_loader = DataLoader(training_data, batch_size, shuffle=True, num_workers=4, pin_memory=True)
valid_loader = DataLoader(validation_data, batch_size*2, num_workers=4, pin_memory=True)

# guess model. More on this in a moment
model = nn.Sequential(
    nn.Linear(11, 8),
    nn.Linear(8, 5),
)

loss_func = nn.CrossEntropyLoss()

for features, labels in train_loader:
    out = model(features)
    loss = loss_func(out, labels)
    print(f"{loss = }")
    break

解决方案 1

将labels.squeeze(-1) 添加到循环体中

for features, labels in train_loader:
    out = model(features)
    labels = labels.squeeze()
    loss = loss_func(out, labels)
    print(f"{loss = }")
    break

解决方案 2

最初使用扁平化目标

targets = torch.tensor(targets[:, 0])

回应

现在我收到此错误:RuntimeError: mat1 and mat2 形状不能相乘(11x1 和 11x8)我还应该补充一点,我正在使用大小为 8 的隐藏层,并且我有 5 个类

我的架构猜测你正在使用什么,但由于上面的代码已通过目标重塑解决,我需要更多的帮助。

也许有一些文档可以提供帮助? CrossEntropyLoss 示例代码显示目标的预期形状为N,而不是N, 1 或N, classes。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2021-09-13
    • 2021-08-11
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多