包含從頭開始構(gòu)建Autoencoders模型的完整代碼,。 自動(dòng)編碼器以類似的方式工作,。 其編碼器部分將輸入數(shù)據(jù)壓縮,確保重要數(shù)據(jù)不會(huì)丟失,,但數(shù)據(jù)的整體大小會(huì)顯著減小,。 這個(gè)概念稱為降維( Dimensionality Reduction)。 編碼器壓縮輸入數(shù)據(jù),而解碼器則基于壓縮表示的數(shù)據(jù)反過來恢復(fù)數(shù)據(jù)的未壓縮版本,,以盡可能準(zhǔn)確地創(chuàng)建輸入的重建,。 我們將使用Tensorflow的layers API創(chuàng)建自動(dòng)編碼器神經(jīng)網(wǎng)絡(luò),并在mnist數(shù)據(jù)集上對其進(jìn)行測試,。 首先,,我們導(dǎo)入相關(guān)的Python庫,并讀入mnist數(shù)據(jù)集。 如果數(shù)據(jù)集存在于本地計(jì)算機(jī)上,,那么它將自動(dòng)讀取,,否則將通過運(yùn)行以下命令自動(dòng)下載。 import numpy as np 接下來,,我們?yōu)榉奖闫鹨妱?chuàng)建一些常量,,并事先聲明我們的激活函數(shù),。 mnist數(shù)據(jù)集中的圖像大小為28×28像素,即784像素,,我們將其壓縮為196像素,。 當(dāng)然你也可以更進(jìn)一步縮小像素大小。 但是,,壓縮太多可能會(huì)導(dǎo)致自動(dòng)編碼器丟失信息,。 num_inputs=784 #28x28 pixels 現(xiàn)在,我們?yōu)槊恳粚拥膚eights 和 biases創(chuàng)建變量,。 然后,,我們使用先前聲明的激活函數(shù)創(chuàng)建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()。 但是,,我們在這里使用它是因?yàn)槲覀冋谔幚聿粩嘧兓笮〉妮斎搿?因此,,placeholder張量形狀(placeholder用于輸入批處理)根據(jù)輸入大小的形狀調(diào)整自身,從而防止我們遇到任何維度錯(cuò)誤,。 通過簡單地將先前帶有相關(guān)weights 和 biases 的隱藏層作為輸入輸送到激活函數(shù)(ReLu)中來創(chuàng)建后面的隱藏層,。 我們將使用RMSE損失函數(shù)用于此神經(jīng)網(wǎng)絡(luò)并將其傳遞給Adam優(yōu)化器。你也可以替換這些來獲得更多結(jié)果,。 loss=tf.reduce_mean(tf.square(output_layer-X))
optimizer=tf.train.AdamOptimizer(lr)
train=optimizer.minimize(loss)
init=tf.global_variables_initializer() 現(xiàn)在,,我們定義epochs和batch size并運(yùn)行session。 我們使用mnist類的mnist.train.next_batch()來獲取每個(gè)新的batch,。 此外,,我們將在每個(gè)epoch之后輸出訓(xùn)練loss以監(jiān)控其訓(xùn)練。 num_epoch=5 最后,,我們將編寫一個(gè)小的繪圖函數(shù)來繪制原始圖像和重建圖,,以查看我們訓(xùn)練得到的模型的工作情況。 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)) 在這里,,我們可以看到重建并不完美,,但非常接近原始圖像。 注意上圖中,,2的重建看起來像是3,,這是由于壓縮時(shí)信息丟失造成的。 我們可以通過超參數(shù)調(diào)整來改進(jìn)自動(dòng)編碼器模型,,并且還可以通過在GPU上運(yùn)行訓(xùn)練來提高速度,。 獲取完整代碼,請?jiān)L問: 原文鏈接: |
|