MATLAB训练神经网络小结
1、一个典型例子
例如输入特征为10维,想训练一个10x20x10x1的三层ANN,代码可以这样写:
% 直接生成两个隐藏层即可
net=feedforwardnet([20,10]);
% 定义好输入和输出数组X,Y
net=train(net,X,Y)
% 这里要注意的一个问题,例如X原始定义的是[10000,10],Y定义的是[10000,1],
% 因为我们都喜欢定义列向量,这个时候需要改变代码
net=train(net,X',Y'); % 需要将X和Y进行转置
1.1 可视化神经网络
% 这个很简单
view(net)
1.2 指定某一层的激活函数
注意,这里必须设置的是每层统一的激活函数。不可能设置每个神经元不同的激活函数。
% 例如将最后一层激活函数设置为线性函数
net.layers{end}.transferFcn='purelin';
注意,matlab中很多激活函数与普通激活函数命令不一样,例如tanh
激活函数在matlab中为tansig
,这个问题需要额外注意。
1.3 训练神经网络时使用L1正则化
net.trainParam.regularization.type='L1'
1.4返回训练过程中的参数
[net,tr]=train(net,X,Y);
% tr中包含每轮训练epoch过程中的训练集、验证集、测试集误差变化
1.5 查看训练好的权重系数
net.Iw % 由输入权重值组成的 numLayers x numInputs 元胞数组
net.Lw % 由层权重值组成的numLayers x numLayers 元胞数组
net.b % 由偏置值组成的numLayers x 1 元胞数组
1.6 如何使用早停法来防止过拟合
net.trainParam.max_fail=10 % 指定最大连续失败次数,如果网络连续10次验证集没有改善,
% 则停止训练
2、如何利用MATLAB训练好的模型进行工程化
在前面讲述了一堆训练小技巧之后,我们终于得到了每一层网络的权重系数,每一个神经元的截距,每个神经元的激活函数。但是我们如果仅仅按照这些信息,自己在matlab中尝试将输入使用Wx+b
的形式得到输出,会发现根本得不到正确的输出。
原因在于matlab在训练神经网络时对每个输入特征都事先进行了最大最小归一化(注意,这里仅对训练集、验证集、测试集中的训练集做了归一化操作
)
最大最小归一化操作如下
x
n
o
r
m
=
x
−
x
m
i
n
x
m
a
x
−
x
m
i
n
x_{norm}=\frac{x-x_{min}}{x_{max}-x_{min}}
xnorm=xmax−xminx−xmin
,这样的话,便将输入归一化到了[-1,1]
的范畴。注意,这里千万不能归一化到[0,1]
的范畴,不然会出错。
因此,如果我们要利用W
和b
来进行网络工程化,必须先拿到训练集的每个输入的最大值及最小值,然后进行归一化。利用归一化后的输入经过神经网络预测后,再进行反归一化得到相应的输出。
2.1 genFunction(net)
其实讲完前面,已经可以自行实现工程化了。
这里,可以使用genFunction(net)
,net为已经训练好的神经网络结构模型,可以用该方法来查看训练过程中的完整流程。里面详细讲述了每个输入进行归一化和反归一化的方法,包括所训练好的权重和截距也在其中。