Matlab神经网络函数newff()新旧用法差异
摘要
在Matlab R2010a版中,如果要创建一个具有两个隐含层、且神经元数分别为5、3的前向BP网络,使用旧的语法可以这样写:
net1 = newff(minmax(P), [5 3 1]);
注意minmax()函数的使用,还有对输出层神经元数(1)的指定。
当然也可以采用新的语法,更简洁(请留意差异):
net2 = newff(P, T, [5 3]);
不用求minmax,也不用人工指定输出层神元数了(newff会根据参数T自行推导)。
不过,为了得到与书本示例接近的结果,接下来需要清除net2.divideFcn等属性再训练,否则结果相去甚远,且远不止一个数量级。
net2.divideFcn = '';
net2.inputs{1}.processFcns = {}; % 1是输入层所在网络层编号
net2.outputs{3}.processFcns = {}; % 3 是输出层所在网络层编号
正文
最近在看朱凯的《精通Matlab神经网络》,到第10章例10-3时,发现newff()的新旧用法得到的结果相去甚远。
书中例10-3采用了旧式写法,代码如下:
% 例10-3,旧式写法 clear all P = [-1 -1 2 2; 0 5 0 5]; T = [-1 -1 2 2]; %% 旧式语法 net1 = newff(minmax(P),[5 1],{'tansig', 'purelin'}, 'traingd'); % 隐含层有5个神经元 net1.trainParam.goal = 1e-5; net1.trainParam.epochs = 300; net1.trainParam.lr = 0.05; net1.trainParam.showWindow = 1; net1= train(net1,P,T); Y1 = sim(net1,P); disp(['旧式语法 mse: ' num2str(mse(T-Y1))]); |
训练窗口最终如下:
程序输出如下:
Warning: NEWFF used in an obsolete way. > In nntobsu at 18 In newff at 86 See help for NEWFF to update calls to the new argument list. 旧式语法 mse: 9.8073e-006 |
很明显,达到了设定的1e-5的目标。
不过我们也收到了警告,建议我们采用新的参数列表。于是查帮助,改成新的写法,代码如下:
% 例10-3,新式写法 clear all P = [-1 -1 2 2; 0 5 0 5]; T = [-1 -1 2 2]; %% 新式语法 net2 = newff(P,T,5,{'tansig', 'purelin'}, 'traingd'); % 隐含层有5个神经元 net2.trainParam.goal = 1e-5; net2.trainParam.epochs = 300; net2.trainParam.lr = 0.05; net2.trainParam.showWindow = 1; net2 = train(net2,P,T); Y2 = sim(net2,P); disp(['新式语法 mse: ' num2str(mse(T-Y2))]); |
训练窗口:
程序输出:
新式语法 mse: 10.7499 |
可见,远远没有达到1e-5的目标。
这是为什么呢?QQ群咨询无果,无奈之下自行研究源码。
newff.m分成三大块:主程序、新版实现子函数 new_5p1()、旧版实现子函数 new_5p0()。通过仔细比较新旧这两个子函数,发现新版设置了 net.divideFcn 属性,其值为'dividerand'。该函数把样本数据三分为训练集、验证集和测试集,默认比例是6:2:2。于是在我的程序中清除该属性再训练:
% 例10-3,新写法,改进 clear all P = [-1 -1 2 2; 0 5 0 5]; T = [-1 -1 2 2]; %% 新式语法 net2 = newff(P,T,5,{'tansig', 'purelin'}, 'traingd'); % 隐含层有5个神经元 net2.trainParam.goal = 1e-5; net2.trainParam.epochs = 300; net2.trainParam.lr = 0.05; net2.trainParam.showWindow = 1; net2.divideFcn = ''; % 为和书本一致,对于样本极少的情况,不要再三分了 net2 = train(net2,P,T); Y2 = sim(net2,P); disp(['新式语法,改进 mse: ' num2str(mse(T-Y2))]); |
训练窗口:
程序输出:
新式语法,改进 mse: 9.8129e-006 |
也达到了预期目标。
其实,新旧两次的训练窗口和Performance窗口也可以发现端倪的,此处不再细说,请各位看官自行对比。
当然,至于新版为什么要引入divideFcn必有其道理,我是初学者,有所揣测暂不表,先跟着书走。
Matlab神经网络函数newff()新旧用法差异的更多相关文章
- Spring - BeanFactory 新旧工厂差异
在将要被加入到spring容器中的service中,添加static静态代码块(加载类时被调用),用于判断spring中新旧bean工厂的加载性质. package com.witwicky.serv ...
- [Q&A]VS 2012 MVC4专案与网站的差异?「ASP.NET组态」的Login账号出现在「新旧两组」会员数据库里面?
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/30/mvc4_vs2012_login_member_db.aspx [Q&a ...
- 浅谈 angular新旧版本问题
一直在学习angularJs,之前用的版本比较老,前些天更新了一下angularJs的版本,然后发现了一些问题,希望和大家分享一下. 在老的版本里控制器直接用函数定义就可以 比如: 在angularJ ...
- A/B_test改变新旧网页 观察用户的引流效果
代码处:https://github.com/xubin97/Data-analysis_exp2 分析A/B测试结果 目录 简介 I - 概率 II - A/B 测试 简介 首先这个项目数据来自某公 ...
- sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异
问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表.修改表.删除表.新增字段.修改字段.删除字段等变化,如果人工检查,数据库表和字段比较多的 ...
- sql server新旧数据库的表结构差异
sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异 问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表.修改表. ...
- [转帖]InfluxDB 1.2.0安装及新旧版本的注意事项
InfluxDB 1.2.0安装及新旧版本的注意事项 http://haibing.org/245?zwlqby=npztq3 挺好的文章 很好的解决了 上一个文档里面 关于 web admin 的问 ...
- Android新旧版本Notification
Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...
- [ACM_数学] Taxi Fare [新旧出租车费差 水 分段函数]
Description Last September, Hangzhou raised the taxi fares. The original flag-down fare in Hangzhou ...
随机推荐
- activeamq启动失败
启动activeamq,启动时控制台显示: INFO: Using java '/usr/bin/java'INFO: Starting - inspect logfiles specified in ...
- 【转】WPF 窗体淡入淡出动画
第一种 <Window.Triggers> <EventTrigger RoutedEvent="Window.Loaded" > <BeginSto ...
- regular expressions
- java集合类(二)
第十六天知识点总结 一.泛型 泛型:java jdk 1.5 新特性. 泛型的好处: 1.运行时的错误提前到编译时. 2.避免无谓的强制类型转换 自定义方法泛型:自定义泛型就是一个数据类型的占位或一个 ...
- 第八十八天请假 PHP smarty模板 变量调节器,方法和块函数基本书写格式
变量调节器 : 文件命名格式(modifier.名称.php) 前端调用方式<{变量|名称:参数:参数……}>可组合使用,用|隔开 <?php /* 命名格式 smarty_mod ...
- compile error
stray \241 程序有非法字符,如空格,引号等,一般因为从别的地方粘贴导致这个错误.
- Reflector 已经out了,试试ILSpy[转]
Reflector是.NET开发中必备的反编译工具.即使没有用在反编译领域,也常常用它来检查程序集的命名规范,命名空间是否合理,组织类型的方法是否需要改善.举例说明,它有一个可以查看程序集完整名称的功 ...
- Oracle SQL*plus常用的命令和函数
常用命令: 连接sqlplus命令行下运行cmd进入,如以sys模式登陆,命令如下:(1).sqlplus "sys/zhb126 as sysdba" (2).sqlplus/n ...
- GRUB密码设置
通过编辑GRUB启动参数可以轻松的进入单用户模式从而修改root密码,GRUB的密码设置可分为全局密码和菜单密码. 一,全局密码设置 在splashimage这个参数的下一行可以加上passw ...
- C# 编程指南-事件
来自微软官方的msdn: 首页:https://msdn.microsoft.com/zh-cn/library/ms366768.aspx 1.如何:订阅和取消订阅事件 2.如何:发布符 ...