受限玻尔兹曼机(RBM)与python在Tensorflow的实现

本文介绍了受限玻尔兹曼机(RBM)的基本原理,包括其作为生成模型的作用,以及与判别模型的区别。通过MNIST数据集展示了RBM的训练过程,解释了训练RBM的两个阶段和如何计算梯度。RBM在深度学习中用于特征学习、降维和分类等任务。文章还探讨了如何使用Tensorflow实现RBM。
摘要由CSDN通过智能技术生成

简介

受限玻尔兹曼机是一种无监督,重构原始数据的一个简单的神经网络。
受限玻尔兹曼机先把输入转为可以表示它们的一系列输出;这些输出可以反向重构这些输入。通过前向和后向训练,训练好的网络能够提取出输入中最重要的特征。

为什么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)或者SUV(1), 那么p(x|y=0)就描述了轿车的特征是怎么分布的,p(x|y=1)就描述了轿车的特征是怎么分布的。 如果我们能够找到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 inline
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels

RBM的层

一个RBM有两个层,第一层叫可视层(visible)或者输入层,第二层是隐藏层( hidden layer)。MNIST数据库的每一张图片有784个像素,所以可视层必须有784个输入节点。第二个隐藏层在这里设为i ii个神经元。每一个神经元是2态的(binary state), 称为si。根据j jj个输入单元,并由逻辑函数(logistic function) 产生一个概率输出,决定每一个隐藏层的单元是开(si = 1)是还关(si =0)。 这里我们取 i = 500 i=500i=500.
P1

第一层的每一个节点有一个偏差 (bias),使用vb表示;
第二层的每一个节点也有一个偏差,使用hb表示;

vb = tf.placeholder("float", [784])
hb = tf.placeholder("float", [500])

定义可视层和隐藏层之间的权重,行表示输入节点,列表示输出节点,这里权重W是一个784x500的矩阵。

W = tf.placeholder("float", [784, 500])
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青年夏日科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值