tjdnbj 2024-02-02 10:50 采纳率: 41.2%
浏览 1

深度学习多层感知机基础问题提问

以下是我的代码,想问一下为什么会出现mat1 and mat2 shapes cannot be multiplied (256x256 and 10x256)这个错误呢?该如何修改呢?

img

import torch
import numpy as np
import torchvision
import torchvision.transforms as transforms
import sys
sys.path.append("C:/Users/zyx20/Desktop/深度学习编程/pythonProject")
import d2lzh_pytorch as d2l
batch_size = 256
if sys.platform.startswith('win'):
    num_workers = 0  # 0表示不用额外的进程来加速读取数据
else:
    num_workers = 4
mnist_train = torchvision.datasets.FashionMNIST(root='C:/Users/zyx20/Desktop/深度学习编程/MNIST/raw', train=True, download=True, transform=transforms.ToTensor())
mnist_test = torchvision.datasets.FashionMNIST(root='C:/Users/zyx20/Desktop/深度学习编程/MNIST/raw', train=False, download=True, transform=transforms.ToTensor())
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)
#定义模型参数
num_inputs,num_outputs,num_hiddens=784,10,256
W1=torch.tensor(np.random.normal(0,0.01,(num_inputs,num_hiddens)))
b1=torch.zeros(num_hiddens)
W2=torch.tensor(np.random.normal(0,0.01,(num_outputs,num_hiddens)))
b2=torch.zeros(num_outputs)

params=[W1,b1,W2,b2]
for param in params:
    param.requires_grad_(requires_grad=True)
#定义激活函数
def relu(X):
    return torch.max(input=X,other=torch.tensor(0.0))
#定义模型
def net(X):
    X=X.view((-1,num_inputs))
    H=relu(torch.matmul(X,W1)+b1)
    return torch.matmul(H,W2)+b2
#定义损失模型
loss=torch.nn.CrossEntropyLoss()
#训练模型
num_epochs,lr=5,100.0
def train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params=None,lr=None,optimizer=None):
    for epoch in range(num_epochs):
        train_l_sum,train_acc_sum,n=0.0,0.0,0
        for X,y in train_iter:
            y_hat=net(X)
            l=loss(y_hat,y).sum()

            #梯度清零
            if optimizer is not None:
                optimizer.zero_grad()
            elif params is not None and params[0].grad is not None:
                for param in params:
                    param.grad.data.zero_()

            l.backward()
            if optimizer is None:
                d2l.sgd(params,lr,batch_size)
            else:
                optimizer.step()

            train_l_sum+=l.item()
            train_acc_sum+=(y_hat.argmax(dim=1)==y).sum().item()
            n+=y.shape[0]
        test_acc=evaluate_accuracy(test_iter,net)
        print('epoch %d,loss %.4f,train acc %.3f,test acc %.3f'%(epoch+1,train_l_sum/n,train_acc_sum/n,test_acc))
train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params,lr)

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-02 10:51
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的代码中,错误提示mat1 and mat2 shapes cannot be multiplied (256x256 and 10x256)发生在矩阵乘法操作torch.matmul(H,W2)处。根据矩阵乘法规则,第一个矩阵的列数必须与第二个矩阵的行数相匹配才能进行乘法运算。然而,在您的网络定义中:

    • H的维度是(batch_size, num_hiddens),即每个批次中的样本数量(这里是256)乘以隐藏层神经元个数(256)。
    • W2的维度是(num_outputs, num_hiddens),即输出类别数(10)乘以隐藏层神经元个数(256)。

    所以当尝试将HW2相乘时,就出现了形状不匹配的问题,因为H的列数(256)并不等于W2的行数(10)。

    要修正这个错误,请确保输出层权重矩阵W2的形状与隐藏层激活后的输出H相匹配。在这个例子中,应将W2的形状改为(num_outputs, num_hiddens)(num_outputs, num_inputs),以便与输入层到隐藏层后展平的尺寸(-1, num_inputs)对应。

    修改后的W2初始化部分应该是:

    W2 = torch.tensor(np.random.normal(0, 0.01, (num_outputs, num_inputs)))
    

    这样修改之后,W2的行数将会与H的列数相同,从而解决矩阵乘法时的形状不匹配问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月2日

悬赏问题

  • ¥15 通过AT指令控制esp8266发送信息
  • ¥15 有哪些AI工具提供可以通过代码上传EXCEL文件的API接口,并反馈分析结果
  • ¥15 二维装箱算法、矩形排列算法(相关搜索:二维装箱)
  • ¥20 nrf2401上电之后执行特定任务概率性一直处于最大重发状态
  • ¥15 二分图中俩集合中节点数与连边概率的关系
  • ¥20 wordpress如何限制ip访问频率
  • ¥15 自研小游戏,需要后台服务器存储用户数据关卡配置等数据
  • ¥15 请求解答odoo17外发加工某工序的实操方法
  • ¥20 IDEA ssm项目 跳转页面报错500
  • ¥20 系统直接进入应急模式了,请教一下,人要裂开了