关于深度学习的一些个人浅见:
深度学习通常是训练深度(多层)神经网络,用于模式识别(如语音、图像识别);深度网络 指是具有深层(多层)网络结构的神经网络。
深层网络由于神经元多,参数多,拟合表现能力强,有表现欲解决复杂问题的能力。
但是深度网络存在很多局部最优解,深度网络的训练容易停留在局部最优上,初始参数的选择对网络最终收敛在那个位置有很大的影响。
采用限制玻尔兹曼机RBM对深度网络做逐层无监督训练,将各单层训练得到的参数作为深度网络各层神经元的初始参数,该参数是深度网络参数空间的一个较好位置(容易)。
RBM逐层训练出深度网络参数初值后,在用传统的BP算法对深度网络进行训练,如此,深度网络的参数最终将收敛在一个好的位置。
RBM通过迭代大量数据的无监督训练,把能够提炼出训练数据的较本质的特征,这被认为是好的初始参数。
本例子为matlab编写,为用数字识别训练一个手写数字识别的深度神经网络。
另外需要DBN的支持代码,可以从这里下载:http://download.****.net/detail/hzq20081121107/7857735,http://pan.baidu.com/s/1c0fBQsK
网络结构采用 784,400,200,100,50,20,10的网络结构。
function aGetDeepNet() clc clear all %得到训练数据 load('adata.mat','train_digitdata','train_targets'); X = train_digitdata; Y = train_targets; %输入数据初始化 Xmin = min(X); Xmax = max(X); X = bsxfun(@rdivide,bsxfun(@minus,X,Xmin),(Xmax-Xmin)); %RBM训练得到第一隐层的网络参数,rbm输入为图片数据 rbm1 = rbm([784,400]); rbm1 = checkrbmtrain(@rbmtrain1,rbm1,X,50,0.1); net_rbm1 = rbm2nnet(rbm1,'up'); h1 = nnetfw(net_rbm1,X); %RBM训练得到第二隐层的网络参数,输入为第一隐层的输出 rbm2 = rbm([400,200]); rbm2 = checkrbmtrain(@rbmtrain1,rbm2,h1,50,0.1); net_rbm2 = rbm2nnet(rbm2,'up'); h2 = nnetfw(net_rbm2,h1); %RBM训练得到第三隐层的网络参数,输入为第二隐层的输出 rbm3 = rbm([200,100]); rbm3 = checkrbmtrain(@rbmtrain1,rbm3,h2,50,0.1); net_rbm3 = rbm2nnet(rbm3,'up'); h3 = nnetfw(net_rbm3,h2); %RBM训练得到第四隐层的网络参数,输入为第三隐层的输出 rbm4 = rbm([100,50]); rbm4 = checkrbmtrain(@rbmtrain1,rbm4,h3,50,0.1); net_rbm4 = rbm2nnet(rbm4,'up'); h4 = nnetfw(net_rbm4,h3); %RBM训练得到第五隐层的网络参数,输入为第四隐层的输出 rbm5 = rbm([50,20]); rbm5 = checkrbmtrain(@rbmtrain1,rbm5,h4,50,0.1); net_rbm5 = rbm2nnet(rbm5,'up'); h5 = nnetfw(net_rbm5,h4); %构建深度网络,并初始化参数为rbm训练出的参数。 net1 = nnet([784,400,200,100,50,20,10],'softmax'); net1.w{1} = net_rbm1.w{1}; net1.w{2} = net_rbm2.w{1}; net1.w{3} = net_rbm3.w{1}; net1.w{4} = net_rbm4.w{1}; net1.w{5} = net_rbm5.w{1}; %对深度网络进行BP训练 net2 = nnettrain(net1,X,Y,1000);