问题

PyTorch 运行时错误:mat1和 mat2形状不能相乘


纯粹为了学习,我想让下面的代码工作,没有 DataLoader。我经常使用 Huggingface 变换器,但我一直在与 PyTorch 尺寸作斗争,所以我从“使用 PyTorch 进行深度学习”一书中的一些简单项目开始。书中的一个问题建议在超级简单的线性模型上使用葡萄酒质量数据集。我一直在努力处理数据的维度,我认为这是我的错误的根源:

RuntimeError: mat1 and mat2 shapes cannot be multiplied (3919x1 and 11x100)

数据可在此处获得

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)

谢谢!

推荐答案

我匆忙交换了训练数据和标签。这里是固定部分。

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(data_train) # <1>
        loss_train = loss_fn(t_p_train, target_train)

        t_p_val = model(data_val) # <1>
        loss_val = loss_fn(t_p_val, target_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}")