【发布时间】:2021-07-20 05:56:24
【问题描述】:
纯粹为了学习,我想让下面的代码在没有 DataLoader 的情况下工作。我经常使用 Huggingface 变换器,但我一直在与 PyTorch 尺寸作斗争,所以我从“使用 PyTorch 进行深度学习”一书中的一些简单项目开始。书中的一个问题建议在超级简单的线性模型上使用葡萄酒质量数据集。我一直在努力处理数据的维度,我认为这是我的错误的根源:
RuntimeError: mat1 and mat2 shapes cannot be multiplied (3919x1 and 11x100)
数据可用here
import csv
from collections import OrderedDict
import numpy as np
import torch
import torch.optim as optim
import torch.nn as nn
wine_path = "winequality-white.csv"
wine_quality_numpy = np.loadtxt(wine_path, dtype=np.float32, delimiter=";",
skiprows=1)
col_list = next(csv.reader(open(wine_path), delimiter=';'))
wineq = torch.from_numpy(wine_quality_numpy)
# print(wineq.shape, wineq.dtype)
data = wineq[:, :-1]
target = wineq[:, -1]
target = target.unsqueeze(1)
n_samples = wine_quality_numpy.shape[0]
n_val = int(0.2 * n_samples)
shuffled_indices = torch.randperm(n_samples)
train_indices = shuffled_indices[:-n_val]
val_indices = shuffled_indices[-n_val:]
target_train = target[train_indices]
data_train = data[train_indices]
target_val = target[val_indices]
data_val = data[val_indices]
seq_model = nn.Sequential(OrderedDict([
('hidden_linear', nn.Linear(11, 100)),
('hidden_activation', nn.Tanh()),
('output_linear', nn.Linear(100, 7))
]))
def training_loop(n_epochs, optimizer, model, loss_fn, target_train, target_val,
data_train, data_val):
for epoch in range(1, n_epochs + 1):
t_p_train = model(target_train) # <1>
loss_train = loss_fn(t_p_train, data_train)
t_p_val = model(t_u_val) # <1>
loss_val = loss_fn(t_p_val, data_val)
optimizer.zero_grad()
loss_train.backward() # <2>
optimizer.step()
if epoch == 1 or epoch % 1000 == 0:
print(f"Epoch {epoch}, Training loss {loss_train.item():.4f},"
f" Validation loss {loss_val.item():.4f}")
optimizer = optim.SGD(seq_model.parameters(), lr=1e-3) # <1>
training_loop(
n_epochs = 5000,
optimizer = optimizer,
model = seq_model,
loss_fn = nn.MSELoss(),
target_train = target_train,
target_val = target_val,
data_train = data_train,
data_val = data_val)
谢谢!
【问题讨论】:
-
检查
target_train的形状。鉴于数据集有 11 个特征,它的形状应该是(3919, 11)。相反,您有(3919, 1),这意味着您正在传递单个特征的向量,但您的第一个隐藏层需要 11。 -
嗨@NikhilKumar 感谢您回复我。
data_train.shape是torch.Size([3919, 11])而 target_train 只是分类标签。我应该添加空值来扩展形状吗? -
好的。您在哪里将
data_train传递给您的模型 (seq_model)? -
是的,尽管我意识到在发布之前重命名变量并不明显(!)为了清楚起见。我仍然有同样的问题。
t_c_train应该是data_train和t_c_val应该是data_val。 -
我有标签和数据,它正在工作!!很抱歉浪费了时间。
标签: python python-3.x pytorch