溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行TensorFlow深度自動編碼器入門和實踐

發(fā)布時間:2021-12-23 15:33:23 來源:億速云 閱讀:185 作者:柒染 欄目:大數(shù)據(jù)

如何進行TensorFlow深度自動編碼器入門和實踐,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

包含從頭開始構(gòu)建Autoencoders模型的完整代碼。
我們一起來探索一個非監(jiān)督學習神經(jīng)網(wǎng)絡——Autoencoders(自動編碼器)。
自動編碼器是用于在輸出層再現(xiàn)輸入數(shù)據(jù)的深度神經(jīng)網(wǎng)絡,所以輸出層中的神經(jīng)元的數(shù)量與輸入層中的神經(jīng)元的數(shù)量完全相同。
如下圖所示:
如何進行TensorFlow深度自動編碼器入門和實踐
該圖像展示了典型的深度自動編碼器的結(jié)構(gòu)。自動編碼器網(wǎng)絡結(jié)構(gòu)的目標是在輸出層創(chuàng)建輸入的表示,使得兩者盡可能接近(相似)。 但是,自動編碼器的實際使用是用來得到具有最低數(shù)據(jù)丟失量的輸入數(shù)據(jù)的壓縮版本。 在機器學習項目中的作用類似于主成分分析( Principle Component Analysis,PCA),PCA的作用是在有大量屬性的數(shù)據(jù)集上訓練模型時找到最佳和最相關(guān)屬性。

自動編碼器以類似的方式工作。 其編碼器部分將輸入數(shù)據(jù)壓縮,確保重要數(shù)據(jù)不會丟失,但數(shù)據(jù)的整體大小會顯著減小。 這個概念稱為降維( Dimensionality Reduction)。
降維的缺點是,壓縮數(shù)據(jù)是一個黑盒子,即我們無法確定其壓縮后數(shù)據(jù)中的數(shù)據(jù)結(jié)構(gòu)的具體含義。 比如,假設我們有一個包含5個參數(shù)的數(shù)據(jù)集,我們在這些數(shù)據(jù)上訓練一個自動編碼器。 編碼器不會為了獲得更好的表示而省略某些參數(shù),它會將參數(shù)融合在一起(壓縮后的變量時綜合變量)以創(chuàng)建壓縮版本,使得參數(shù)更少(比如從5個壓縮到3個)。
自動編碼器有兩個部分,即編碼器和解碼器。
如何進行TensorFlow深度自動編碼器入門和實踐

編碼器壓縮輸入數(shù)據(jù),而解碼器則基于壓縮表示的數(shù)據(jù)反過來恢復數(shù)據(jù)的未壓縮版本,以盡可能準確地創(chuàng)建輸入的重建。

我們將使用Tensorflow的layers API創(chuàng)建自動編碼器神經(jīng)網(wǎng)絡,并在mnist數(shù)據(jù)集上對其進行測試。

首先,我們導入相關(guān)的Python庫,并讀入mnist數(shù)據(jù)集。 如果數(shù)據(jù)集存在于本地計算機上,那么它將自動讀取,否則將通過運行以下命令自動下載。

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)

接下來,我們?yōu)榉奖闫鹨妱?chuàng)建一些常量,并事先聲明我們的激活函數(shù)。 mnist數(shù)據(jù)集中的圖像大小為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

現(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()。 但是,我們在這里使用它是因為我們正在處理不斷變化大小的輸入。 因此,placeholder張量形狀(placeholder用于輸入批處理)根據(jù)輸入大小的形狀調(diào)整自身,從而防止我們遇到任何維度錯誤。 通過簡單地將先前帶有相關(guān)weights 和 biases 的隱藏層作為輸入輸送到激活函數(shù)(ReLu)中來創(chuàng)建后面的隱藏層。

我們將使用RMSE損失函數(shù)用于此神經(jīng)網(wǎng)絡并將其傳遞給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并運行session。 我們使用mnist類的mnist.train.next_batch()來獲取每個新的batch。 此外,我們將在每個epoch之后輸出訓練loss以監(jiān)控其訓練。

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))

最后,我們將編寫一個小的繪圖函數(shù)來繪制原始圖像和重建圖,以查看我們訓練得到的模型的工作情況。

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)))

如何進行TensorFlow深度自動編碼器入門和實踐

在這里,我們可以看到重建并不完美,但非常接近原始圖像。 注意上圖中,2的重建看起來像是3,這是由于壓縮時信息丟失造成的。

我們可以通過超參數(shù)調(diào)整來改進自動編碼器模型,并且還可以通過在GPU上運行訓練來提高速度。

關(guān)于如何進行TensorFlow深度自動編碼器入門和實踐問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI