Tensorflow實現稀疏自動編碼(SAE)


1.概述

人在獲取圖像時,並不是像計算機逐個像素去讀,一般是掃一眼物體,大致能得到需要的信息,如形狀,顏色,特征。怎么讓機器也有這項能力呢,稀疏編碼來了。

定義:

稀疏自編碼器(Sparse Autoencoder)可以自動從無標注數據中學習特征,可以給出比原始數據更好的特征描述。在實際運用時可以用稀疏編碼器發現的特征取代原始數據,這樣往往能帶來更好的結果。

稀疏編碼流程圖

上圖就是稀疏編碼的一半流程,清晰的說明了稀疏編碼的過程。

稀疏編碼網絡結構

自編碼器要求輸出盡可能等於輸入,並且它的隱藏層必須滿足一定的稀疏性,即隱藏層不能攜帶太多信息。所以隱藏層對輸入進行了壓縮,並在輸出層中解壓縮。整個過程肯定會丟失信息,但訓練能夠使丟失的信息盡量少。通過引入懲罰機制和BP算法解決最小化信息丟失問題。

2.代碼實現

#coding=utf-8
'''
Created on 2016年12月3日
@author: chunsoft
'''

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 導入 MNIST 數據
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

# 參數
learning_rate = 0.01 #學習速率
training_epochs = 20 #訓練批次
batch_size = 256 #隨機選擇訓練數據大小
display_step = 1 #展示步驟
examples_to_show = 10 #顯示示例圖片數量

# 網絡參數
#我這里采用了三層編碼,實際針對mnist數據,隱層兩層,分別為256,128效果最好
n_hidden_1 = 512 #第一隱層神經元數量
n_hidden_2 = 256 #第二
n_hidden_3 = 128 #第三
n_input = 784 #輸入

#tf Graph輸入
X = tf.placeholder("float", [None,n_input])

#權重初始化
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])),
'decoder_h1': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_2])),
'decoder_h2': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
'decoder_h3': 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])),
'decoder_b1': tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b2': tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b3': tf.Variable(tf.random_normal([n_input])),
}

# 開始編碼
def encoder(x):
#sigmoid激活函數,layer = x*weights['encoder_h1']+biases['encoder_b1']
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']))
return layer_3

# 開始解碼
def decoder(x):
#sigmoid激活函數,layer = x*weights['decoder_h1']+biases['decoder_b1']
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']))
return layer_3

# 構造模型
encoder_op = encoder(X)
encoder_result = encoder_op
decoder_op = decoder(encoder_op)

#預測
y_pred = decoder_op
#實際輸入數據當作標簽
y_true = X

# 定義代價函數和優化器,最小化平方誤差,這里可以根據實際修改誤差模型
cost = tf.reduce_mean(tf.pow(y_true-y_pred, 2))
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)

# 初始化變量
init = tf.initialize_all_variables();

# 運行Graph
with tf.Session() as sess:
sess.run(init)
#總的batch
total_batch = int(mnist.train.num_examples/batch_size)
# 開始訓練
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:
print("Epoch:", '%04d' % (epoch+1),
"cost=", "{:.9f}".format(c))
print("Optimization Finished!")
# Applying encode and decode over test set
#顯示編碼結果和解碼后結果
encodes = sess.run(
encoder_result, feed_dict={X: mnist.test.images[:examples_to_show]})
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)))
f.show()
plt.draw()
plt.waitforbuttonpress()

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com