没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
37页
我们将介绍深度信念网络,就是将预训练的受限玻尔兹曼机堆叠起来,通过类似多层感知器的学习算法进行微调,达到非常好的效果。这种网络是 2006 年由 Hinton 提出的,它开启了深度学习复兴的先河。虽然当前已经较少采用这种网络,但它还是一种非常重要的网络,深度信念网络的应用有重新崛起之势。我们将介绍深度信念网络的 Theano 实现,同时也会介绍其在 MNIST 手写数字识别中的应用。
资源推荐
资源详情
资源评论
深度信念网络
在上一章中,我们介绍了受限玻尔兹曼机,并说明它是一种无监督、生成式网络。但
是受限玻尔兹曼机很少单独使用,它总是作为某些深度网络的一层。本章将介绍深度信念
网络,就是将预训练的受限玻尔兹曼机堆叠起来,通过类似多层感知器的学习算法进行微
调,达到非常好的效果。这种网络是 2006 年由 Hinton 提出的,它开启了深度学习复兴的先
河。虽然当前已经较少采用这种网络,但它还是一种非常重要的网络,而且从 2016 年的情况
来看,深度信念网络的应用有重新崛起之势。
在这一章中,我们将介绍深度信念网络的 Theano 实现,同时也会介绍其在 MNIST 手
写数字识别中的应用。
11.1 深度信念网络原理
预训练好的受限玻尔兹曼机可以进行堆叠,形成深度信念网络。深度信念网络是一种
图模型,可以通过深度层次结构,来发现训练数据的高效表示方式。其可以表示输入信号
向量 x 和共有 L 个隐藏层前向神经网络。假设第ℓ个隐藏层状态为ℎ
(ℓ)
,有以下公式:
,
()
,
()
,⋯,
()
=
(ℓ)
(ℓ)
ℓ
()
,
()
式中,
()
=,
(ℓ)
(ℓ)
表示第ℓ层以隐藏层为条件可见层的概率密度。
()
,
()
则表示最上层 RBM 的可见层和隐藏层的概率密度。
深度信念网络的架构如图 11.1 所示。
深度学习算法实践(基于 Theano 和 TensorFlow)
-382-
图 11.1 深度信念网络架构
由图 11.1 可以看出,其实际上是由 4 个受限玻尔兹曼机构成的,下一层 RBM 的隐藏
层作为上一层 RBM 的可见层,这 4 个 RBM 可以先从下向上分别训练,再堆叠在一起,最
后就形成了深度信念网络,具体学习过程如下。
(1)训练第一个受限玻尔兹曼机网络,将输入信号加载到可见层,即
()
=。
(2)训练完成后,每个训练样本在第一个受限玻尔兹曼机隐藏层的状态可以视为该样
本的一个特征表示,可以通过平均激活
()
=1
()
,或者通过对隐藏层采样
()
()
来得到。
(3)训练第二个 RBM,将第一个 RBM 的隐藏层状态作为可见层输入,对其进行训练。
(4)重复上述操作,将所有 RBM 训练完成,这就完成了预训练过程。
(5)当预训练完所有 RBM 后,就进入网络微调阶段。可以将最后一个 RBM 的隐藏层
状态接入到其他监督学习网络中,通过监督学习对网络进行微调。实际中比较常用的方法
就是先接入上一个逻辑回归层,然后将其视为一个普通的多层感知器,利用 BP 算法进行学
习,微调连接权值。
11.2 深度信念网络 TensorFlow 实现
深度信念网络实际由一系列逐层预训练好的受限玻尔兹曼机堆叠而成,形成典型的多
层感知器模型,并利用多层感知器模型的算法进行模型调优。理解了受限玻尔兹曼机和多
层感知器模型之后,理解深度信念网络就比较简单了。
我们首先来看 MNIST 手写数字识别数据集载入,代码如下:
1 def load_datasets(self):
2 mnist = input_data.read_data_sets(self.datasets_dir,
3 one_hot=True)
4 X_train = mnist.train.images
5 y_train = mnist.train.labels
6 X_validation = mnist.validation.images
第 11 章 深度信念网络
-383-
7 y_validation = mnist.validation.labels
8 X_test = mnist.test.images
9 y_test = mnist.test.labels
10 return X_train, y_train, X_validation, y_validation, \
11 X_test, y_test, mnist
第 2、3 行:调用 TensorFlow 的 input_data 的 read_data_sets 方法,第一个参数为数据集
存放路径,第二个参数是标签集的格式。在原始 MNIST 数据集中,我们知道每个样本是
28×28 的黑白图片,对应的是 0~9 的数字标签,所以其格式为:[
…784(28×28)像素点的
值
…][3]。其中,第一项为 784(28×28)个 0~1 的浮点数,0 代表黑色,1 代表白色;第二
项的“3”代表这个样本是数字 3。为了后续处理方便,我们将标签[3]改为 one-hot 形式,
因为标签代表 0~9 的数字,所以标签集为 10 维向量,每维上取值为 0 代表不是这个对应
位置的数字,取值为 1 代表是这个对应位置的数字。其中,只有一维可以取 1,因此称之
为 one-hot,还以上面的例子为例,标签集的格式就变为:[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],因为
第四位为 1,所以代表这个样本是数字 3。
第 4 行:取出训练样本集输入信号集 X_train,其为设计矩阵形式,每一行代表一个样
本,行数为训练样本集中的样本数量。在这个例子中,就X_train∈R
,其中训练样
本集中有 55000 个样本,每个样本是 784(28×28)维的图片。
第 5 行:取出训练样本集标签集 y_train,其为 one-hot 为行的矩阵,每一行代表对应样
本的正确结果,行数为训练样本集中的样本数量。在这个例子中,就y_train∈R
,
其中训练样本集中有 55000 个样本,每个正确结果为 10 维的 one-hot 向量,代表 0~9
的数字。
第 6 行:取出验证样本集输入信号集 X_validation,其为设计矩阵形式,每一行代表一
个样本,行数为验证样本集中的样本数量。在这个例子中,就X_validation∈R
,其
中验证样本集中有 5000 个样本,每个样本是 784(28×28)维的图片。根据前面我们的讨论
可以知道,在训练过程中,为了防止模型出现过拟合,模型的泛化能力降低(模型在训练
样本集达到非常高的精度,但是在未见过的测试样本集或实际应用中,精度反而不高),通
常会采用 Early Stopping 策略,就是在逻辑回归模型训练过程中,只用训练样本集对模型进
行训练,每隔一定的时间间隔,计算模型在未见过的验证样本集上识别的精度,并记录迄
今为止在验证样本集上取得的最高精度。我们会发现,在训练初期,验证样本集上的识别
精度会稳步提高,但是到了一定阶段之后,验证样本集上的识别精度就不会再明显提高了,
甚至开始逐渐下降,这就说明模型出现了过拟合,这时就可以停止模型训练,将在验证样
本集上取得最佳识别精度的模型参数作为模型最终的参数。综上所述,验证样本集主要用
于防止模型出现过拟合,为 Early Stopping 算法提供终止依据。
第 7 行:取出验证样本集标签集 y_validation,其 为 one-hot 为行的矩阵,每一行代表对
应样本的正确结果,行数为训练样本集中的样本数量。在这个例子中,就y_validation∈
R
,其中验证样本集中有 5000 个样本,每个正确结果为 10 维的 one-hot 向量,代表
0~9 的数字。
第 8 行:取出测试样本集输入信号集 X_test,其为设计矩阵形式,每一行代表一个样本,
行数为训练样本集中的样本数量。在这个例子中,就X_test∈R
,其中训练样本集
深度学习算法实践(基于 Theano 和 TensorFlow)
-384-
中有 10000 个样本,每个样本是 784(28×28)维的图片。测试样本集主要用于模型训练结
束后对模型性能进行评估。由于模型没有见过测试样本集中的样本,可以模拟模型在实际
部署之后的情况,模型在测试样本集上的识别精度,基本可以视为模型在实际应用中可以
达到的精度。
第 9 行:取出测试样本集标签集 y_test,其为 one-hot 为行的矩阵,每一行代表对应
样本的正确结果,行数为测试样本集中的样本数量。在这个例子中,就y_test∈R
,
其中测试样本集中有 10000 个样本,每个正确结果为 10 维的 one-hot 向量,代表 0~9
的数字。
第 10、11 行:返回训练样本集输入信号集、训练样本集标签集、验证样本集输入信号
集、验证样本集标签集、测试样本集输入信号集、测试样本集标签集。
下面来看深度信念网络模型的训练方法,代码如下:
1 def train(self, mode=TRAIN_MODE_NEW, ckpt_file='work/dbn.ckpt'):
2 X_train, y_train, X_validation, y_validation, \
3 X_test, y_test, mnist = self.load_datasets()
4 self.pretrain(X_train, X_validation)
5 if self.mlp_engine is None:
6 self.mlp_engine = Mlp_Engine(self.rbms, 'datasets')
7 self.mlp_engine.train()
第 2、3 行:读入 MNIST 手写数字识别数据集,包括:训练样本集输入样本集、训练
样本集标签集、验证样本集输入样本集、验证样本集标签集、测试样本集输入样本集、测
试样本集标签集。
第 4 行:调用预训练方法。深度信念网络训练包括两个阶段:第一阶段是逐层训练受
限玻尔兹曼机,第二阶段是将预训练好的受限玻尔兹曼机堆叠在一起,形成一个标准的多
层感知器模型进行调优。本行就是逐层预训练受限玻尔兹曼机。
第 5、6 行:如果没有初始化多层感知器模型,则初始化多层感知器模型。
第 7 行:调用多层感知器模型的训练方法,对参数进行调优。
接下来看网络预训练方法,在这里需要逐层训练受限玻尔兹曼机。为了更好地讲解这
一过程,先来看一下模型的构造函数,代码如下:
1 def __init__(self):
2 self.datasets_dir = 'datasets/'
3 self.random_seed = 1
4 self.rbm_W = []
5 self.rbm_b = []
6 self.rbms = []
7 self.rbm_graphs = []
8 self.layers = [1024,784,512,256]
9 self.name = 'dbn'
10 prev = 784
11 self.mlp_engine = None
12 for idx, layer in enumerate(self.layers):
13 rbm_str = 'rbm_' + str(idx+1)
14 name = self.name + '_' + rbm_str
15 tf_graph = tf.Graph()
第 11 章 深度信念网络
-385-
16 self.rbms.append(Rbm_Engine(name, tf_graph=tf_graph, n=prev,
17 num_hidden=layer))
18 prev = layer
19 self.rbm_graphs.append(tf_graph)
第 2 行:指定数据集存放位置。
第 3 行:随机数生成的种子,在网络权值和偏置值初始化时都会用随机数进行初始化。
如果每次生成的随机数均不相同,那么调试起来会非常不方便。因此这里采用随机数种子,
这样生成的随机数就是一样的,便于进行调试。
第 4 行:连接权值矩阵列表,每个预训练的受限玻尔兹曼机对应一个元素。
第 5 行:偏置值列表,每个预训练的受限玻尔兹曼机对应一个元素。
第 6 行:逐层预训练的受限玻尔兹曼机列表。
第 7 行:逐层预训练的受限玻尔兹曼机所对应的 Graph 列表,每个受限玻尔兹曼机对
应一个 Graph 对象。
第 8 行:定义深度信念网络架构,第一个受限玻尔兹曼机结构为 784—1024—784;第
二个受限玻尔兹曼机结构为 1024—784—1024;第三个受限玻尔兹曼机结构为 784—512—
784;第四个受限玻尔兹曼机结构为 512—256—512。
第 9 行:定义模型名称。
第 10 行:定义输入层维度为 784。
第 11 行:定义用于调优阶段的多层感知器模型。
第 12 行:利用第 13~19 行循环初始化深度信念网络中的各个受限玻尔兹曼机。
第 13、14 行:定义受限玻尔兹曼机名称,因为需要多个受限玻尔兹曼机的堆叠,这样
可以区分不同的受限玻尔兹曼机。
第 15 行:建立一个新的 TensorFlow 计算图。
第 16、17 行:生成一个新的受限玻尔兹曼机,并添加到受限玻尔兹曼机列表中。
第 18 行:将本受限玻尔兹曼机隐藏层作为下一个受限玻尔兹曼机的可见层。
第 19 行:将生成的 TensorFlow 的 Graph 添加到 Graph 列表中。
下面来看预训练过程,代码如下:
1 def pretrain(self, X_train, X_validation):
2 X_train_prev = X_train
3 X_validation_prev = X_validation
4 for idx, rbm in enumerate(self.rbms):
5 print('pretrain:{0}'.format(rbm.name))
6 tf_graph = self.rbm_graphs[idx]
7 X_train_prev, X_validation_prev = self.pretrain_rbm(
8 self.rbm_graphs[idx], rbm,
9 X_train_prev, X_validation_prev)
10 return X_train_prev, X_validation_prev
第 2、3 行:每个受限玻尔兹曼机的输入均为上一个受限玻尔兹曼机隐藏层的内容,初
始时将上一个受限玻尔兹曼机隐藏层的值设置为训练样本集和验证样本集。
第 4 行:使所有受限玻尔兹曼机列表中的受限玻尔兹曼机循环第 5~9 行的操作。
第 6 行:取出该受限玻尔兹曼机对应的 TensorFlow 的 Graph。
剩余36页未读,继续阅读
资源评论
好知识传播者
- 粉丝: 483
- 资源: 4204
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功