MultiLayer Perceptron报错:维度(13,13)与(1,1)不匹配,求解决方法
这个ValueError是矩阵乘法维度不兼容导致的:要相乘的两个数组/张量,前一个的列数(13)和后一个的行数(1)不相等,不符合矩阵乘法的基本规则(要求第一个矩阵的列数等于第二个矩阵的行数)。你需要重点检查以下内容:
权重矩阵的初始化维度
多层感知机每一层的权重矩阵维度必须和前后层的节点数匹配,规则是[输入特征数, 输出特征数]。比如输入层是13维、隐藏层设13个节点,那隐藏层权重应该是(13,13);如果后续和它相乘的张量是(1,1),说明权重维度或后续张量维度肯定有一个错了,仔细核对各层权重的初始化代码。输入数据的形状
检查喂入模型的输入数据维度是否正确。比如本该是[样本数, 特征数]的输入,是否被误处理成[特征数, 样本数]?单样本输入时,是否把形状搞成了(1,)而不是(1,13)?输入形状错误会直接导致和权重矩阵相乘时维度错位。前向传播的矩阵乘法顺序
查看前向传播代码里的乘法逻辑,比如隐藏层计算是inputs @ weights还是weights @ inputs?矩阵乘法顺序直接决定维度是否匹配:如果输入是(样本数, 13)、权重是(13,13),正确顺序是inputs @ weights,得到(样本数,13)的结果;顺序搞反的话,就会出现(13,13)和(样本数,13)(单样本时是(1,13))的错误相乘尝试。偏置项的维度与加法逻辑
偏置项的维度要和对应层的输出维度一致。比如隐藏层输出是(样本数,13),偏置应该是(1,13)或可广播的(13,);如果偏置被错误初始化成(1,1),在和隐藏层输出相加时可能触发广播错误,间接导致后续乘法维度不匹配。输出层的维度匹配
如果报错出现在输出层前的乘法,检查输出层权重的维度是否和隐藏层输出、最终输出维度匹配。比如隐藏层输出是(13,),输出层权重应该是(13, 输出类别数);如果误写成(1,1),就会出现(13,13)(隐藏层输出经权重后是13维)和(1,1)相乘的错误。
内容的提问来源于stack exchange,提问作者Lucas Tezolini

