一个多层的神经网络由若干层构成,每层均是其下一层数据的变换结果,若记第i层的数据为y(i),其下一层数据为y(i-1),则从y(i-1)到y(i)的变换可表示为y(i)=s(y(i-1)*w),s(*)为传递函数一般选择sigmoid函数,对于最后一层的s(*)一般会有其他选择,如做回归问题时可选择使用线性传递函数,分类时使用softmax函数。一个多层神经网络的包含一组参数{w}和最后一层使用的传递函数,初始化时需要指出{w}的形状,和最后一层使用的传递函数。如:
net1 = nnet([500,50,20,10],'');
制定构建一个2个隐层的神经网络,输入有500维,输出有10维,中间两个隐层到节点数分别为50和20,最后一层使用softmax压缩输出使之具有概率意义。
训练时使用训练数据调整参数{w}的取值,训练数据包含两部分X和Y,X是输入,Y是对应的预期的输出,输入矩阵X中每行是一个样本,输出矩阵Y每行是一个样本,一般的,Y使用1 of N的编码方式。
训练时使用
net2 = nnetrain(net1,X,Y,1000);
表示在net1到基础上使用训练数据{X,Y},迭代训练1000次得到net2。
多层神经网络可以接受输入产生对应到输出,如需要得到输入数据x,在net2处理后的输出可以使用
y=nnetfw(net2,x);
输入矩阵x中每行是一个样本。
=========================================================
可以使用无监督训练初始化多层神经网络的参数{w},我们使用RBM(受限波尔兹曼机)来实现这个目的。RBM可以逐层初始化参数{w}。下面是一个例子。
-------------------------------------------------------------------------------------------
rbm1 = rbm([500,50]);
rbm1 = checkrbmtrain(@rbmtrain,rbm1,X,10,0.1);
net_rbm1 = rbm2nnet(rbm1,'up');
h1 = nnetfw(net_rbm1,X);
rbm2 = rbm([50,20]);
rbm2 = checkrbmtrain(@rbmtrain,rbm2,h1,10,0.1);
net_rbm2 = rbm2nnet(rbm2,'up');
h2 = nnetfw(net_rbm2,h1);
net1 = nnet([500,50,20,10],'softmax');
net1.w{1} = net_rbm1.w{1};
net1.w{2} = net_rbm2.w{1};
net2 = nnetrain(net1,X,Y,1000);
----------------------------------------------------------------------------------------
rbm1 = rbm([500,50]);
rbm1 = checkrbmtrain(@rbmtrain,rbm1,X,10,0.1);
net_rbm1 = rbm2nnet(rbm1,'up');
h1 = nnetfw(net_rbm1,X);
是初始化RBM并进行训练的过程,首先建立一个输入是500维有50个隐层节点的RBM,第2行开始训练,checkrbmtrain第一个参数是如何训练RBM,有两种可选方法,@rbmtrain和@grbmtrain,如果输入数据符合二项分布使用@rbmtrain,如果输入数据符合高斯分布(正态分布)使用@grbmtrain,输入矩阵x中每行是一个样本。使用@rbmtrain是请将输入规范化到0-1之间,可以使用下面的方法完成:
Xmin = min(X);
Xmax = max(X);
X = bsxfun(@rdivide,bsxfun(@minus,X,Xmin),(Xmax-Xmin));
使用@grbmtrain是请将输入规范化到方差为1,最好是可以将均值规范化为0,可以使用下面的方法完成:
Xmean = mean(X);
Xstd = std(X);
X = bsxfun(@rdivide,bsxfun(@minus,X,Xmean),Xstd);
checkrbmtrain第3个参数表示每隔多少次检测是否停止训练,第4个参数表示初始的学习效率。
第3行将RBM转换为神经网络以便后续处理。
第4行得到经RBM变换后的结果,这个结果用于训练下一层。
-------------------------------------------------------------------------------------------------------
net1 = nnet([500,50,20,10],'softmax');
net1.w{1} = net_rbm1.w{1};
net1.w{2} = net_rbm2.w{1};
net2 = nnetrain(net1,X,Y,1000);
新建多层神经网络,并将RBM初始化得到的结果配置到网络中,net1的第1个w来自于rbm1,net1的第2个w来自于rbm2。之后可以在次训练整个多层网络。
评论30
最新资源