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

关于深度学习的一些个人浅见:   深度学习通常是训练深度(多层)神经网络,用于模式识别(如语音、图像识别);深度网络指是具有深层(多层)网络结构的神经网络。   深层网络由于神经元多,参数多,拟合表现能力强,有表现欲解决复杂问题的能力。   但是深度网络存在很多局部最优解,深度网络的训练容易停留在局部最优上,初始参数的选择对网络最终收敛在那个位置有很大的影响。

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

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

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

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

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

     采用限制玻尔兹曼机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的网络结构。

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.net/128693.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 十大滤波算法总结「建议收藏」

    十大滤波算法总结「建议收藏」由于MPU6050的深入,我也学会了一些滤波算法,自己写了一些算法,收集了一些算法,供大家一起学习分享,我的代码都是经过反复试验,复制到Arduino中就能开跑的成品代码,移植到自己的程序中非常方便。而且都仔细研究了各个算法,把错误都修正了的,所以也算个小原创吧,在别人基础上的原创。1、限幅滤波法(又称程序判断滤波法)2、中位值滤波法3、算术平均滤波法4、递推平均滤波法(又称滑动平

    2022年6月14日
    30
  • java 错误: 找不到符号遇到的几种情况

    java 错误: 找不到符号遇到的几种情况今天在学习java面向对象的时候写了两个类,在运行时出现了以下错误:然后下面是我的两个java类publicclassArrayTool{ ArrayTool(){ } publicintgetMax(int[]arr){ intmax=0; for(inti=0;i

    2022年7月8日
    22
  • intlij 激活插件破解方法

    intlij 激活插件破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    49
  • hashmap和hashtable和hashset的区别_为什么要用hashmap

    hashmap和hashtable和hashset的区别_为什么要用hashmap1.HashMap1) hashmap的数据结构     Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示:     当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形

    2025年12月2日
    7
  • 玻尔兹曼公式推导碰撞项_玻尔兹曼方程表达式

    玻尔兹曼公式推导碰撞项_玻尔兹曼方程表达式在做别的事之前,让我们试做一个假想的研究。假定我们有一个很好的能跟踪单个运动粒子而不产生任何其他效应的激光探测器,把这个探测器应用在一个波尔兹曼气体上,可以很容易发现,无论粒子间碰撞能否忽略,牛顿轨道方程始终是有意义的(如果需要考虑碰撞,沿牛顿轨道的粒子存活几率是应该引进的)。问题就这样产生了:因为波尔兹曼方程和给定的初值边值条件已经构成了一个完全集合,我们是否应该简单的无视牛顿方程?如果牛顿方程…

    2022年8月11日
    6
  • orange软件使用[通俗易懂]

    orange做数据分析契机实验手册目录orange软件部分界面展示小试牛刀:数据导入和展示小试牛刀:散点图绘制总结契机今天在上大数据时代实验课,作为一名软件工程专业的大三学生,在上这节公选课之前就决定这节课做完这个学期所有的实验报告,可以说“有亿点”不屑;尤其当老师说Python很麻烦的时候,我更是震惊了,因为我接触过这么多编程语言,Python真的很友好了,很傻瓜,但是当老师打开实验手册的时候,我真香了!!!下面先来看看手册的目录:实验手册目录为什么会真香呢,因为目录里这些有好多机器学习算法!

    2022年4月4日
    678

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号