自编码(Autoencoder)介绍

Autoencoder是一种无监督的学习算法,将输入信息进行压缩,提取出数据中最具代表性的信息。其目的是在保证重要特征不丢失的情况下,降低输入信息的维度,减小神经网络的处理负担。简单来说就是提取输入信息的特征。类似于主成分分析(Principal Components Analysis,PAC)



对于输入信息X,通过神经网络对其进行压缩,提取出数据的重要特征,然后将其解压得到数据Y,然后通过对比X与Y求出预测误差进行反向传递,逐步提升自编码的准确性。训练完成的自编码中间部分就是输入数据的精髓,实际使用中通常只会用到自编码的前半部分。

Tensorflow实现

用到的数据集

用到的数据集是Tensorflow模块中的mnist数据集,其中有70000个数字0-9的带标签图片样本,包含了60000个训练样本和10000个测试样本。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=False) #读取文件

"/tmp/data/"为文件保存的位置,如果没有则会自动下载到该文件夹。"one_hot=False"表示返回一个长度为n的numpy数组.每个元素代表图片上的数字.

参数定义

# Parameter
learning_rate = 0.01 #学习率0.01
training_epochs = 5 # 五组训练
batch_size = 256 #批尺寸大小
display_step = 1 #每隔多少epoch显示打印一次cost
examples_to_show = 10 #显示多少张图片

网络输入inputs

n_input = 784  # mnist中图片的尺寸是28*28总共有784个像素特征
# tf Graph input (only pictures)
X = tf.placeholder("float", [None, n_input]) #定义网络的输入特征

隐藏层的权重weights和偏置biases定义

  • 将输入进的784个Features,经过第一个隐藏层压缩到256个Features,然后经过第二个隐藏层压缩至128个。
  • 在解压环节将128个Features还原至256,再到784.
  • 将前后的784个特征进行对比,反向传递cost来提升自编码的准确度
# hidden layer settings
n_hidden_1 = 256 # 第一层隐藏层的特征数量
n_hidden_2 = 128 # 第二层的数量
weights = {
'encoder_h1':tf.Variable(tf.random_normal([n_input,n_hidden_1])), #[784,256]
'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1,n_hidden_2])), #[256,128]
'decoder_h1': tf.Variable(tf.random_normal([n_hidden_2,n_hidden_1])), #[128,256]
'decoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_input])), #[256,784]
}
biases = {
'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])), #[256]
'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])), #[128]
'decoder_b1': tf.Variable(tf.random_normal([n_hidden_1])), #[256]
'decoder_b2': tf.Variable(tf.random_normal([n_input])), #[784]
}

定义压缩Encoder和解压Decoder层

使用的激活函数是sigmoid,压缩之后的值应该在[0,1],在decoder中激活函数一样

# Building the encoder
def encoder(x):
# Encoder Hidden layer with sigmoid activation #1
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
biases['encoder_b1']))
# Decoder Hidden layer with sigmoid activation #2
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
biases['encoder_b2']))
return layer_2 # Building the decoder
def decoder(x):
# Encoder Hidden layer with sigmoid activation #1
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
biases['decoder_b1']))
# Decoder Hidden layer with sigmoid activation #2
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
biases['decoder_b2']))
return layer_2

Encoder和Decoder的输出结果

encoder_op = encoder(X) 	        # 128 Features
decoder_op = decoder(encoder_op) # 784 Features # Prediction
y_pred = decoder_op # 预测值
y_true = X # 真实值(原始输入)

定义cost和训练

cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2)) #cost为(y_true - y_pred)^2的均值
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) #利用AdamOptimizer来训练

最后通过Matplotlib的pyplot来显示结果

with tf.Session() as sess:
init=tf.global_variables_initializer()
sess.run(init)
total_batch=int(mnist.train.num_examples/batch_size) #计算训练循环的次数 #train cycle
for epoch in range(training_epochs):
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
_, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
if epoch % display_step == 0: #输入经过每一个epoch后cost的值
print("Epoch:", '%04d' % (epoch + 1), #输出格式为Epoch:0001 cost=0.123456789
"cost=", "{:.9f}".format(c))
print("Optimization Finished!")
#在测试集上应用encoder和decoder
encode_decode = sess.run(
y_pred, feed_dict={X: mnist.test.images[:examples_to_show]})
# 显示对比图像
f, a = plt.subplots(2, 10, figsize=(10, 2)) #定义画布
for i in range(examples_to_show):
a[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28)))
a[1][i].imshow(np.reshape(encode_decode[i], (28, 28)))
plt.show()

结果

Epoch: 0001 cost= 0.077869482

Epoch: 0002 cost= 0.070396304

Epoch: 0003 cost= 0.066303633

Epoch: 0004 cost= 0.062276978

Epoch: 0005 cost= 0.055230502

参考

本文内容来自于莫烦python,进行学习整理,非常感谢。

