当前位置: 首页 > news >正文

建设商城网站制作wordpress主页显示分类

建设商城网站制作,wordpress主页显示分类,成都网络运营公司,wordpress改域名后500简介 受限玻尔兹曼机是一种无监督#xff0c;重构原始数据的一个简单的神经网络。 受限玻尔兹曼机先把输入转为可以表示它们的一系列输出#xff1b;这些输出可以反向重构这些输入。通过前向和后向训练#xff0c;训练好的网络能够提取出输入中最重要的特征。 为什么RBM很… 简介 受限玻尔兹曼机是一种无监督重构原始数据的一个简单的神经网络。 受限玻尔兹曼机先把输入转为可以表示它们的一系列输出这些输出可以反向重构这些输入。通过前向和后向训练训练好的网络能够提取出输入中最重要的特征。 为什么RBM很重要 因为它能够自动地从输入中提取重要的特征。 RBM有什么用 用于协同过滤(Collaborative Filtering) 降维(dimensionality reduction) 分类(classification) 特征学习(feature leatning) 主题模型(topic modeling) 搭建深度置信网络(Deep belief network) RBM是生成模型吗 生成模型和判别模型的区别 判别模型: 考虑一个分类问题如我们想根据车的一些特征分辨一辆轿车和一辆SUV。给定一个训练集一个算法如逻辑回归它尝试找到一条可以直线以这条直线作为决策边界把轿车和SUV区分开。 生成模型 根据汽车我们可以建立一个模型比如轿车是什么样子的然后再根据SUV 我们建立另外一个SUV的模型最后根据这个两个模型判断一辆车是轿车还是SUV. 生成模型在输入特征下有特定的概率分布。 生成模型中既可以使用监督学习和无监督 在无监督学习中 我们想要得到一个P(x)的模型 x是输入向量 在监督学习中我们首先得到的是P(x|y), y是x的标记。举个例子如果y标记一辆车是轿车0或者SUV1 那么p(x|y0)就描述了轿车的特征是怎么分布的p(x|y1)就描述了轿车的特征是怎么分布的。 如果我们能够找到P(x|y)和P(y) 我们就能够使用贝叶斯公式去估算P(y|x)因为P(y|x) P(x|y)P(y)/P(x). 使用MINST 数据集展示如何使用RBMs 初始化并加载数据 这里要通过网络获取远程的文件utils.py到本地python2 和 python3通过网络获取文件是不一样的。 这里的代码用python3。 import urllib.request response urllib.request.urlopen(http://deeplearning.net/tutorial/code/utils.py) content response.read().decode(utf-8) target open(utils.py, w) target.write(content) target.close()import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data #!pip install pillow from PIL import Image # import Image from utils import tile_raster_images import matplotlib.pyplot as plt %matplotlib inlinemnist input_data.read_data_sets(MNIST_data/, one_hotTrue) trX, trY, teX, teY mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labelsRBM的层 一个RBM有两个层第一层叫可视层(visible)或者输入层第二层是隐藏层( hidden layer)。MNIST数据库的每一张图片有784个像素所以可视层必须有784个输入节点。第二个隐藏层在这里设为i ii个神经元。每一个神经元是2态的(binary state) 称为si。根据j jj个输入单元并由逻辑函数(logistic function) 产生一个概率输出决定每一个隐藏层的单元是开(si 1)是还关(si 0)。 这里我们取 i 500 i500i500. 第一层的每一个节点有一个偏差 (bias)使用vb表示 第二层的每一个节点也有一个偏差使用hb表示 vb tf.placeholder(float, [784]) hb tf.placeholder(float, [500])定义可视层和隐藏层之间的权重行表示输入节点列表示输出节点这里权重W是一个784x500的矩阵。 W tf.placeholder(float, [784, 500])训练好RBM能做什么 当RBM被训练好了它就能够在跟定一些隐藏值(如下雨)来计算一个事件比如湿滑路面的概率. 那就是说RBM可以被看作是生成模型它给每一个可能的二态向量( binary states vectors)生成一个概率。 这些二态向量( binary states vectors)多少种情况 可视层可以有不同的二态(0或1)或者说有不同的设置。比如当输入层只有7个单元时它有2 7 {2^{7}}27 中排列每一种排列有它对应的概率(这里我们假设没有偏差) - (0,0,0,0,0,0,0) -- p(config1)p(v1)p(s10,s20, …, s70) - (0,0,0,0,0,0,1) -- p(config2)p(v2)p(s10,s21, …, s71) - (0,0,0,0,0,1,0) -- p(config3)p(v3)p(s11,s20, …, s70) - (0,0,0,0,0,1,1) -- p(config4)p(v4)p(s11,s21, …, s71) - etc. 所以 如果我们有784个单元对于全部的2 784 {2^{784}}2784种输入情况它会产生一个概率分布P(v)。 如何训练RBM 训练分为两个阶段1 前向forward pass 2后向( backward pass)或者重构(reconstruction) 阶段1 前向改变的是隐藏层的值。 输入数据经过输入层的所有节点传递到隐藏层。这个计算是随机开始(This computation begins by making stochastic decisions about whether to transmit that input or not (i.e. to determine the state of each hidden layer)). 在隐藏层的节点上X乘以W再加上h_bias. 这个结果再通过sigmoid函数产生节点的输出或者状态。因此每个隐藏节点将有一个概率输出。对于训练集的每一行生成一个概率构成的张量(tensor)这个张量的大小为[1X500], 总共55000个向量[h055000x500]。 接着我们得到了概率的张量从所有的分布中采样h0。 那就是说我们从隐藏层的概率分布中采样激活向量(activation vector). 这些得到的样本用来估算反向梯度(negative phase gradient). X tf.placeholder(float, [None, 784]) _h0 tf.nn.sigmoid(tf.matmul(X, W) hb) #probabilities of the hidden units h0 tf.nn.relu(tf.sign(_h0 - tf.random_uniform(tf.shape(_h0)))) #sample_h_given_X参考下面的代码理解上面的代码 with tf.Session() as sess:a tf.constant([0.7, 0.1, 0.8, 0.2])print sess.run(a)bsess.run(tf.random_uniform(tf.shape(a)))print bprint sess.run(a-b)print sess.run(tf.sign( a - b))print sess.run(tf.nn.relu(tf.sign( a - b)))[0.7 0.1 0.8 0.2] [0.31160402 0.3776673 0.42522812 0.8557215 ] [ 0.38839597 -0.2776673 0.3747719 -0.6557215 ] [ 1. -1. 1. -1.] [1. 0. 1. 0.]阶段2 反向(重构) RBM在可视层和隐藏层之间通过多次前向后向传播重构数据。 所以在这个阶段从隐藏层(h0)采样得到的激活向量作为输入。相同的权重矩阵和可视层偏差将用于计算并通过sigmoid函数。其输出是一个重构的结果它近似原始输入。 _v1 tf.nn.sigmoid(tf.matmul(h0, tf.transpose(W)) vb) v1 tf.nn.relu(tf.sign(_v1 - tf.random_uniform(tf.shape(_v1)))) #sample_v_given_h h1 tf.nn.sigmoid(tf.matmul(v1, W) hb)重构步骤: 从数据集中拿一个数据, 如x, 把它通过网络Pass 0: (x) - (x:-:_h0) - (h0:-:v1) (v1 is reconstruction of the first pass)Pass 1: (v1) - (v1:-:h1) - (_h0:-:v2) (v2 is reconstruction of the second pass)Pass 2: (v2) - (v2:-:h2) - (_h1:-:v3) (v3 is reconstruction of the third pass)Pass n: (vn) - (vn:-:hn1) - (_hn:-:vn1)(vn is reconstruction of the nth pass) 如何计算梯度 为了训练RBM 我们必须使赋值到训练集V上的概率乘积最大。假如数据集V它的每一行看做是一个可视的向量v 或者等效地最大化训练集概率的对数 我们也可以定义一个目标函数并尝试最小化它。为了实现这个想法我们需要这个函数的各个参数的偏导数。从上面的表达式我们知道他们都是由权重和偏差间接组成的函数所以最小化目标函数就是优化权重。因此我们可以使用随机梯度下降(SGD)去找到最优的权重进而使目标函数取得最小值。在推导的时候有两个名词正梯度和负梯度。这两个状态反映了他们对模型概率密度的影响。正梯度取决于观测值X负梯度只取决于模型。 正的阶段增加训练数据的可能性 负的阶段减少由模型生成的样本的概率。 负的阶段很难计算所以我们用一个对比散度(Contrastive Divergence (CD))去近似它。它是按照这样的方式去设计的梯度估计的方向至少有一些准确。实际应用中更高准确度的方法如CD-k 或者PCD用来训练RBMs。 计算对比散度的过程中我们要用吉布斯采样(Gibbs sampling)对模型的分布进行采样。 对比散度实际是一个用来计算和调整权重矩阵的一个矩阵。 改变权重W渐渐地变成了权重值的训练。然后在每一步(epoch) W通过下面的公式被更新为一个新的值w’。 W ′ W α ∗ C D W#x27; W \alpha * CDW′Wα∗CD α \alphaα 是很小的步长也就是大家所熟悉的学习率(Learning rate) 如何计算相对散度 下面展示了单步相对散度的计算(CD-1)步骤: 1.从训练集X中取训练样本计算隐藏层的每个单元的概率并从这个概率分布中采样得到一个隐藏层激活向量h0 _ h 0 s i g m o i d ( X ⊗ W h b ) \_h0 sigmoid(X \otimes W hb)_h0sigmoid(X⊗Whb) h 0 s a m p l e P r o b ( _ h 0 ) h0 sampleProb(\_h0)h0sampleProb(_h0) 2.计算X和h0的外积这就是正梯度 w _ p o s _ g r a d X ⊗ h 0 w\_pos\_grad X \otimes h0w_pos_gradX⊗h0(Reconstruction in the first pass) 3.从h重构v1 接着对可视层单元采样然后从这些采样得到的样本中重采样得到隐藏层激活向量h1.这就是吉布斯采样。 _ v 1 s i g m o i d ( h 0 ⊗ t r a n s p o s e ( W ) v b ) \_v1sigmoid(h0⊗transpose(W)vb)_v1sigmoid(h0⊗transpose(W)vb) v 1 s a m p l e p r o b ( _ v 1 )   ( S a m p l e v g i v e n h ) v1sampleprob(\_v1) \ (Sample v given h)v1sampleprob(_v1) (Samplevgivenh) h 1 s i g m o i d ( v 1 ⊗ W h b ) h1sigmoid(v1⊗Whb)h1sigmoid(v1⊗Whb) 4.计算v1和h1的外积这就是负梯度。 w _ n e g _ g r a d v 1 ⊗ h 1   ( R e c o n s t r u c t i o n 1 ) w\_neg\_gradv1⊗h1 \ (Reconstruction 1)w_neg_gradv1⊗h1 (Reconstruction1) 5. 对比散度等于正梯度减去负梯度对比散度矩阵的大小为784x500. C D ( w _ p o s _ g r a d − w _ n e g _ g r a d ) / d a t a p o i n t s CD (w\_pos\_grad - w\_neg\_grad) / datapointsCD(w_pos_grad−w_neg_grad)/datapoints 更新权重为W ′ W α ∗ C D W#x27; W \alpha*CDW′Wα∗CD最后可视层节点会保存采样的值。 什么是采样sampleProb 在前向算法中我们随机地设定每个hi的值为1伴随着概率s i g m o i d ( v ⊗ W h b ) sigmoid(v \otimes W hb)sigmoid(v⊗Whb); 在重构过程中我们随机地设定每一个vi的值为1伴随着概率s i g m o i d ( h ⊗ t r a n s p o s e ( W ) v b ) sigmoid(h \otimes transpose(W) vb)sigmoid(h⊗transpose(W)vb) alpha 1.0 w_pos_grad tf.matmul(tf.transpose(X), h0) w_neg_grad tf.matmul(tf.transpose(v1), h1) CD (w_pos_grad - w_neg_grad) / tf.to_float(tf.shape(X)[0]) update_w W alpha * CD update_vb vb alpha * tf.reduce_mean(X - v1, 0) update_hb hb alpha * tf.reduce_mean(h0 - h1, 0)什么是目标函数 目的最大限度地提高我们从该分布中获取数据的可能性 计算误差 每一步(epoch) 我们计算从第1步到第n步的平方误差的和这显示了数据和重构数据的误差。 err tf.reduce_mean(tf.square(X - v1)) # tf.reduce_mean computes the mean of elements across dimensions of a tensor.创建一个回话并初始化向量 cur_w np.zeros([784, 500], np.float32) cur_vb np.zeros([784], np.float32) cur_hb np.zeros([500], np.float32) prv_w np.zeros([784, 500], np.float32) prv_vb np.zeros([784], np.float32) prv_hb np.zeros([500], np.float32) sess tf.Session() init tf.global_variables_initializer() sess.run(init)查看第一次运行的误差 sess.run(err, feed_dict{X: trX, W: prv_w, vb: prv_vb, hb: prv_hb}) # 0.48134533整个算法的运算流程 对于每一个epoch对于每一batch计算对比散度对batch中的每一个数据点w_pos_grad 0, w_neg_grad 0 (matrices)数据向前传播计算v(重构)和h 更新w_neg_grad w_neg_grad v1 ⊗ h1对比散度pos_grad和neg_grad的平均值除以输入数据个数更新权重和偏差 W W alpha * CD计算误差重复下一epoch直到误差足够小或者在多个epoch下不再改变 #Parameters epochs 5 batchsize 100 weights [] errors []for epoch in range(epochs):for start, end in zip( range(0, len(trX), batchsize), range(batchsize, len(trX), batchsize)):batch trX[start:end]cur_w sess.run(update_w, feed_dict{ X: batch, W: prv_w, vb: prv_vb, hb: prv_hb})cur_vb sess.run(update_vb, feed_dict{ X: batch, W: prv_w, vb: prv_vb, hb: prv_hb})cur_hb sess.run(update_hb, feed_dict{ X: batch, W: prv_w, vb: prv_vb, hb: prv_hb})prv_w cur_wprv_vb cur_vbprv_hb cur_hbif start % 10000 0:errors.append(sess.run(err, feed_dict{X: trX, W: cur_w, vb: cur_vb, hb: cur_hb}))weights.append(cur_w)print(Epoch: %d % epoch,reconstruction error: %f % errors[-1]) plt.plot(errors) plt.xlabel(Batch Number) plt.ylabel(Error) plt.show()最后的权重 uw weights[-1].T print(uw) # a weight matrix of shape (500,784)我们能够获得每一个隐藏的单元并可视化隐藏层和输入之间的连接。使用tile_raster_images可以帮助我们从权重或者样本中生成容易理解的图片。它把784行转为一个数组(比如25x20)图片被重塑并像地板一样铺开。 tile_raster_images(Xcur_w.T, img_shape(28, 28), tile_shape(25, 20), tile_spacing(1, 1)) import matplotlib.pyplot as plt from PIL import Image %matplotlib inline image Image.fromarray(tile_raster_images(Xcur_w.T, img_shape(28, 28) ,tile_shape(25, 20), tile_spacing(1, 1))) ### Plot image plt.rcParams[figure.figsize] (18.0, 18.0) imgplot plt.imshow(image) imgplot.set_cmap(gray) 每一张图片表示了隐藏层和可视层单元之间连接的一个向量。 下面观察其中一个已经训练好的隐藏层单元的权重灰色代表权重为0越白的地方权重越大接近1.相反得 越黑的地方权重越负。 权重为正的像素使隐藏层单元激活的概率负的像素会减少隐藏层单元被激活的概率。 所以我们可以知道特定的小块(隐藏单元) 可以提取特征如果给它输入。 我们再看看重构得到一张图片 1)首先画出一张原始的图片 sample_case trX[1:2] img Image.fromarray(tile_raster_images(Xsample_case, img_shape(28, 28),tile_shape(1, 1), tile_spacing(1, 1))) plt.rcParams[figure.figsize] (2.0, 2.0) imgplot plt.imshow(img) imgplot.set_cmap(gray) #you can experiment different colormaps (Greys,winter,autumn)2) 把原始图像向下一层传播,并反向重构 hh0 tf.nn.sigmoid(tf.matmul(X, W) hb) vv1 tf.nn.sigmoid(tf.matmul(hh0, tf.transpose(W)) vb) feed sess.run(hh0, feed_dict{ X: sample_case, W: prv_w, hb: prv_hb}) rec sess.run(vv1, feed_dict{ hh0: feed, W: prv_w, vb: prv_vb})3)画出重构的图片 img Image.fromarray(tile_raster_images(Xrec, img_shape(28, 28),tile_shape(1, 1), tile_spacing(1, 1))) plt.rcParams[figure.figsize] (2.0, 2.0) imgplot plt.imshow(img) imgplot.set_cmap(gray) 参考https://en.wikipedia.org/wiki/Restricted_Boltzmann_machinehttp://deeplearning.net/tutorial/rbm.htmlhttp://deeplearning4j.org/restrictedboltzmannmachine.htmlhttp://imonad.com/rbm/restricted-boltzmann-machine/ 任何程序错误以及技术疑问或需要解答的请添加
http://www.yutouwan.com/news/111860/

