目录
- 问题由来
- 预处理相关属性
- 预处理函数
- 预处理参数
- 修改默认映射变换
- 通过exampleInput和exampleOutput进行设置
- 通过configure函数进行设置
- 结语
问题由来
毕业论文中用到神经网络了,我用的MATLAB的神经网络工具箱nntoolbox去开发。nntoolbox默认会对输入输出进行映射变换,将输入和输出映射到[-1, 1]的区间中,也就是我们常说的“归一化”。这本身是一件好事,因为如果输入输出范围相差很大的话会对训练效果产生不良影响,并且这个过程是由MATLAB自动完成的,十分方便。
但是,我在使用过程中有两种情况需要对此映射做出一些修改:第一是不希望进行映射变换,就是在某些特殊情况下,我希望输入输出就是我的原始数据;第二是nntoolbox默认把训练集作为映射的定义域,在某些情况下,我希望自己定义映射的定义域。在这两个需求的驱动下,对nntoolbox的神经网络配置进行了一番探究,在这里总结一下。
预处理相关属性
nntoolbox生成的network类对象关于输入输出预处理的属性都存放在其中的inputs和outputs属性中,照例还是生成一个net1作为后续的展示对象。
net1 = feedforwardnet(10);
这里net1依然是一个隐含层具有10个节点的两层BP网络。
预处理函数
首先我们来看一下预处理函数,预处理函数的信息存放在
net1.inputs{1, 1}.processFcns
中,回车之后可以看到
这里表明输入有两个预处理函数,第一个是移除常值,而第二个则是值域映射函数,归一化的主要操作就是由这个mapminmax函数完成。
至于输出的预处理函数,自然也可以通过下面代码来查看。
net1.outputs{1, 2}.processFcns
预处理参数
对于每一个预处理函数,它的相关设置参数可以通过
net1.inputs{1, 1}.processSettings{1, 2}
来查看,因为上面可以看到有两个预处理函数,每个预处理函数的设置都是一个cell元素,所以要查看mapminmax的设置的话需要加上下标{1, 2},回车之后可以看到
在上述这些参数里面,x表示映射前的数据属性,y表示映射后的数据属性。可以看到,因为目前我们还没有为这个网络配置输入输出,所以包括xrows、xmax、xmin、xrange以及xoffset在内的一系列属性都为空。同时,我们也可以看到,虽然yrows也为0,但是ymin、ymax还有yrange分别被配置成-1,1和2,这说明在默认情况下,输入将会被映射到[-1, 1]这个大小为2的区间中。下面我们尝试为这个网络配置输入输出,看看会发生什么改变。
使用以下语句分别产生输入和输出矢量并利用输入输出矢量对net1进行配置。
t = 0: 0.1: 10; % 产生输入矢量
y = sin(t); % 产生输出矢量
net1 = configure(net1, t, y); % 利用输入输出矢量以及configure函数对net1进行配置
这个时候如果我们再看输入的预处理属性就会发现变成了这样
可以看到,代表输入侧的x系列属性已经发生了变化,由于我们配置的网络输入是0到10,所以
xmin = 0
xmax = 10
xrange = 10
并且可以留意到最后一个no_change属性也由1变成0,这实际上是一个逻辑变量,0表示输入会发生变化,1表示输入不发生变化。
同样,网络输出的映射变换属性可以通过下列代码查看
net1.outputs{1, 2}.processSettings{1, 2}
修改默认映射变换
看完相关函数和属性,就来到最关键的地方,怎么自定义我自己的映射变换关系呢。
有人可能会说了,刚才的processSettings里面不是有一项no_change属性吗,如果我将它设为1,那不就相当于不让MATLAB去变换了吗。
巧了,我一开始也是这么想的,但是后来发现不行,为什么不行呢,看下面这段话
net.inputs{i}.processSettings (read only)
This property holds a row cell array of processing function settings to be used by ith network input. The processing settings are found by applying the processing functions and parameters to exampleInput and then used to provide consistent results to new input values before the network uses them.
这是MATLAB帮助文档里截的,后面一大段话其实可以不看,只要看第一行最后两个单词就可以了:read only。只读啊,所以我们不能修改里面的参数。
那应该怎么进行修改呢,有两种方法。
- 通过exampleInput和exampleOutput属性进行配置
- 利用configure函数进行配置
通过exampleInput和exampleOutput进行设置
首先来说第一种,exampleInput和exampleOutput是告诉MATLAB我这个网络的典型输入输出是什么,MATLAB再根据这个典型输入输出进行预处理相关属性的设置。所以如果我们把我们希望定义的映射范围给传进去,那么就可以改变默认的映射变换关系。
我们首先来看一下现在的exampleInput是什么
net1.inputs{1, 1}.exampleInput
可以看到,因为目前还没有配置,所以exampleInput为空。
如果我们希望不进行预处理,也就是保持原有输入输出不变,那么我们可以这样设置exampleInput
net1.inputs{1, 1}.exampleInput = [1, -1];
这语句就是告诉MATLAB,我这个网络典型输入输出就是1和-1,你根据这个范围给我设置吧。所以如果我们这个时候再看processSettings会发现
输入侧的相应属性已经被修改了。同理可以通过exampleOutput来设置网络输出的映射变换关系。
通过configure函数进行设置
下面来说第二种,第一种要设置的内容藏得太深了,找起来不优雅,下面介绍第二种设置的方法。
首先重置一下网络
net1 = feedforwardnet(10);
net1 = configure(net1, t, y);
这个时候processSettings就还是之前的模样了
这次我们换一个情况,虽然我们的输入是[0, 10],但是我并不希望它不进行预处理,而是希望它将输入侧的定义域由[0, 10]改成[0, 5],那么我们可以这么做
selfDefinedRange = [0, 5];
net1 = configure(net1, selfDefinedRange);
第一句代码其实也是在定义exampleInput,但是并不是直接将它赋给exampleInput属性,而是通过configure函数来进行设置,这个时候再看processSettings就会发现
输入的范围按照我们的设想发生了相应的变化。
结语
以上就是关于MATLAB神经网络工具箱输入输出预处理相关参数的一个设置教程,希望对大家有帮助。另外如果有什么讲错的地方也欢迎大家批评指正。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)