包含從頭開始構建Autoencoders模型的完整代碼。
(關注「我愛計算機視覺」公衆號,一個有價值有深度的公衆號~)
在本教程中,咱們一塊兒來探索一個非監督學習神經網絡——Autoencoders(自動編碼器)。
自動編碼器是用於在輸出層再現輸入數據的深度神經網絡,因此輸出層中的神經元的數量與輸入層中的神經元的數量徹底相同。
以下圖所示:
該圖像展現了典型的深度自動編碼器的結構。自動編碼器網絡結構的目標是在輸出層建立輸入的表示,使得二者儘量接近(類似)。 可是,自動編碼器的實際使用是用來獲得具備最低數據丟失量的輸入數據的壓縮版本。 在機器學習項目中的做用相似於主成分分析( Principle Component Analysis,PCA),PCA的做用是在有大量屬性的數據集上訓練模型時找到最佳和最相關屬性。python
自動編碼器以相似的方式工做。 其編碼器部分將輸入數據壓縮,確保重要數據不會丟失,但數據的總體大小會顯著減少。 這個概念稱爲降維( Dimensionality Reduction)。
降維的缺點是,壓縮數據是一個黑盒子,即咱們沒法肯定其壓縮後數據中的數據結構的具體含義。 好比,假設咱們有一個包含5個參數的數據集,咱們在這些數據上訓練一個自動編碼器。 編碼器不會爲了得到更好的表示而省略某些參數,它會將參數融合在一塊兒(壓縮後的變量時綜合變量)以建立壓縮版本,使得參數更少(好比從5個壓縮到3個)。
自動編碼器有兩個部分,即編碼器和解碼器。
git
編碼器壓縮輸入數據,而解碼器則基於壓縮表示的數據反過來恢復數據的未壓縮版本,以儘量準確地建立輸入的重建。github
咱們將使用Tensorflow的layers API建立自動編碼器神經網絡,並在mnist數據集上對其進行測試。微信
首先,咱們導入相關的Python庫,並讀入mnist數據集。 若是數據集存在於本地計算機上,那麼它將自動讀取,不然將經過運行如下命令自動下載。網絡
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.contrib.layers import fully_connected
mnist=input_data.read_data_sets("/MNIST_data/",one_hot=True)
接下來,咱們爲方便起見建立一些常量,並事先聲明咱們的激活函數。 mnist數據集中的圖像大小爲28×28像素,即784像素,咱們將其壓縮爲196像素。 固然你也能夠更進一步縮小像素大小。 可是,壓縮太多可能會致使自動編碼器丟失信息。session
num_inputs=784 #28x28 pixels
num_hid1=392
num_hid2=196
num_hid3=num_hid1
num_output=num_inputs
lr=0.01
actf=tf.nn.relu
如今,咱們爲每一層的weights 和 biases建立變量。 而後,咱們使用先前聲明的激活函數建立layer。數據結構
X=tf.placeholder(tf.float32,shape=[None,num_inputs])
initializer=tf.variance_scaling_initializer()
w1=tf.Variable(initializer([num_inputs,num_hid1]),dtype=tf.float32)
w2=tf.Variable(initializer([num_hid1,num_hid2]),dtype=tf.float32)
w3=tf.Variable(initializer([num_hid2,num_hid3]),dtype=tf.float32)
w4=tf.Variable(initializer([num_hid3,num_output]),dtype=tf.float32)
b1=tf.Variable(tf.zeros(num_hid1))
b2=tf.Variable(tf.zeros(num_hid2))
b3=tf.Variable(tf.zeros(num_hid3))
b4=tf.Variable(tf.zeros(num_output))
hid_layer1=actf(tf.matmul(X,w1)+b1)
hid_layer2=actf(tf.matmul(hid_layer1,w2)+b2)
hid_layer3=actf(tf.matmul(hid_layer2,w3)+b3)
output_layer=actf(tf.matmul(hid_layer3,w4)+b4)
在通常狀況下,TensorFlow的工程一般不使用tf.variance_scaling_initializer()。 可是,咱們在這裏使用它是由於咱們正在處理不斷變化大小的輸入。 所以,placeholder張量形狀(placeholder用於輸入批處理)根據輸入大小的形狀調整自身,從而防止咱們遇到任何維度錯誤。 經過簡單地將先前帶有相關weights 和 biases 的隱藏層做爲輸入輸送到激活函數(ReLu)中來建立後面的隱藏層。機器學習
咱們將使用RMSE損失函數用於此神經網絡並將其傳遞給Adam優化器。你也能夠替換這些來得到更多結果。函數
loss=tf.reduce_mean(tf.square(output_layer-X)) optimizer=tf.train.AdamOptimizer(lr) train=optimizer.minimize(loss) init=tf.global_variables_initializer()
如今,咱們定義epochs和batch size並運行session。 咱們使用mnist類的mnist.train.next_batch()來獲取每一個新的batch。 此外,咱們將在每一個epoch以後輸出訓練loss以監控其訓練。工具
num_epoch=5
batch_size=150
num_test_images=10
with tf.Session() as sess:
sess.run(init)
for epoch in range(num_epoch):
num_batches=mnist.train.num_examples//batch_size for iteration in range(num_batches):
X_batch,y_batch=mnist.train.next_batch(batch_size)
sess.run(train,feed_dict={X:X_batch})
train_loss=loss.eval(feed_dict={X:X_batch})
print("epoch {} loss {}".format(epoch,train_loss))
最後,咱們將編寫一個小的繪圖函數來繪製原始圖像和重建圖,以查看咱們訓練獲得的模型的工做狀況。
results=output_layer.eval(feed_dict={X:mnist.test.images[:num_test_images]})
#Comparing original images with reconstructions
f,a=plt.subplots(2,10,figsize=(20,4))
for i in range(num_test_images):
a[0][i].imshow(np.reshape(mnist.test.images[i],(28,28)))
a[1][i].imshow(np.reshape(results[i],(28,28)))
在這裏,咱們能夠看到重建並不完美,但很是接近原始圖像。 注意上圖中,2的重建看起來像是3,這是因爲壓縮時信息丟失形成的。
咱們能夠經過超參數調整來改進自動編碼器模型,而且還能夠經過在GPU上運行訓練來提升速度。
獲取完整代碼,請訪問:
https://github.com/Tathagatd96/Deep-Autoencoder-using-Tensorflow
原文連接:
https://towardsdatascience.com/deep-autoencoders-using-tensorflow-c68f075fd1a3
點擊閱讀原文能夠在www.52cv.net查看本文。
歡迎轉發,讓更多人看到。
更多精彩推薦:
本文分享自微信公衆號 - 我愛計算機視覺(aicvml)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。