论文部分内容阅读
摘要:本文先介绍监督学习和无监督学习的概念,然后分析自编码器的特点和结构,并设计自编码网络的结构,最后通过MNIST数据集对自编码网络进行训练和结果分析。运行结果表明,自编码器是深度学习中的一种非常重要的无监督学习方法,能够从大量无标签的数据中自动学习,得到蕴含在数据中的有效特征
关键词:自编码;深度学习;无监督学习
中图分类号:TP183:文献标识码:A
0 引言
深度学习领域主要有两种训练模式:一种是监督学习,即不仅有样本,还有对应的标签;另一种是非监督学习,即只有样本没有标签。对于监督学习的训练任务来说,为已有样本准备对应的标签是一项很繁重的工作,因此,非监督学习就显得简单的多,因为如果能让网络直接使用样本进行训练而不需要再准备标签,是更高效的事情。
本文接下来介绍的自编码器是深度学习中的一种非常重要的无监督学习方法,能够从大量无标签的数据中自动学习,得到蕴含在数据中的有效特征[1]。
1自编码器的特点
人平时看一幅图像,并不是象电脑那样去逐个去扫描,一般是看一眼就大致能得到所需要的信息,比如图像的大小,形状、色彩和特征等。自编码器也有类似这样的功能,它是非监督学习领域的一种,可以自动地从无标注的原始数据中学习到特征,是一种以重构输入信号为目标的神经网络,它可以得出比原始数据更好的特征描述,具有较强的特征学习能力,通常在深度学习中常用自编码网络生成的特征来取代原始数据,以得到更好的特征提取效果。
2 自编码器的结构
自编码器(Auto-Encoder,AE)网络是输入等于输出的一种深度学习无监督学习网络,最基本的模型可以是三层的神经网络,即输入层、隐藏层和输出层。其中,输入层的样本在训练中会充当输出层的标签角色。也就是说,自编码网络是一种尽可能复现输入信号的神经网络。具体的网络结构图如图1所示。
上图中,从输入到中间状态的过程叫做编码,从中间状态再回到输出的过程叫做解码。训练后的自编码器可以在隐藏层得到代表输入数据的特征,类似于PCA算法(主成分分析),即找到可以代表原信息的主要成分。
自编码器要求输出尽可能等于输入,并且其隐藏层必须满足一定的稀疏性,这是通过将隐藏层中的神经元个数比前一层神经元个数少的方式来实现其稀疏效果的。相当于隐藏层对输入进行了压缩,并在输出层中进行解压缩。尽管整个过程中会有信息的丢失,但通过对模型的优化能使丢失的信息尽可能减少,从而最大化地保留其主要特征。其实自编码器和PCA比较类似,如果激活函数不使用Sigmoid,而是使用线性函数,那么就成了PCA模型。
从以上分析得出,自编码器是一种无监督的学习算法,主要用于数据的降维或者特征的抽取,
3 自编码器的设计思想及代码实现
本节我们将通过一个提取图片特征并利用提取的特征还原图片的实例来说明自编码器的应用及代码实现效果。
3.1 设计思想
自编码器可以看作是对输入数据的压缩编码,将高维的原始数据用低维的向量表示,使压缩后的低维向量能保留输入数据的典型特征,从而能够较为方便地恢复原始数据[2]。这里需要注意的是,在对数据进行编码和解码时,使用的是同一个参数矩阵W。衡量W的训练效果方法是,编码后的数据能够较为容易地通过解码恢复成原始数据,我们则认为W较好的保留了数据信息。
3.2 MNIST数据集介绍
本文采用MNIST数据集是一个手写数字的数据库,它有60000个28*28像素的训练样本集和10000个28*28像素的测试样本集。样本中包含了各个训练数据和相应的标签,其中标签集包含了0,1,2,3,4,5,6,7,8,9一共10个分类数据[3]。
3.3 创建自编码网络
下面通过构建一个六层的自编码网络,将MNIST数据集中的数字特征进行提取,再通过自编码器把这些特征重建MNIST数据集。
(1)加载MNIST数据集,提取所有数据,把数据分为训练和测试两个数据集,分别是50000和10000条,不设定训练集和测试集标签。
(2)定义自编码网络结构
本文采用一个六层的深度学习自编码网络,先把28*28的原始数据转换展平成784的一维数据作为输入数据,通过第二层降维到256,然后再降到128,最后再以同样的方式经过128,再经过256,最后还原成784的图片并输出结果进行对比。网络结构变化如表1所示。
(3)训练网络
设置训练的参数,epochs=20,batch_size=256,learnning_rate=0.01。然后定义编码和解码函数,损失函数采用均方差,优化器采用RMSP。编码和解码的部分核心代码如下:
# 编码
def encoder(x):
layer_1=tf.nn.sigmoid(tf.add(tf.matmul(x,weights['encoder_h1']),
biases['encoder_b1']))
layer_2=tf.nn.sigmoid(tf.add(tf.matmul(layer_1,
weights['encoder_h2']),biases['encoder_b2']))
return layer_2
# 解碼
def decoder(x):
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),biases['decoder_b1'])) layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1,
weights['decoder_h2']),biases['decoder_b2']))
return layer_2
#输出的节点
encoder_out = encoder(x)
pred = decoder(encoder_out)
# 损失函数为平方差
cost = tf.reduce_mean(tf.pow(y - pred, 2))
optimizer
= tf.train.RMSPropOptimizer(learning_rate).minimize(cost)
(4)测试模型
通过MNIST数据集中的测试集测试训练后的模型准确度,训练结果如下所示。
Epoch: 0001 cost= 0.191340700
Epoch: 0006 cost= 0.119541861
Epoch: 0011 cost= 0.102257006
Epoch: 0016 cost= 0.094441280
训练完成!
Accuracy: 1.0
从上述信息可以得到,经过20个epochs训练后的效果非常好,准确率达到了100%。
(5)图像还原
接下来我们抽取部分还原图片的信息进行显示,结果如图2所示,其中第一行显示的内容为输入图片,第二行显示的内容为输出图片。
4 总结
该文首先介绍传统自编码器的特点与基本结构,分析自编码器的一般处理框架。然后,通过MNIST数据集进行自编码器的编程训练、测试和结果输出。从运行的结果来看,该网络能比较好的进行了图片的还原。说明在深度学习中用自编码网络生成的特征来取代原始数据,可以取得较好的特征提取效果。
参考文献
[1] 袁非牛,章琳,史劲亭等.自编码神经网络理论及应用综述[J],计算机学报,2019(01).
[2] 苗宇宏等.基于深度卷积自编码网络的图像融合[J],计算机应用研究,2020(6).
[3] 王曉华. TensorFlow 2.0卷积神经网络实战 [M]. 清华大学出版社出版社,2020
作者简介:翟高粤,男,1975.11,广西钦州,汉,硕士,副教授,研究方向:软件理论,人工智能。
关键词:自编码;深度学习;无监督学习
中图分类号:TP183:文献标识码:A
0 引言
深度学习领域主要有两种训练模式:一种是监督学习,即不仅有样本,还有对应的标签;另一种是非监督学习,即只有样本没有标签。对于监督学习的训练任务来说,为已有样本准备对应的标签是一项很繁重的工作,因此,非监督学习就显得简单的多,因为如果能让网络直接使用样本进行训练而不需要再准备标签,是更高效的事情。
本文接下来介绍的自编码器是深度学习中的一种非常重要的无监督学习方法,能够从大量无标签的数据中自动学习,得到蕴含在数据中的有效特征[1]。
1自编码器的特点
人平时看一幅图像,并不是象电脑那样去逐个去扫描,一般是看一眼就大致能得到所需要的信息,比如图像的大小,形状、色彩和特征等。自编码器也有类似这样的功能,它是非监督学习领域的一种,可以自动地从无标注的原始数据中学习到特征,是一种以重构输入信号为目标的神经网络,它可以得出比原始数据更好的特征描述,具有较强的特征学习能力,通常在深度学习中常用自编码网络生成的特征来取代原始数据,以得到更好的特征提取效果。
2 自编码器的结构
自编码器(Auto-Encoder,AE)网络是输入等于输出的一种深度学习无监督学习网络,最基本的模型可以是三层的神经网络,即输入层、隐藏层和输出层。其中,输入层的样本在训练中会充当输出层的标签角色。也就是说,自编码网络是一种尽可能复现输入信号的神经网络。具体的网络结构图如图1所示。
上图中,从输入到中间状态的过程叫做编码,从中间状态再回到输出的过程叫做解码。训练后的自编码器可以在隐藏层得到代表输入数据的特征,类似于PCA算法(主成分分析),即找到可以代表原信息的主要成分。
自编码器要求输出尽可能等于输入,并且其隐藏层必须满足一定的稀疏性,这是通过将隐藏层中的神经元个数比前一层神经元个数少的方式来实现其稀疏效果的。相当于隐藏层对输入进行了压缩,并在输出层中进行解压缩。尽管整个过程中会有信息的丢失,但通过对模型的优化能使丢失的信息尽可能减少,从而最大化地保留其主要特征。其实自编码器和PCA比较类似,如果激活函数不使用Sigmoid,而是使用线性函数,那么就成了PCA模型。
从以上分析得出,自编码器是一种无监督的学习算法,主要用于数据的降维或者特征的抽取,
3 自编码器的设计思想及代码实现
本节我们将通过一个提取图片特征并利用提取的特征还原图片的实例来说明自编码器的应用及代码实现效果。
3.1 设计思想
自编码器可以看作是对输入数据的压缩编码,将高维的原始数据用低维的向量表示,使压缩后的低维向量能保留输入数据的典型特征,从而能够较为方便地恢复原始数据[2]。这里需要注意的是,在对数据进行编码和解码时,使用的是同一个参数矩阵W。衡量W的训练效果方法是,编码后的数据能够较为容易地通过解码恢复成原始数据,我们则认为W较好的保留了数据信息。
3.2 MNIST数据集介绍
本文采用MNIST数据集是一个手写数字的数据库,它有60000个28*28像素的训练样本集和10000个28*28像素的测试样本集。样本中包含了各个训练数据和相应的标签,其中标签集包含了0,1,2,3,4,5,6,7,8,9一共10个分类数据[3]。
3.3 创建自编码网络
下面通过构建一个六层的自编码网络,将MNIST数据集中的数字特征进行提取,再通过自编码器把这些特征重建MNIST数据集。
(1)加载MNIST数据集,提取所有数据,把数据分为训练和测试两个数据集,分别是50000和10000条,不设定训练集和测试集标签。
(2)定义自编码网络结构
本文采用一个六层的深度学习自编码网络,先把28*28的原始数据转换展平成784的一维数据作为输入数据,通过第二层降维到256,然后再降到128,最后再以同样的方式经过128,再经过256,最后还原成784的图片并输出结果进行对比。网络结构变化如表1所示。
(3)训练网络
设置训练的参数,epochs=20,batch_size=256,learnning_rate=0.01。然后定义编码和解码函数,损失函数采用均方差,优化器采用RMSP。编码和解码的部分核心代码如下:
# 编码
def encoder(x):
layer_1=tf.nn.sigmoid(tf.add(tf.matmul(x,weights['encoder_h1']),
biases['encoder_b1']))
layer_2=tf.nn.sigmoid(tf.add(tf.matmul(layer_1,
weights['encoder_h2']),biases['encoder_b2']))
return layer_2
# 解碼
def decoder(x):
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),biases['decoder_b1'])) layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1,
weights['decoder_h2']),biases['decoder_b2']))
return layer_2
#输出的节点
encoder_out = encoder(x)
pred = decoder(encoder_out)
# 损失函数为平方差
cost = tf.reduce_mean(tf.pow(y - pred, 2))
optimizer
= tf.train.RMSPropOptimizer(learning_rate).minimize(cost)
(4)测试模型
通过MNIST数据集中的测试集测试训练后的模型准确度,训练结果如下所示。
Epoch: 0001 cost= 0.191340700
Epoch: 0006 cost= 0.119541861
Epoch: 0011 cost= 0.102257006
Epoch: 0016 cost= 0.094441280
训练完成!
Accuracy: 1.0
从上述信息可以得到,经过20个epochs训练后的效果非常好,准确率达到了100%。
(5)图像还原
接下来我们抽取部分还原图片的信息进行显示,结果如图2所示,其中第一行显示的内容为输入图片,第二行显示的内容为输出图片。
4 总结
该文首先介绍传统自编码器的特点与基本结构,分析自编码器的一般处理框架。然后,通过MNIST数据集进行自编码器的编程训练、测试和结果输出。从运行的结果来看,该网络能比较好的进行了图片的还原。说明在深度学习中用自编码网络生成的特征来取代原始数据,可以取得较好的特征提取效果。
参考文献
[1] 袁非牛,章琳,史劲亭等.自编码神经网络理论及应用综述[J],计算机学报,2019(01).
[2] 苗宇宏等.基于深度卷积自编码网络的图像融合[J],计算机应用研究,2020(6).
[3] 王曉华. TensorFlow 2.0卷积神经网络实战 [M]. 清华大学出版社出版社,2020
作者简介:翟高粤,男,1975.11,广西钦州,汉,硕士,副教授,研究方向:软件理论,人工智能。