


摘要:本文先介紹監督學習和無監督學習的概念,然后分析自編碼器的特點和結構,并設計自編碼網絡的結構,最后通過MNIST數據集對自編碼網絡進行訓練和結果分析。運行結果表明,自編碼器是深度學習中的一種非常重要的無監督學習方法,能夠從大量無標簽的數據中自動學習,得到蘊含在數據中的有效特征
關鍵詞:自編碼;深度學習;無監督學習
中圖分類號:TP183:文獻標識碼:A
0 引言
深度學習領域主要有兩種訓練模式:一種是監督學習,即不僅有樣本,還有對應的標簽;另一種是非監督學習,即只有樣本沒有標簽。對于監督學習的訓練任務來說,為已有樣本準備對應的標簽是一項很繁重的工作,因此,非監督學習就顯得簡單的多,因為如果能讓網絡直接使用樣本進行訓練而不需要再準備標簽,是更高效的事情。
本文接下來介紹的自編碼器是深度學習中的一種非常重要的無監督學習方法,能夠從大量無標簽的數據中自動學習,得到蘊含在數據中的有效特征[1]。
1自編碼器的特點
人平時看一幅圖像,并不是象電腦那樣去逐個去掃描,一般是看一眼就大致能得到所需要的信息,比如圖像的大小,形狀、色彩和特征等。自編碼器也有類似這樣的功能,它是非監督學習領域的一種,可以自動地從無標注的原始數據中學習到特征,是一種以重構輸入信號為目標的神經網絡,它可以得出比原始數據更好的特征描述,具有較強的特征學習能力,通常在深度學習中常用自編碼網絡生成的特征來取代原始數據,以得到更好的特征提取效果。
2 自編碼器的結構
自編碼器(Auto-Encoder,AE)網絡是輸入等于輸出的一種深度學習無監督學習網絡,最基本的模型可以是三層的神經網絡,即輸入層、隱藏層和輸出層。其中,輸入層的樣本在訓練中會充當輸出層的標簽角色。也就是說,自編碼網絡是一種盡可能復現輸入信號的神經網絡。具體的網絡結構圖如圖1所示。
上圖中,從輸入到中間狀態的過程叫做編碼,從中間狀態再回到輸出的過程叫做解碼。訓練后的自編碼器可以在隱藏層得到代表輸入數據的特征,類似于PCA算法(主成分分析),即找到可以代表原信息的主要成分。
自編碼器要求輸出盡可能等于輸入,并且其隱藏層必須滿足一定的稀疏性,這是通過將隱藏層中的神經元個數比前一層神經元個數少的方式來實現其稀疏效果的。相當于隱藏層對輸入進行了壓縮,并在輸出層中進行解壓縮。盡管整個過程中會有信息的丟失,但通過對模型的優化能使丟失的信息盡可能減少,從而最大化地保留其主要特征。其實自編碼器和PCA比較類似,如果激活函數不使用Sigmoid,而是使用線性函數,那么就成了PCA模型。
從以上分析得出,自編碼器是一種無監督的學習算法,主要用于數據的降維或者特征的抽取,
3 自編碼器的設計思想及代碼實現
本節我們將通過一個提取圖片特征并利用提取的特征還原圖片的實例來說明自編碼器的應用及代碼實現效果。
3.1 設計思想
自編碼器可以看作是對輸入數據的壓縮編碼,將高維的原始數據用低維的向量表示,使壓縮后的低維向量能保留輸入數據的典型特征,從而能夠較為方便地恢復原始數據[2]。這里需要注意的是,在對數據進行編碼和解碼時,使用的是同一個參數矩陣W。衡量W的訓練效果方法是,編碼后的數據能夠較為容易地通過解碼恢復成原始數據,我們則認為W較好的保留了數據信息。
3.2 MNIST數據集介紹
本文采用MNIST數據集是一個手寫數字的數據庫,它有60000個28*28像素的訓練樣本集和10000個28*28像素的測試樣本集。樣本中包含了各個訓練數據和相應的標簽,其中標簽集包含了0,1,2,3,4,5,6,7,8,9一共10個分類數據[3]。
3.3 創建自編碼網絡
下面通過構建一個六層的自編碼網絡,將MNIST數據集中的數字特征進行提取,再通過自編碼器把這些特征重建MNIST數據集。
(1)加載MNIST數據集,提取所有數據,把數據分為訓練和測試兩個數據集,分別是50000和10000條,不設定訓練集和測試集標簽。
(2)定義自編碼網絡結構
本文采用一個六層的深度學習自編碼網絡,先把28*28的原始數據轉換展平成784的一維數據作為輸入數據,通過第二層降維到256,然后再降到128,最后再以同樣的方式經過128,再經過256,最后還原成784的圖片并輸出結果進行對比。網絡結構變化如表1所示。
(3)訓練網絡
設置訓練的參數,epochs=20,batch_size=256,learnning_rate=0.01。然后定義編碼和解碼函數,損失函數采用均方差,優化器采用RMSP。編碼和解碼的部分核心代碼如下:
# 編碼
def encoder(x):
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']))
return layer_2
# 解碼
def decoder(x):
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']))
return layer_2
#輸出的節點
encoder_out = encoder(x)
pred = decoder(encoder_out)
# 損失函數為平方差
cost = tf.reduce_mean(tf.pow(y - pred, 2))
optimizer
= tf.train.RMSPropOptimizer(learning_rate).minimize(cost)
(4)測試模型
通過MNIST數據集中的測試集測試訓練后的模型準確度,訓練結果如下所示。
Epoch: 0001 cost= 0.191340700
Epoch: 0006 cost= 0.119541861
Epoch: 0011 cost= 0.102257006
Epoch: 0016 cost= 0.094441280
訓練完成!
Accuracy: 1.0
從上述信息可以得到,經過20個epochs訓練后的效果非常好,準確率達到了100%。
(5)圖像還原
接下來我們抽取部分還原圖片的信息進行顯示,結果如圖2所示,其中第一行顯示的內容為輸入圖片,第二行顯示的內容為輸出圖片。
4 總結
該文首先介紹傳統自編碼器的特點與基本結構,分析自編碼器的一般處理框架。然后,通過MNIST數據集進行自編碼器的編程訓練、測試和結果輸出。從運行的結果來看,該網絡能比較好的進行了圖片的還原。說明在深度學習中用自編碼網絡生成的特征來取代原始數據,可以取得較好的特征提取效果。
參考文獻
[1] 袁非牛,章琳,史勁亭等.自編碼神經網絡理論及應用綜述[J],計算機學報,2019(01).
[2] 苗宇宏等.基于深度卷積自編碼網絡的圖像融合[J],計算機應用研究,2020(6).
[3] 王曉華. TensorFlow 2.0卷積神經網絡實戰 [M]. 清華大學出版社出版社,2020
作者簡介:翟高粵,男,1975.11,廣西欽州,漢,碩士,副教授,研究方向:軟件理論,人工智能。