[英]'1D target tensor expected' error when using pytorch tensorDataset class
我想知道為什么會發生此錯誤。 我的直覺告訴我,tensorDataset 讀取最后一列作為標簽,但我不知道為什么如果我輸入一個單獨的標簽數據集作為第二個參數,它為什么會這樣。 另外,有人可以准確解釋 one-hot 編碼的工作原理以及我如何解決這個問題,因為我每個項目只想要一個 label 嗎?
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)
根據我從評論討論中收集到的信息,錯誤由以下內容重現。
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
將labels.squeeze(-1)
添加到循環體 a la
for features, labels in train_loader:
out = model(features)
labels = labels.squeeze()
loss = loss_func(out, labels)
print(f"{loss = }")
break
最初將您的目標展平
targets = torch.tensor(targets[:, 0])
回應
現在我收到這個錯誤:RuntimeError: mat1 and mat2 shapes cannot be multiplied (11x1 and 11x8) 我還應該補充一點,我使用的是大小為 8 的隱藏層,我有 5 個類
我的架構是對您正在使用的內容的猜測,但由於上面的代碼已通過目標重塑解決,我需要更多才能提供更多幫助。
也許有一些文件可以提供幫助? CrossEntropyLoss示例代碼顯示目標的預期形狀是N
,而不是N, 1
或N, classes
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.