您好,登錄后才能下訂單哦!
如何進行TensorFlow深度自動編碼器入門和實踐,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
包含從頭開始構建Autoencoders模型的完整代碼。
我們一起來探索一個非監督學習神經網絡——Autoencoders(自動編碼器)。
自動編碼器是用于在輸出層再現輸入數據的深度神經網絡,所以輸出層中的神經元的數量與輸入層中的神經元的數量完全相同。
如下圖所示:
該圖像展示了典型的深度自動編碼器的結構。自動編碼器網絡結構的目標是在輸出層創建輸入的表示,使得兩者盡可能接近(相似)。 但是,自動編碼器的實際使用是用來得到具有最低數據丟失量的輸入數據的壓縮版本。 在機器學習項目中的作用類似于主成分分析( Principle Component Analysis,PCA),PCA的作用是在有大量屬性的數據集上訓練模型時找到最佳和最相關屬性。
自動編碼器以類似的方式工作。 其編碼器部分將輸入數據壓縮,確保重要數據不會丟失,但數據的整體大小會顯著減小。 這個概念稱為降維( Dimensionality Reduction)。
降維的缺點是,壓縮數據是一個黑盒子,即我們無法確定其壓縮后數據中的數據結構的具體含義。 比如,假設我們有一個包含5個參數的數據集,我們在這些數據上訓練一個自動編碼器。 編碼器不會為了獲得更好的表示而省略某些參數,它會將參數融合在一起(壓縮后的變量時綜合變量)以創建壓縮版本,使得參數更少(比如從5個壓縮到3個)。
自動編碼器有兩個部分,即編碼器和解碼器。
編碼器壓縮輸入數據,而解碼器則基于壓縮表示的數據反過來恢復數據的未壓縮版本,以盡可能準確地創建輸入的重建。
我們將使用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像素。 當然你也可以更進一步縮小像素大小。 但是,壓縮太多可能會導致自動編碼器丟失信息。
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上運行訓練來提高速度。
關于如何進行TensorFlow深度自動編碼器入門和實踐問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。