You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理神经网络多维度输入?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:21:42