前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度信念网络DBN的一个matlab实例「建议收藏」

深度信念网络DBN的一个matlab实例「建议收藏」

作者头像
全栈程序员站长
发布2022-07-28 18:06:38
7640
发布2022-07-28 18:06:38
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

关于深度学习的一些个人浅见:

深度学习通常是训练深度(多层)神经网络,用于模式识别(如语音、图像识别);深度网络 指是具有深层(多层)网络结构的神经网络。

深层网络由于神经元多,参数多,拟合表现能力强,有表现欲解决复杂问题的能力。

但是深度网络存在很多局部最优解,深度网络的训练容易停留在局部最优上,初始参数的选择对网络最终收敛在那个位置有很大的影响。

采用限制玻尔兹曼机RBM对深度网络做逐层无监督训练,将各单层训练得到的参数作为深度网络各层神经元的初始参数,该参数是深度网络参数空间的一个较好位置(容易)。

RBM逐层训练出深度网络参数初值后,在用传统的BP算法对深度网络进行训练,如此,深度网络的参数最终将收敛在一个好的位置。

RBM通过迭代大量数据的无监督训练,把能够提炼出训练数据的较本质的特征,这被认为是好的初始参数。

本例子为matlab编写,为用数字识别训练一个手写数字识别的深度神经网络。

另外需要DBN的支持代码,可以从这里下载:http://download.csdn.net/detail/hzq20081121107/7857735,http://pan.baidu.com/s/1c0fBQsK

网络结构采用 784,400,200,100,50,20,10的网络结构。

代码语言:javascript
复制
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);

%用训练好的深度网络net2分类识别
y = nnetfw(net2,X);

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128693.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档