废话不多,方法简单: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

你可能感兴趣的:(深度学习,python,机器学习,神经网络,pytorch,人工智能,numpy)