废话不多,方法简单:RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x16 and 20x64)

这是非常常见的问题,主要有以下两种情况:

1. 卷积层和全连接层之间的参数数量不对应,两个张量(矩阵)相乘,一定是 第一个矩阵的列数=第二个矩阵的行数。

2. 全连接神经网络:当前网络结构输出的神经元数和设置的神经元不匹配,因此需要重新设置fc层的神经元数

这里我们主要说第二种情况!

原代码:

class FCNNModel(torch.nn.Module):
    def __init__(self,input_num,hidden_num1,hidden_num2,output_num):
        super().__init__()
        self.input_num=input_num
        self.hidden_num1=hidden_num1
        self.hidden_num2=hidden_num2
        self.output_num=output_num
        self.layer1 = nn.Sequential(nn.Linear(self.input_num, self.hidden_num1), nn.SiLU())
        self.layer2 = nn.Sequential(nn.Linear(self.hidden_num1, self.hidden_num2), nn.SiLU())
        self.layer3 = nn.Sequential(nn.Linear(self.hidden_num2, self.output_num))
    def forward(self,input):
        input = self.layer1(input)
        input = self.layer2(input)
        output = self.layer3(input).to(device)
        return output


batch_size=16
u_num=1 # 表示输入特征中的 u 的数量
y_num=1 # 表示输入特征中的 y 的数量
x_num=4 # 表示输出(状态预测结果)特征的数量
seq_length=10 # 序列长度:表示每个序列的时间步数
input_size=u_num+y_num # u_num和y_num相加,得到输入特征的总数input_size
input_num=input_size*seq_length # 代表输入数据的大小,seq_length是序列的长度,input_size是每个序列元素的特征数,因此input_num代表将序列展开后总的输入特征数量
hidden_num1=64
hidden_num2=16
output_num=x_num # 输出特征的数量


model1 = FCNNModel(input_num, hidden_num1, hidden_num2, output_num) # 实例化模型

for i, batch_u in enumerate(train_loader):
xk_1 = model1(batch_u)
  • 首先,我们需要理解nn.Linear(a,b)函数的意思是,FC层的输入神经元为a,输出神经元为b
  • 错误原因:输入是(1,16),第一层linear层是(20,64)
  • 解决方法:建议直接把batch_size = 16改成batch_size = 20
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值