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=xmaxxminxxmin
,这样的话,便将输入归一化到了[-1,1]的范畴。注意,这里千万不能归一化到[0,1]的范畴,不然会出错。

因此,如果我们要利用Wb来进行网络工程化,必须先拿到训练集的每个输入的最大值及最小值,然后进行归一化。利用归一化后的输入经过神经网络预测后,再进行反归一化得到相应的输出。

2.1 genFunction(net)

其实讲完前面,已经可以自行实现工程化了。
这里,可以使用genFunction(net),net为已经训练好的神经网络结构模型,可以用该方法来查看训练过程中的完整流程。里面详细讲述了每个输入进行归一化和反归一化的方法,包括所训练好的权重和截距也在其中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值