如何处理神经网络多维度输入?Matlab前馈网络输入报错解决
R³向量叉积预测神经网络报错修复
问题背景
尝试编写前馈神经网络实现R³空间内2个向量的叉积预测:
- 训练输入
Xtrain维度为3×2×1000,由1000个3×2矩阵构成,每个矩阵对应一组输入的2个3维列向量 - 训练标签
Ytrain维度为3×1000,每个列向量对应同序号输入两个向量的叉积结果
初始实现代码如下:
Xtrain = zeros(3,2,1000); Ytrain = zeros(3,1000); for c = 1:1000 v1 = -1 + (1+1)*rand(3,1); v2 = -1 + (1+1)*rand(3,1); C = cross(v1,v2); m = [v1, v2]; Xtrain(:,:,c) = m; Ytrain(:,c) = C; end net = feedforwardnet([3 2]); net.layers{1}.transferFcn = 'tansig'; net.layers{2}.transferFcn = 'purelin'; net = train(net, Xtrain, Ytrain);
运行时Matlab抛出错误:Inputs X is not two-dimensional.
错误原因
Matlab原生feedforwardnet(前馈神经网络)要求输入必须为二维矩阵:矩阵每一列对应一个独立样本,每一行对应一个输入特征维度,不支持直接传入三维数组作为训练输入。当前代码中Xtrain是3×2×1000的三维数组,不符合接口要求,因此触发报错。
最优解决方案
对三维输入数组做维度重构,将每个样本的3×2输入矩阵展平为6维列向量,把整个训练集转换为6×1000的二维矩阵即可。该方案不会丢失任何输入信息,不需要修改网络训练逻辑,也不需要引入自定义层,是解决该问题成本最低、稳定性最高的方案。
修正后的完整代码如下:
Xtrain = zeros(3,2,1000); Ytrain = zeros(3,1000); for c = 1:1000 v1 = -1 + 2*rand(3,1); v2 = -1 + 2*rand(3,1); C = cross(v1,v2); m = [v1, v2]; Xtrain(:,:,c) = m; Ytrain(:,c) = C; end % 核心修正:重构输入维度为符合要求的二维矩阵 Xtrain = reshape(Xtrain, 6, 1000); net = feedforwardnet([3 2]); net.layers{1}.transferFcn = 'tansig'; net.layers{2}.transferFcn = 'purelin'; % 提示:原网络第二层隐藏层设为2个神经元,而最终输出是3维叉积结果,可能存在拟合能力不足的问题,可根据训练效果调整隐藏层神经元数量,例如配置为[6 3] net = train(net, Xtrain, Ytrain);
补充说明
- 代码中
-1 + (1+1)*rand(3,1)可简化为-1 + 2*rand(3,1),生成的随机向量范围完全一致,都是[-1,1]区间的均匀分布 - 展平操作仅调整数据存储结构,不会改变两个输入向量的数值,网络可以正常学习叉积的运算规则
- 训练完成后做推理时,也需要将新的输入样本按同样规则展平为6维列向量再传入网络
内容的提问来源于stack exchange,提问作者ouad1
相关产品推荐
相关产品推荐

