Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1

http://blog.csdn.net/sunbow0

Spark MLlib Deep Learning工具箱,是依据现有深度学习教程《UFLDL教程》中的算法。在SparkMLlib中的实现。详细Spark MLlib Deep Learning(深度学习)文件夹结构:

第一章Neural Net(NN)

1、源代码

2、源代码解析

3、实例

第二章Deep Belief Nets(DBNs)

1、源代码

2、源代码解析

3、实例

第三章Convolution Neural Network(CNN)

第四章 Stacked Auto-Encoders(SAE)

第五章CAE

第二章Deep Belief Network (深度信念网络)

1源代码

眼下Spark MLlib Deep Learning工具箱源代码的github地址为:

https://github.com/sunbow1/SparkMLlibDeepLearn

1.1 DBN代码

package DBNimport org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.RDD
import org.apache.spark.Logging
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.linalg.distributed.RowMatriximport breeze.linalg.{Matrix => BM,CSCMatrix => BSM,DenseMatrix => BDM,Vector => BV,DenseVector => BDV,SparseVector => BSV,axpy => brzAxpy,svd => brzSvd
}
import breeze.numerics.{exp => Bexp,tanh => Btanh
}import scala.collection.mutable.ArrayBuffer
import java.util.Random
import scala.math._/*** W:权重* b:偏置* c:偏置*/
case class DBNweight(W: BDM[Double],vW: BDM[Double],b: BDM[Double],vb: BDM[Double],c: BDM[Double],vc: BDM[Double]) extends Serializable/*** 配置參数*/
case class DBNConfig(size: Array[Int],layer: Int,momentum: Double,alpha: Double) extends Serializable/*** DBN(Deep Belief Network)*/class DBN(private var size: Array[Int],private var layer: Int,private var momentum: Double,private var alpha: Double) extends Serializable with Logging {//                  var size=Array(5, 10, 10)//                  var layer=3//                  var momentum=0.0//                  var alpha=1.0/*** size = architecture;         网络结构* layer = numel(nn.size);      网络层数* momentum = 0.0;              Momentum* alpha = 1.0;                 alpha*/def this() = this(DBN.Architecture, 3, 0.0, 1.0)/** 设置神经网络结构. Default: [10, 5, 1]. */def setSize(size: Array[Int]): this.type = {this.size = sizethis}/** 设置神经网络层数据. Default: 3. */def setLayer(layer: Int): this.type = {this.layer = layerthis}/** 设置Momentum. Default: 0.0. */def setMomentum(momentum: Double): this.type = {this.momentum = momentumthis}/** 设置alpha. Default: 1. */def setAlpha(alpha: Double): this.type = {this.alpha = alphathis}/*** 深度信念网络(Deep Belief Network)* 执行训练DBNtrain*/def DBNtrain(train_d: RDD[(BDM[Double], BDM[Double])], opts: Array[Double]): DBNModel = {// 參数配置 广播配置val sc = train_d.sparkContextval dbnconfig = DBNConfig(size, layer, momentum, alpha)// 初始化权重var dbn_W = DBN.InitialW(size)var dbn_vW = DBN.InitialvW(size)var dbn_b = DBN.Initialb(size)var dbn_vb = DBN.Initialvb(size)var dbn_c = DBN.Initialc(size)var dbn_vc = DBN.Initialvc(size)// 训练第1层printf("Training Level: %d.\n", 1)val weight0 = new DBNweight(dbn_W(0), dbn_vW(0), dbn_b(0), dbn_vb(0), dbn_c(0), dbn_vc(0))val weight1 = RBMtrain(train_d, opts, dbnconfig, weight0)dbn_W(0) = weight1.Wdbn_vW(0) = weight1.vWdbn_b(0) = weight1.bdbn_vb(0) = weight1.vbdbn_c(0) = weight1.cdbn_vc(0) = weight1.vc// 打印权重printf("dbn_W%d.\n", 1)val tmpw0 = dbn_W(0)for (i <- 0 to tmpw0.rows - 1) {for (j <- 0 to tmpw0.cols - 1) {print(tmpw0(i, j) + "\t")}println()}// 训练第2层 至 n层for (i <- 2 to dbnconfig.layer - 1) {// 前向计算x//  x = sigm(repmat(rbm.c', size(x, 1), 1) + x * rbm.W');printf("Training Level: %d.\n", i)val tmp_bc_w = sc.broadcast(dbn_W(i - 2))val tmp_bc_c = sc.broadcast(dbn_c(i - 2))val train_d2 = train_d.map { f =>val lable = f._1val x = f._2val x2 = DBN.sigm(x * tmp_bc_w.value.t + tmp_bc_c.value.t)(lable, x2)}// 训练第i层val weighti = new DBNweight(dbn_W(i - 1), dbn_vW(i - 1), dbn_b(i - 1), dbn_vb(i - 1), dbn_c(i - 1), dbn_vc(i - 1))val weight2 = RBMtrain(train_d2, opts, dbnconfig, weighti)dbn_W(i - 1) = weight2.Wdbn_vW(i - 1) = weight2.vWdbn_b(i - 1) = weight2.bdbn_vb(i - 1) = weight2.vbdbn_c(i - 1) = weight2.cdbn_vc(i - 1) = weight2.vc// 打印权重printf("dbn_W%d.\n", i)val tmpw1 = dbn_W(i - 1)for (i <- 0 to tmpw1.rows - 1) {for (j <- 0 to tmpw1.cols - 1) {print(tmpw1(i, j) + "\t")}println()}}new DBNModel(dbnconfig, dbn_W, dbn_b, dbn_c)}/*** 深度信念网络(Deep Belief Network)* 每一层神经网络进行训练rbmtrain*/def RBMtrain(train_t: RDD[(BDM[Double], BDM[Double])],opts: Array[Double],dbnconfig: DBNConfig,weight: DBNweight): DBNweight = {val sc = train_t.sparkContextvar StartTime = System.currentTimeMillis()var EndTime = System.currentTimeMillis()// 权重參数变量var rbm_W = weight.Wvar rbm_vW = weight.vWvar rbm_b = weight.bvar rbm_vb = weight.vbvar rbm_c = weight.cvar rbm_vc = weight.vc// 广播參数val bc_config = sc.broadcast(dbnconfig)// 训练样本数量val m = train_t.count// 计算batch的数量val batchsize = opts(0).toIntval numepochs = opts(1).toIntval numbatches = (m / batchsize).toInt// numepochs是循环的次数 for (i <- 1 to numepochs) {StartTime = System.currentTimeMillis()val splitW2 = Array.fill(numbatches)(1.0 / numbatches)var err = 0.0// 依据分组权重,随机划分每组样本数据  for (l <- 1 to numbatches) {// 1 广播权重參数val bc_rbm_W = sc.broadcast(rbm_W)val bc_rbm_vW = sc.broadcast(rbm_vW)val bc_rbm_b = sc.broadcast(rbm_b)val bc_rbm_vb = sc.broadcast(rbm_vb)val bc_rbm_c = sc.broadcast(rbm_c)val bc_rbm_vc = sc.broadcast(rbm_vc)//        // 打印权重//        println(i + "\t" + l)//        val tmpw0 = bc_rbm_W.value//        for (i <- 0 to tmpw0.rows - 1) {//          for (j <- 0 to tmpw0.cols - 1) {//            print(tmpw0(i, j) + "\t")//          }//          println()//        }// 2 样本划分val train_split2 = train_t.randomSplit(splitW2, System.nanoTime())val batch_xy1 = train_split2(l - 1)//        val train_split3 = train_t.filter { f => (f._1 >= batchsize * (l - 1) + 1) && (f._1 <= batchsize * (l)) }//        val batch_xy1 = train_split3.map(f => (f._2, f._3))// 3 前向计算// v1 = batch;// h1 = sigmrnd(repmat(rbm.c', opts.batchsize, 1) + v1 * rbm.W');// v2 = sigmrnd(repmat(rbm.b', opts.batchsize, 1) + h1 * rbm.W);// h2 = sigm(repmat(rbm.c', opts.batchsize, 1) + v2 * rbm.W');// c1 = h1' * v1;// c2 = h2' * v2;val batch_vh1 = batch_xy1.map { f =>val lable = f._1val v1 = f._2val h1 = DBN.sigmrnd((v1 * bc_rbm_W.value.t + bc_rbm_c.value.t))val v2 = DBN.sigmrnd((h1 * bc_rbm_W.value + bc_rbm_b.value.t))val h2 = DBN.sigm(v2 * bc_rbm_W.value.t + bc_rbm_c.value.t)val c1 = h1.t * v1val c2 = h2.t * v2(lable, v1, h1, v2, h2, c1, c2)}// 4 更新前向计算        // rbm.vW = rbm.momentum * rbm.vW + rbm.alpha * (c1 - c2)     / opts.batchsize;// rbm.vb = rbm.momentum * rbm.vb + rbm.alpha * sum(v1 - v2)' / opts.batchsize;// rbm.vc = rbm.momentum * rbm.vc + rbm.alpha * sum(h1 - h2)' / opts.batchsize;// W 更新方向val vw1 = batch_vh1.map {case (lable, v1, h1, v2, h2, c1, c2) =>c1 - c2}val initw = BDM.zeros[Double](bc_rbm_W.value.rows, bc_rbm_W.value.cols)val (vw2, countw2) = vw1.treeAggregate((initw, 0L))(seqOp = (c, v) => {// c: (m, count), v: (m)val m1 = c._1val m2 = m1 + v(m2, c._2 + 1)},combOp = (c1, c2) => {// c: (m, count)val m1 = c1._1val m2 = c2._1val m3 = m1 + m2(m3, c1._2 + c2._2)})val vw3 = vw2 / countw2.toDoublerbm_vW = bc_config.value.momentum * bc_rbm_vW.value + bc_config.value.alpha * vw3// b 更新方向val vb1 = batch_vh1.map {case (lable, v1, h1, v2, h2, c1, c2) =>(v1 - v2)}val initb = BDM.zeros[Double](bc_rbm_vb.value.cols, bc_rbm_vb.value.rows)val (vb2, countb2) = vb1.treeAggregate((initb, 0L))(seqOp = (c, v) => {// c: (m, count), v: (m)val m1 = c._1val m2 = m1 + v(m2, c._2 + 1)},combOp = (c1, c2) => {// c: (m, count)val m1 = c1._1val m2 = c2._1val m3 = m1 + m2(m3, c1._2 + c2._2)})val vb3 = vb2 / countb2.toDoublerbm_vb = bc_config.value.momentum * bc_rbm_vb.value + bc_config.value.alpha * vb3.t// c 更新方向val vc1 = batch_vh1.map {case (lable, v1, h1, v2, h2, c1, c2) =>(h1 - h2)}val initc = BDM.zeros[Double](bc_rbm_vc.value.cols, bc_rbm_vc.value.rows)val (vc2, countc2) = vc1.treeAggregate((initc, 0L))(seqOp = (c, v) => {// c: (m, count), v: (m)val m1 = c._1val m2 = m1 + v(m2, c._2 + 1)},combOp = (c1, c2) => {// c: (m, count)val m1 = c1._1val m2 = c2._1val m3 = m1 + m2(m3, c1._2 + c2._2)})val vc3 = vc2 / countc2.toDoublerbm_vc = bc_config.value.momentum * bc_rbm_vc.value + bc_config.value.alpha * vc3.t// 5 权重更新// rbm.W = rbm.W + rbm.vW;// rbm.b = rbm.b + rbm.vb;// rbm.c = rbm.c + rbm.vc;rbm_W = bc_rbm_W.value + rbm_vWrbm_b = bc_rbm_b.value + rbm_vbrbm_c = bc_rbm_c.value + rbm_vc// 6 计算误差val dbne1 = batch_vh1.map {case (lable, v1, h1, v2, h2, c1, c2) =>(v1 - v2)}val (dbne2, counte) = dbne1.treeAggregate((0.0, 0L))(seqOp = (c, v) => {// c: (e, count), v: (m)val e1 = c._1val e2 = (v :* v).sumval esum = e1 + e2(esum, c._2 + 1)},combOp = (c1, c2) => {// c: (e, count)val e1 = c1._1val e2 = c2._1val esum = e1 + e2(esum, c1._2 + c2._2)})val dbne = dbne2 / counte.toDoubleerr += dbne}EndTime = System.currentTimeMillis()// 打印误差结果printf("epoch: numepochs = %d , Took = %d seconds; Average reconstruction error is: %f.\n", i, scala.math.ceil((EndTime - StartTime).toDouble / 1000).toLong, err / numbatches.toDouble)}new DBNweight(rbm_W, rbm_vW, rbm_b, rbm_vb, rbm_c, rbm_vc)}}/*** NN(neural network)*/
object DBN extends Serializable {// Initialization mode namesval Activation_Function = "sigm"val Output = "linear"val Architecture = Array(10, 5, 1)/*** 初始化权重* 初始化为0*/def InitialW(size: Array[Int]): Array[BDM[Double]] = {// 初始化权重參数// weights and weight momentum// dbn.rbm{u}.W  = zeros(dbn.sizes(u + 1), dbn.sizes(u));val n = size.lengthval rbm_W = ArrayBuffer[BDM[Double]]()for (i <- 1 to n - 1) {val d1 = BDM.zeros[Double](size(i), size(i - 1))rbm_W += d1}rbm_W.toArray}/*** 初始化权重vW* 初始化为0*/def InitialvW(size: Array[Int]): Array[BDM[Double]] = {// 初始化权重參数// weights and weight momentum// dbn.rbm{u}.vW = zeros(dbn.sizes(u + 1), dbn.sizes(u));val n = size.lengthval rbm_vW = ArrayBuffer[BDM[Double]]()for (i <- 1 to n - 1) {val d1 = BDM.zeros[Double](size(i), size(i - 1))rbm_vW += d1}rbm_vW.toArray}/*** 初始化偏置向量b* 初始化为0*/def Initialb(size: Array[Int]): Array[BDM[Double]] = {// 初始化偏置向量b// weights and weight momentum// dbn.rbm{u}.b  = zeros(dbn.sizes(u), 1);val n = size.lengthval rbm_b = ArrayBuffer[BDM[Double]]()for (i <- 1 to n - 1) {val d1 = BDM.zeros[Double](size(i - 1), 1)rbm_b += d1}rbm_b.toArray}/*** 初始化偏置向量vb* 初始化为0*/def Initialvb(size: Array[Int]): Array[BDM[Double]] = {// 初始化偏置向量b// weights and weight momentum// dbn.rbm{u}.vb = zeros(dbn.sizes(u), 1);val n = size.lengthval rbm_vb = ArrayBuffer[BDM[Double]]()for (i <- 1 to n - 1) {val d1 = BDM.zeros[Double](size(i - 1), 1)rbm_vb += d1}rbm_vb.toArray}/*** 初始化偏置向量c* 初始化为0*/def Initialc(size: Array[Int]): Array[BDM[Double]] = {// 初始化偏置向量c// weights and weight momentum// dbn.rbm{u}.c  = zeros(dbn.sizes(u + 1), 1);val n = size.lengthval rbm_c = ArrayBuffer[BDM[Double]]()for (i <- 1 to n - 1) {val d1 = BDM.zeros[Double](size(i), 1)rbm_c += d1}rbm_c.toArray}/*** 初始化偏置向量vc* 初始化为0*/def Initialvc(size: Array[Int]): Array[BDM[Double]] = {// 初始化偏置向量c// weights and weight momentum// dbn.rbm{u}.vc = zeros(dbn.sizes(u + 1), 1);val n = size.lengthval rbm_vc = ArrayBuffer[BDM[Double]]()for (i <- 1 to n - 1) {val d1 = BDM.zeros[Double](size(i), 1)rbm_vc += d1}rbm_vc.toArray}/*** Gibbs採样* X = double(1./(1+exp(-P)) > rand(size(P)));*/def sigmrnd(P: BDM[Double]): BDM[Double] = {val s1 = 1.0 / (Bexp(P * (-1.0)) + 1.0)val r1 = BDM.rand[Double](s1.rows, s1.cols)val a1 = s1 :> r1val a2 = a1.data.map { f => if (f == true) 1.0 else 0.0 }val a3 = new BDM(s1.rows, s1.cols, a2)a3}/*** Gibbs採样* X = double(1./(1+exp(-P)))+1*randn(size(P));*/def sigmrnd2(P: BDM[Double]): BDM[Double] = {val s1 = 1.0 / (Bexp(P * (-1.0)) + 1.0)val r1 = BDM.rand[Double](s1.rows, s1.cols)val a3 = s1 + (r1 * 1.0)a3}/*** sigm激活函数* X = 1./(1+exp(-P));*/def sigm(matrix: BDM[Double]): BDM[Double] = {val s1 = 1.0 / (Bexp(matrix * (-1.0)) + 1.0)s1}/*** tanh激活函数* f=1.7159*tanh(2/3.*A);*/def tanh_opt(matrix: BDM[Double]): BDM[Double] = {val s1 = Btanh(matrix * (2.0 / 3.0)) * 1.7159s1}}

1.2 DBNModel代码

package DBNimport breeze.linalg.{Matrix => BM,CSCMatrix => BSM,DenseMatrix => BDM,Vector => BV,DenseVector => BDV,SparseVector => BSV
}
import org.apache.spark.rdd.RDD
import scala.collection.mutable.ArrayBufferclass DBNModel(val config: DBNConfig,val dbn_W: Array[BDM[Double]],val dbn_b: Array[BDM[Double]],val dbn_c: Array[BDM[Double]]) extends Serializable {/*** DBN模型转化为NN模型* 权重转换*/def dbnunfoldtonn(outputsize: Int): (Array[Int], Int, Array[BDM[Double]]) = {//1 size layer 參数转换val size = if (outputsize > 0) {val size1 = config.sizeval size2 = ArrayBuffer[Int]()size2 ++= size1size2 += outputsizesize2.toArray} else config.sizeval layer = if (outputsize > 0) config.layer + 1 else config.layer//2 dbn_W 參数转换var initW = ArrayBuffer[BDM[Double]]()for (i <- 0 to dbn_W.length - 1) {initW += BDM.horzcat(dbn_c(i), dbn_W(i))}(size, layer, initW.toArray)}}

转载请注明出处:

http://blog.csdn.net/sunbow0

转载于:https://www.cnblogs.com/claireyuancy/p/7202234.html

Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1相关推荐

  1. A Comparative Analysis of Deep Learning Approaches for Network Intrusion Detection Systems (N-IDSs)

    论文阅读记录 数据类型 在预定义时间窗口中,按照传输控制协议/互联网协议(TCP/IP)数据包将网络流量数据建模成时间序列数据. 数据:KDDCup-99/ NSL-KDD/ UNSW-NB15 NI ...

  2. Deep Learning Hangzhou Meetup--华为2012实验室深度学习国际群 联合举办

    深度学习简介: 相比于传统的机器学习方法,经过训练后的深度神经网络模型(DNN)不仅可以明显提高模型预测结果的准确性,还可以大幅度提高算法的设计效率,以及算法预测的准确性. 现在深度学习技术以及渗透到 ...

  3. Deep Learning and the Information Bottleneck Principle 深度学习与信息瓶颈原理

    Deep Learning and the Information Bottleneck Principle 深度学习与信息瓶颈原理 摘要 从信息瓶颈(IB)原理的理论框架出发,对深度神经网络(DNN ...

  4. dive into deep learning 循环神经网络 RNN 部分 学习

    dive into deep learning 循环神经网络 RNN 部分 学习 到目前为止,我们遇到过两种类型的数据:表格数据和图像数据. 对于图像数据,我们设计了专门的卷积神经网络架构来为这类特殊 ...

  5. 【深度学习】孪生网络(Siamese Network)的模式和训练过程

    [深度学习]孪生网络(Siamese Network)的模式和训练过程 文章目录 1 概述 2 Siamese network 孪生神经网络 3 孪生神经网络和伪孪生神经网络分别适用于什么场景呢? 4 ...

  6. 深度学习02-神经网络(MLP多层感知器)

    文章目录 神经网络 简介 学习路径 分类 多层感知器(MLP) 神经网络认识 两层神经网络 输入层 从输入层到隐藏层 从隐藏层到输出层 激活层 输出的正规化 如何衡量输出的好坏 反向传播与参数优化 过 ...

  7. 深度学习深度前馈网络_深度学习前馈网络中的讲义第1部分

    深度学习深度前馈网络 FAU深度学习讲义 (FAU Lecture Notes in Deep Learning) These are the lecture notes for FAU's YouT ...

  8. 深度学习深度前馈网络_深度学习前馈网络中的讲义第4部分

    深度学习深度前馈网络 FAU深度学习讲义 (FAU Lecture Notes in Deep Learning) These are the lecture notes for FAU's YouT ...

  9. 【深度学习】图网络——悄然兴起的深度学习新浪潮

    [深度学习]图网络--悄然兴起的深度学习新浪潮 https://mp.weixin.qq.com/s/mOZDN9u7YCdtYs6DbUml0Q 现实世界中的大量问题都可以抽象成图模型(Graph ...

  10. 研究型论文_基于机器学习和深度学习的不平衡网络流量入侵检测(英文论文)

    文章目录 Intrusion Detection of Imbalanced Network Traffic Based on Machine Learning and Deep Learning 论 ...

最新文章

  1. java 卖票问题_Java之多线程窗口卖票问题(Thread)
  2. 关于(++i)+(++i)+(++i)与(++i)+(i++)与(i++)+(++i)
  3. linux防火墙之 ufw
  4. python微信红包代码_有了这个再也不担心任何微信红包,Python就是好用
  5. python语言程序设计西安电子科技大学答案-徐悦甡 | 个人信息 | 西安电子科技大学个人主页...
  6. pgsql 前10条_白沙湾南片区11条新建道路最新进度及建成时间,已建成一条!还有一条将通车...
  7. 查找域名、由名字查找某个熟知的端口、由名字查找协议
  8. 如何利用ide进行跟踪调试_使用调试器进行事后跟踪
  9. oracle_数据库对象
  10. php window.onload,tp_window.onload+相应操作
  11. textfield tips
  12. java se和ocjp_OCJP 考试题之七 - osc_sejhgcp0的个人空间 - OSCHINA - 中文开源技术交流社区...
  13. 基于Socket实现网络编程
  14. 怎么区分08cms房产系统V8.2/V8.3和旧版8.0以及8.1他们的区别不仅仅是破解版
  15. nginx 访问a 域名跳转到b域名_微信qq域名防红防封,怎么才能避免自己的域名被屏蔽...
  16. 摩拜单车骑行数据探索性分析【实战总结】
  17. 微软同步工具 for linux,使用SyncToy 同步Windows数据到linux
  18. 小明医声发布,看AI技术秀得飞起
  19. Airflow基础架构简介
  20. 关于SysinternalsSuite全部工具详解

热门文章

  1. 用 JavaScript 实现内存位翻转漏洞
  2. 批量数据替换助手V2.0版发布,欢迎使用
  3. java多线程知识点之wait和sleep的区别
  4. 【笔记】vim如何删除重复行
  5. 使用tcpdump抓Android网络包
  6. [2018.11.05 T3] 零食
  7. eslint+prettier+husky的配置说明
  8. git学习笔记-(5-树对象)
  9. mysql非阻塞通信协议_NIO 的非阻塞式网络通信
  10. android blowfish加密算法,BlowFish加密算法研究