首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pytorch tensorDataset类时的“一维目标张量期望”误差

使用pytorch tensorDataset类时的“一维目标张量期望”误差
EN

Stack Overflow用户
提问于 2021-10-08 23:45:35
回答 1查看 183关注 0票数 1

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

代码语言:javascript
复制
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

代码:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-11 19:52:01

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

代码语言:javascript
复制
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)添加到循环体a la中

代码语言:javascript
复制
for features, labels in train_loader:
    out = model(features)
    labels = labels.squeeze()
    loss = loss_func(out, labels)
    print(f"{loss = }")
    break

解决方案2

将你的目标首先用

代码语言:javascript
复制
targets = torch.tensor(targets[:, 0])

为了回应

现在我得到了一个错误: RuntimeError: mat1和mat2形状不能相乘(11x1和11x8),我还应该添加一个8大小的隐藏层,我有5个类

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

CrossEntropyLoss示例代码显示了目标的预期形状是N,而不是N, 1N, classes

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69502691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档