【问题标题】:PyTorch RuntimeError: mat1 and mat2 shapes cannot be multipliedPyTorch RuntimeError:mat1 和 mat2 形状不能相乘
【发布时间】: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.shapetorch.Size([3919, 11]) 而 target_train 只是分类标签。我应该添加空值来扩展形状吗?
  • 好的。您在哪里将 data_train 传递给您的模型 (seq_model)?
  • 是的,尽管我意识到在发布之前重命名变量并不明显(!)为了​​清楚起见。我仍然有同样的问题。 t_c_train 应该是 data_traint_c_val 应该是 data_val
  • 我有标签和数据,它正在工作!!很抱歉浪费了时间。

标签: python python-3.x pytorch


【解决方案1】:

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

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}")

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多