相关代码

利用自编码(Autoencoder)来提取输入数据的特征的更多相关文章

  1. Tensorf实战第九课(自编码AutoEncoder)

    本节我们将了解神经网络进行非监督形式的学习,即autoencoder自编码 假设图片经过神经网络后再输出的过程,我们看作是图片先被压缩然后解压的过程.那么在压缩的时候,原有的图片质量被缩减,解压时用信 ...

  2. 利用Readability解决网页正文提取问题

    分享: 利用Readability解决网页正文提取问题   做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...

  3. Pytorch中的自编码(autoencoder)

    Pytorch中的自编码(autoencoder) 本文资料来源:https://www.bilibili.com/video/av15997678/?p=25 什么是自编码 先压缩原数据.提取出最有 ...

  4. 利用sfntly的sfnttool.jar提取中文字体

    雨忆博客中提到了sfntly(具体介绍可以看:https://code.google.com/p/sfntly/),利用其中sfnttool.jar就可以提取只包含指定字符的字体,如果想在页面中通过@ ...

  5. 利用ArcGIS水文分析工具提取河网

    转自原文 利用ArcGIS水文分析工具提取河网(转) DEM包含有多种信息,ArcToolBox提供了利用DEM提取河网的方法,但是操作比较烦琐(帮助可参看Hydrologic analysis sa ...

  6. 等效介质理论模型---利用S参数反演法提取超材料结构的等效参数

    等效介质理论模型---利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程.本文对等效介质理论模型进行了详细介绍,并提 ...

  7. opencv java api提取图片sift特征

    opencv在2.4.4版本以后添加了对java的最新支持,可以利用java api了.下面就是我利用opencv的java api 提取图片的sift特征. import org.opencv.co ...

  8. 机器学习入门-随机森林温度预测的案例 1.datetime.datetime.datetime(将字符串转为为日期格式) 2.pd.get_dummies(将文本标签转换为one-hot编码) 3.rf.feature_importances_(研究样本特征的重要性) 4.fig.autofmt_xdate(rotation=60) 对标签进行翻转

    在这个案例中: 1. datetime.datetime.strptime(data, '%Y-%m-%d') # 由字符串格式转换为日期格式 2. pd.get_dummies(features)  ...

  9. NLP用CNN分类Mnist,提取出来的特征训练SVM及Keras的使用(demo)

    用CNN分类Mnist http://www.bubuko.com/infodetail-777299.html /DeepLearning Tutorials/keras_usage 提取出来的特征 ...

随机推荐

  1. 正则 ?<= 和 ?= 用法 以及零宽断言等概念

    正则 ?<=  和 ?= 用法   参考网址:http://baike.baidu.com/link?url=2zORJF9GOjU8AkmuHDLz9cyl9yiL68PdW3frayzLwW ...

  2. Getting started with the basics of programming exercises_5

    1.编写函数,把由十六进制数字组成的字符串转换为对应的整型值 编写函数htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值.字符串中允许包含的数字包括:0~9 ...

  3. 生成所有2^n个长度为n的比特串

    #include<stdio.h> void BitstringsRec(int n); int A[1000]; int G_N; int main(void) { while(1) { ...

  4. ORACLE SQL数据类型转换

    ORACLE SQL数据类型转换 2019-04-07 22:35:53 广小白 阅读数 429更多 分类专栏: Oracle   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议, ...

  5. 【DCN】端口与地址绑定技术

    端口与地址绑定技术   与AM技术不同之处在于,AM端口下绑定的MAC或IP能够通信,不限制绑定的MAC在其它接口下通信.   开启MAC-CPU学习模式 mac-address-learning c ...

  6. Java反射机制(二):通过反射取得类的结构

    在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor  表示类中的构造方法 · Field  表示类中的属性 · ...

  7. C# winforms 输入颜色转换颜色名

    本文告诉大家如何输入颜色,如0xFFFF8000转换为 Orange 在 winforms 程序 可以使用下面代码转换 public static class HexColorTranslator { ...

  8. JavaMail转发邮件

    最近要做一个邮件转发功能,看了好多blog,都是接受邮件,再解析邮件内容,再组装成新的邮件发出! 我按照这个不够,不错!邮件发出去了.但是好麻烦啊,接受邮件是个Message,发送邮件也是个Messa ...

  9. linux 基于 jiffy 的超时

    到目前为止所展示的次优化的延时循环通过查看 jiffy 计数器而不告诉任何人来工作. 但是最好的实现一个延时的方法, 如你可能猜想的, 常常是请求内核为你做. 有 2 种方 法来建立一个基于 jiff ...

  10. Kobjects, Ksets 和 Subsystems

    Kobject 是基础的结构, 它保持设备模型在一起. 初始地它被作为一个简单的引用计数, 但是它的责任已随时间增长, 并且因此有了它自己的战场. struct kobject 所处理的任 务和它的支 ...