相关文章:

  • 新手网站设计定价吉林电商网站建设公司哪家好
  • 如何做正规电影网站湖北省建设部网站
  • 建设通网站怎么查项目经理在建做高端网站建设公司
  • 怎样做自己的 优惠卷网站网站服务器的费用
  • 怎么做装修网站福州网站设计网站系统制作
  • 西安网站制作公司排阜阳哪里做网站的多
  • 怎样在手机做自己的网站wordpress 外链图片
  • vps做自己的网站洛阳做网站哪家便宜
  • php网站后台模板下载不了利用大平台做网站
  • 做暧暧小视频免费网站抖音代运营都做什么
  • 常熟网站建设专业的公司网站的定位分析
  • php网站开发 多少钱外贸软件定制
  • 网站制作和推广lv官网微信网页版下载安装
  • 网站建设维护属于什么专业广告推广是什么
  • 手机网站建设的背景有别墅的件怎么写者
  • 华为电子商务网站建设网站首页html
  • 中学网站建设 课设17网站一起做网店广州国大
  • 兰州优化网站网站建设的认可
  • 做网站图片怎么做wordpress实现301跳转详解
  • 泉州有哪些做网站的平面设计公司广告语
  • 做英文网站怎样网站建设
  • 吉林省级建设行政主管部门政务网站烟台网站制作企业
  • wordpress删除角色名seo网站推广的作用
  • 南昌加盟网站建设现代简约室内设计说明200字
  • 红酒网站建设方案范本网站首页制作采用
  • 网站设计的公司选哪家淘宝推广网站怎么做
  • 建站宝盒模板wordpress微信接口
  • 网站维护托管企业网站建设公司郑州
  • 西安网站开发哪家好生鲜超市店面设计
  • 如何做网站监控安徽做网站哪家好