pytorch 错误:mat1和mat2形状不能相乘(1000x10和1x1)

jchrr9hc  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(232)

我尝试在pytorch中实现岭回归,定义损失函数,并在不同的迭代中绘制该函数。唯一的问题是,我一直得到一个错误代码:mat1和mat2形状不能相乘(1000x10和1x1)。我想将第二个矩阵转换为1x10以完成代码,但似乎无法使其工作。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

n = 1000
p = 10

mean = np.zeros((p))
val = 0.8
cov = np.ones((p,p))*val
cov = cov + np.eye(p)*(1-val)

np.random.seed(10)
X = np.random.multivariate_normal(mean, cov, n)
theta_true = np.concatenate((np.ones((5,1)), np.zeros((5,1))),axis=0)

delta=0.5
Sigma = np.eye(n,n,k=-1)*0.4 + np.eye(n,n)*1 + np.eye(n,n,k=1)*0.4
mean = np.zeros(n)
e = np.random.multivariate_normal(mean, Sigma, 1)

y=X@theta_true + delta*e.T

import torch
X_t = torch.from_numpy(X).float()
y_t = torch.from_numpy(y).float()
Sigma_t = torch.from_numpy(Sigma).float()

import torch.nn as nn
import torch.nn.functional as F

class MyLinear(nn.Module):
    def __init__(self): 
        super(MyLinear, self).__init__()
        self.linear = nn.Linear(1, 1)  
    def forward(self, x): 
        out = self.linear(x)
        return out

def L2_norm(model):
    return torch.sum(list(model.parameters())[0]**2)    

def L1_norm(model):
    return torch.sum(torch.abs(list(model.parameters())[0]))

def ridge_loss(y_pred, y_true, model, lambda_):
    mse = F.mse_loss(y_pred, y_true)
    regularization = lambda_ * L2_norm(model)
    return mse + regularization

import matplotlib.pyplot as plt

model = MyLinear()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

lambda_ = 0.1
num_epochs = 1000
loss_values = []

for epoch in range(num_epochs):
    optimizer.zero_grad()
    y_pred = model(X_t)
    loss = ridge_loss(y_pred, y_t, model, lambda_)
    loss_values.append(loss.item())
    loss.backward()
    optimizer.step()

plt.plot(loss_values)
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.title('Ridge Regression Loss over Iterations')
plt.show()

我尝试改变theta_true的定义来转换矩阵,但是发生了同样的错误。

theta_true = np.concatenate((np.ones((5,1)), np.zeros((5,1)))).reshape(10, 1)
cwtwac6a

cwtwac6a1#

MyLinear中的Linear层(第37行)是导致该问题的原因。

self.linear = nn.Linear(1, 1)

表示1个输入通道,1个输出通道,但x的形状为(1000,10),表示它有10个通道。因此,需要将该行更改为

self.linear = nn.Linear(10, 1)

这就可以了,这是我得到的图像:

相关问题