文章目录:
一.什么是Autoencoder
二.Autoencoder分析MNIST数据
三.特征聚类分析
四.总结
https://github.com/eastmountyxz/
AI-for-TensorFlow
https://github.com/eastmountyxz/
AI-for-Keras
学Python近八年,认识了很多大佬和朋友,感恩。作者的本意是帮助更多初学者入门,因此在github开源了所有代码,也在公众号同步更新。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻学习和撰写文章,也能在读博几年里学会真正的独立科研。同时非常感谢参考文献中的大佬们的文章和分享。
- https://blog.csdn.net/eastmount
第一部分:使用MNIST数据集,通过feature的压缩和解压,对比解压后的图片和压缩之前的图片,看看是否一致,实验想要的效果是和图片压缩之前的差不多。
第二部分:输出encoder的结果,压缩至两个元素并可视化显示。在显示图片中,相同颜色表示同一类型图片,比如类型为1(数字1),类型为2(数字2)等等,最终实现无监督的聚类。
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
# 下载手写数字图像数据集
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
#-------------------------------------初始化设置-------------------------------------------
# 基础参数设置
learning_rate = 0.01 #学习效率
training_epochs = 5 #5组训练
batch_size = 256 #batch大小
display_step = 1
examples_to_show = 10 #显示10个样本
# 神经网络输入设置
n_input = 784 #MNIST输入数据集(28*28)
# 隐藏层设置
n_hidden_1 = 256 #第一层特征数量
n_hidden_2 = 128 #第二层特征数量
weights = {
'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'decoder_h1': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
'decoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_input]))
}
biases = {
'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b2': tf.Variable(tf.random_normal([n_input]))
}
#---------------------------------压缩和解压函数定义---------------------------------------
# Building the encoder
def encoder(x):
# 第一层Layer压缩成256个元素 压缩函数为sigmoid(压缩值为0-1范围内)
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
biases['encoder_b1']))
# 第二层Layer压缩成128个元素
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):
# 解压隐藏层调用sigmoid激活函数
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
biases['decoder_b1']))
# 第二层Layer解压成784个元素
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
biases['decoder_b2']))
return layer_2
#-----------------------------------压缩和解压操作---------------------------------------
# 压缩:784 => 128
encoder_op = encoder(X)
# 解压:784 => 128
decoder_op = decoder(encoder_op)
#--------------------------------对比预测和真实结果---------------------------------------
# 预测
y_pred = decoder_op
# 输入数据的类标(Labels)
y_true = X
# 定义loss误差计算 最小化平方差
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
#-------------------------------------训练及可视化-------------------------------------
# 初始化
init = tf.initialize_all_variables()
# 训练集可视化操作
with tf.Session() as sess:
sess.run(init)
total_batch = int(mnist.train.num_examples/batch_size)
# 训练数据 training_epochs为5组实验
for epoch in range(training_epochs):
# Loop over all batches
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size) # max(x)=1 min(x)=0
# 运行初始化和误差计算操作
_, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
# 每个epoch显示误差值
if epoch % display_step == 0:
print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))
print("Optimization Finished!")
# 压缩和解压测试集
encode_decode = sess.run(
y_pred, feed_dict={X: mnist.test.images[:examples_to_show]})
# 比较原始图像和预测图像数据
f, a = plt.subplots(2, 10, figsize=(10, 2))
# 显示结果 上面10个样本是真实数据 下面10个样本是预测结果
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()
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
Epoch: 0001 cost= 0.097888887
Epoch: 0002 cost= 0.087600455
Epoch: 0003 cost= 0.083100438
Epoch: 0004 cost= 0.078879632
Epoch: 0005 cost= 0.069106154
Optimization Finished!
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 15 15:35:47 2020
@author: xiuzhang Eastmount CSDN
"""
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
#-----------------------------------初始化设置---------------------------------------
# 基础参数设置
learning_rate = 0.01 #学习效率
training_epochs = 5 #5组训练
batch_size = 256 #batch大小
display_step = 1
examples_to_show = 10 #显示10个样本
# 神经网络输入设置
n_input = 784 #MNIST输入数据集(28*28)
# 输入变量(only pictures)
X = tf.placeholder("float", [None, n_input])
# 隐藏层设置
n_hidden_1 = 256 #第一层特征数量
n_hidden_2 = 128 #第二层特征数量
weights = {
'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'decoder_h1': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
'decoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_input]))
}
biases = {
'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b2': tf.Variable(tf.random_normal([n_input]))
}
# 导入MNIST数据
mnist = input_data.read_data_sets("MNIST_data", one_hot=False)
#---------------------------------压缩和解压函数定义---------------------------------------
# Building the encoder
def encoder(x):
# 第一层Layer压缩成256个元素 压缩函数为sigmoid(压缩值为0-1范围内)
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
biases['encoder_b1']))
# 第二层Layer压缩成128个元素
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):
# 解压隐藏层调用sigmoid激活函数(范围内为0-1区间)
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
biases['decoder_b1']))
# 第二层Layer解压成784个元素
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
biases['decoder_b2']))
return layer_2
#-----------------------------------压缩和解压操作---------------------------------------
# Construct model
# 压缩:784 => 128
encoder_op = encoder(X)
# 解压:784 => 128
decoder_op = decoder(encoder_op)
#--------------------------------对比预测和真实结果---------------------------------------
# 预测
y_pred = decoder_op
# 输入数据的类标(Labels)
y_true = X
# 定义loss误差计算 最小化平方差
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
#-------------------------------------训练及可视化-------------------------------------
# 初始化
init = tf.initialize_all_variables()
# 训练集可视化操作
with tf.Session() as sess:
sess.run(init)
total_batch = int(mnist.train.num_examples/batch_size)
# 训练数据 training_epochs为5组实验
for epoch in range(training_epochs):
# Loop over all batches
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size) # max(x)=1 min(x)=0
# 运行初始化和误差计算操作
_, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
# 每个epoch显示误差值
if epoch % display_step == 0:
print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))
print("Optimization Finished!")
# 压缩和解压测试集
encode_decode = sess.run(
y_pred, feed_dict={X: mnist.test.images[:examples_to_show]})
# 比较原始图像和预测图像数据
f, a = plt.subplots(2, 10, figsize=(10, 2))
# 显示结果 上面10个样本是真实数据 下面10个样本是预测结果
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()
# 基础参数设置
learning_rate = 0.001 #学习效率
training_epochs = 20 #20组训练
batch_size = 256 #batch大小
display_step = 1
# 隐藏层设置
n_hidden_1 = 128 #第一层特征数量
n_hidden_2 = 64 #第二层特征数量
n_hidden_3 = 10 #第三层特征数量
n_hidden_4 = 2 #第四层特征数量
weights = {
'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'encoder_h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3])),
'encoder_h4': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_4])),
'decoder_h1': tf.Variable(tf.random_normal([n_hidden_4, n_hidden_3])),
'decoder_h2': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_2])),
'decoder_h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
'decoder_h4': tf.Variable(tf.random_normal([n_hidden_1, n_input]))
}
biases = {
'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])),
'encoder_b4': tf.Variable(tf.random_normal([n_hidden_4])),
'decoder_b1': tf.Variable(tf.random_normal([n_hidden_3])),
'decoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b3': tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b4': tf.Variable(tf.random_normal([n_input])),
}
#---------------------------------压缩和解压函数定义---------------------------------------
# Building the encoder
def encoder(x):
# 压缩隐藏层调用函数sigmoid(压缩值为0-1范围内)
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']))
layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']),
biases['encoder_b3']))
# 输出范围为负无穷大到正无穷大 调用matmul函数
layer_4 = tf.add(tf.matmul(layer_3, weights['encoder_h4']),
biases['encoder_b4'])
return layer_4
# Building the decoder
def decoder(x):
# 解压隐藏层调用sigmoid激活函数(范围内为0-1区间)
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']))
layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']),
biases['decoder_b3']))
layer_4 = tf.nn.sigmoid(tf.add(tf.matmul(layer_3, weights['decoder_h4']),
biases['decoder_b4']))
return layer_4
# 观察解压前的结果
encoder_result = sess.run(encoder_op, feed_dict={X: mnist.test.images})
# 显示encoder压缩成2个元素的预测结果
plt.scatter(encoder_result[:, 0], encoder_result[:, 1], c=mnist.test.labels)
plt.colorbar()
plt.show()
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 15 15:35:47 2020
@author: xiuzhang Eastmount CSDN
"""
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
#-----------------------------------初始化设置---------------------------------------
# 基础参数设置
learning_rate = 0.001 #学习效率
training_epochs = 20 #20组训练
batch_size = 256 #batch大小
display_step = 1
examples_to_show = 10 #显示10个样本
# 神经网络输入设置
n_input = 784 #MNIST输入数据集(28*28)
# 输入变量(only pictures)
X = tf.placeholder("float", [None, n_input])
# 隐藏层设置
n_hidden_1 = 128 #第一层特征数量
n_hidden_2 = 64 #第二层特征数量
n_hidden_3 = 10 #第三层特征数量
n_hidden_4 = 2 #第四层特征数量
weights = {
'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'encoder_h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3])),
'encoder_h4': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_4])),
'decoder_h1': tf.Variable(tf.random_normal([n_hidden_4, n_hidden_3])),
'decoder_h2': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_2])),
'decoder_h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
'decoder_h4': tf.Variable(tf.random_normal([n_hidden_1, n_input]))
}
biases = {
'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])),
'encoder_b4': tf.Variable(tf.random_normal([n_hidden_4])),
'decoder_b1': tf.Variable(tf.random_normal([n_hidden_3])),
'decoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b3': tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b4': tf.Variable(tf.random_normal([n_input])),
}
# 导入MNIST数据
mnist = input_data.read_data_sets("MNIST_data", one_hot=False)
#---------------------------------压缩和解压函数定义---------------------------------------
# Building the encoder
def encoder(x):
# 压缩隐藏层调用函数sigmoid(压缩值为0-1范围内)
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']))
layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']),
biases['encoder_b3']))
# 输出范围为负无穷大到正无穷大 调用matmul函数
layer_4 = tf.add(tf.matmul(layer_3, weights['encoder_h4']),
biases['encoder_b4'])
return layer_4
# Building the decoder
def decoder(x):
# 解压隐藏层调用sigmoid激活函数(范围内为0-1区间)
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']))
layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']),
biases['decoder_b3']))
layer_4 = tf.nn.sigmoid(tf.add(tf.matmul(layer_3, weights['decoder_h4']),
biases['decoder_b4']))
return layer_4
#-----------------------------------压缩和解压操作---------------------------------------
# Construct model
# 压缩:784 => 128
encoder_op = encoder(X)
# 解压:784 => 128
decoder_op = decoder(encoder_op)
#--------------------------------对比预测和真实结果---------------------------------------
# 预测
y_pred = decoder_op
# 输入数据的类标(Labels)
y_true = X
# 定义loss误差计算 最小化平方差
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
#-------------------------------------训练及可视化-------------------------------------
# 初始化
init = tf.initialize_all_variables()
# 训练集可视化操作
with tf.Session() as sess:
sess.run(init)
total_batch = int(mnist.train.num_examples/batch_size)
# 训练数据
for epoch in range(training_epochs):
# Loop over all batches
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size) # max(x)=1 min(x)=0
# 运行初始化和误差计算操作
_, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
# 每个epoch显示误差值
if epoch % display_step == 0:
print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))
print("Optimization Finished!")
# 观察解压前的结果
encoder_result = sess.run(encoder_op, feed_dict={X: mnist.test.images})
# 显示encoder压缩成2个元素的预测结果
plt.scatter(encoder_result[:, 0], encoder_result[:, 1], c=mnist.test.labels)
plt.colorbar()
plt.show()
十五.无监督学习Autoencoder原理及聚类可视化案例详解
天行健,君子以自强不息。
地势坤,君子以厚德载物。
[1] 冈萨雷斯著. 数字图像处理(第3版)[M]. 北京:电子工业出版社,2013.
[2] 杨秀璋, 颜娜. Python网络数据爬取及分析从入门到精通(分析篇)[M]. 北京:北京航天航空大学出版社, 2018.
[3]“莫烦大神” 网易云视频地址
[4] https://study.163.com/course/courseLearn.htm?courseId=1003209007
[5] TensorFlow【极简】CNN - Yellow_python大神
[6] https://github.com/siucaan/CNN_MNIST
[7] https://github.com/eastmountyxz/AI-for-TensorFlow
[8]《机器学习》周志华