运行时错误:matmul 的两个参数都必须至少为 1d,但它们是 0d 和 2d

问题描述 投票:0回答:2

这是我写的代码,我尝试过到处修改,但总是遇到同样的错误。由于我是 PyTorch 的初学者,我只是尝试看看机器学习是否适用于线性数据集。因此,我随机初始化了一个数据集。然后,制作了一个单一的线性神经网络。然后,根据线性数据训练神经网络。尽管如此,我有一个错误,指出 matmul 需要 1d 数据,但我的数据至少是 1d,但却被读取为 0d。

import torch 
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import random

class LinearNetwork(nn.Module):
    def __init__(self):
        super(LinearNetwork, self).__init__()
        self.fc1 = nn.Linear(1, 1)

    def forward(self, input):
        x = self.fc1(input)
        return x; 

#Generate a Dataset to train on. Just a linear function, and we wanna see if this thing is working 
DataSet = []
grad = random.randint(0,100)
const = random.randint(0,100)
for i in range(0, 1000):
    DataSet.append([i, grad*i + const])

DataSet = torch.tensor(DataSet,dtype = torch.double, requires_grad = True)

#Declare a Linear Network
Net = LinearNetwork()
criterion = nn.MSELoss()
optimizer = optim.SGD(Net.parameters(), lr = 0.01)
print(DataSet)
#Train Model 
for i, data in enumerate(DataSet, 0):
    Input, Target = data
    optimizer.zero_grad()
    Output = Net(Input)
    loss = criterion(Output, Target)
    loss.backward()
    optimizer.step()

print("Gradient of the Function is : " + str(grad))
print("Constant Value of the Function is : " + str(const))
print("Learned Gradient and Constant : " + list(Net.parameters()))
python pytorch runtime-error artificial-intelligence matmul
2个回答
4
投票

您的代码中有两个错误,第一个与形状有关,第二个与

dtypes
有关。顺便提一句。请使用
snake_case
表示变量(例如
my_dataset
net
),使用
CamelCase
表示类,因为这是常见的 Python 约定。

形状错误

这个就在这里:

for i, data in enumerate(DataSet, 0):
    input, target = data
    optimizer.zero_grad()
    output = net(input)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()

当你打印

input.shape
时,你会得到
torch.Size([])
,这是一个
0d
张量。矩阵乘法需要
1d
张量,所以你应该
unsqueeze
它所以它有这个维度。将上面的
output = net(input)
更改为:

output = net(input.unsqueeze(dim=0))

dtype
错误

这里:

DataSet = torch.tensor(DataSet,dtype = torch.double, requires_grad = True)

您创建

torch.double
类型的张量,而您的神经网络(默认情况下)为
torch.float
类型。通常使用后者,因为它具有足够的数值精度并节省内存。因此,您应该这样做,而不是上面的:

DataSet = torch.tensor(DataSet,dtype = torch.float, requires_grad = True)

再次塑造

回到形状,神经网络应该在至少二维上运行:

(batch, features)
。在你的情况下
batch=1
features=1
,所以它应该再次被解压(我建议你使用批量尝试你的代码)。


0
投票

我在下面遇到了同样的错误:

运行时错误:matmul 的两个参数都必须至少为 1D,但它们是 0D 和 2D

因为我尝试将 0D 和 2D 张量与 matmul()

@
相乘,如下所示。 *
matmul()
@
可以通过点乘或矩阵乘法来乘以1D或更多D张量:

import torch

tensor1 = torch.tensor(5) # 0D tensor
tensor2 = torch.tensor([[2, 7, 4]]) # 2D tensor

torch.matmul(tensor1, tensor2) # Error
tensor1 @ tensor2 # Error

所以,我将一维和二维张量与

matmul()
@
相乘,然后我可以得到如下所示的结果:

import torch

tensor1 = torch.tensor([5]) # 1D tensor
tensor2 = torch.tensor([[2, 7, 4]]) # 2D tensor

torch.matmul(tensor1, tensor2) # tensor([10, 35, 20])
tensor1 @ tensor2 # tensor([10, 35, 20])

或者,我将 0D 和 2D 张量与 mul()

*
相乘,然后可以得到如下所示的结果。 *
mul()
*
可以通过逐元素乘法将0D或更多D张量相乘:

import torch

tensor1 = torch.tensor(5) # 0D tensor
tensor2 = torch.tensor([[2, 7, 4]]) # 2D tensor

torch.mul(tensor1, tensor2) # tensor([[10, 35, 20]])
tensor1 * tensor2 # tensor([[10, 35, 20]])
© www.soinside.com 2019 - 2024. All rights reserved.