MATLAB BP神经网络中仿真结果与手工计算不符合的解决办法

前言

  • 最近在学习深度学习,在编写Auto Encoder提取隐含层的输出值时发现,使用MATLAB中自带的sim函数计算得到的神经网络输出值与自己手工计算的前向传播输出值不符合。
  • 经过查阅后发现在旧版本中的newff函数,神经网络输入值的归一化以及输出值的反归一化是编程者自己写的,而新版本的newff函数 MATLAB则会自动帮我们完成归一化与反归一化。这意味着,如果手工计算用新版本newff函数训练出来的BP神经网络,则需要进行手工的归一化与反归一化。
clear
clc

% 输入数据
X = [1 2 3;2 3 4;3 4 5;4 5 6];
% X = [1 2 3;
%      2 3 4;
%      3 4 5;
%      4 5 6];
% 期望归一化到[-1, 1]区间中,即
% normX = [-1 0 1;
%      -1 0 1;
%      -1 0 1;
%      -1 0 1];
Y = X;

% 创建一个4个输入神经元,2个隐含层神经元,4个输出神经元的BP神经网络
net = newff(X, Y, 2); % 新版本newff函数
% net = newff(minmax(X), [2 4], {'tansig', 'purelin'}); % 旧版本newff函数

% 设置训练数据集占原有数据集的百分比
net.divideParam.trainRatio = 1;
 
% 训练
net = train(net, X, X);

% 仿真,看结果
net(X)

% 归一化到[-1 1]区间,
[normX, PS] = mapminmax(X);

% 为了测试我们拿第一个数据进行手工前向计算
x = normX(:, 1);

% 计算隐含层输出值
z1 = netsum(net.iw{1} * x, net.b{1})
a1 = tansig(z1)

% 计算输出层输出值
z2 = netsum(net.lw{2} * a1, net.b{2})
a2 = purelin(z2)

% 反归一化
y = mapminmax('reverse', a2, PS);


disp(y);

disp(Y(:, 1));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 昨天在跟朋友聊天的时候他问了我一个问题,大意上是:「你写作有因为每天写而越来越快吗?」。这个问题让我稍微思考了一下...
    林家弘阅读 1,517评论 0 0
  • frank的关键词:1·业余码字2·专职工作3·朴实真诚的人4·35岁拥有25岁奋斗的心5·业余写作,从零到赚钱2...
    五彩冰峰阅读 1,306评论 0 0
  • 路遥,这个四十二岁便赍志而殁的优秀作家。 论及路遥,语含不屑甚至轻蔑的,自然大有人在。那些傲慢而浅薄的编辑,那...
    林六壬阅读 4,351评论 4 13
  • 恩田 公公1元 爸爸1元 妈妈1元 悲田 1元 敬田 1元 均已完成 有收入进来,拿出百分之10
    星光2017阅读 1,522评论 0 4

友情链接更多精彩内容