日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

简单易懂的自动编码器(简单辅助官网)

發(fā)布時間:2023/12/19 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 简单易懂的自动编码器(简单辅助官网) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:葉虎

編輯:田旭

引言

自動編碼器是一種無監(jiān)督的神經(jīng)網(wǎng)絡(luò)模型,它可以學(xué)習(xí)到輸入數(shù)據(jù)的隱含特征,這稱為編碼(coding),同時用學(xué)習(xí)到的新特征可以重構(gòu)出原始輸入數(shù)據(jù),稱之為解碼(decoding)。從直觀上來看,自動編碼器可以用于特征降維,類似主成分分析PCA,但是其相比PCA其性能更強(qiáng),這是由于神經(jīng)網(wǎng)絡(luò)模型可以提取更有效的新特征。除了進(jìn)行特征降維,自動編碼器學(xué)習(xí)到的新特征可以送入有監(jiān)督學(xué)習(xí)模型中,所以自動編碼器可以起到特征提取器的作用。作為無監(jiān)督學(xué)習(xí)模型,自動編碼器還可以用于生成與訓(xùn)練樣本不同的新數(shù)據(jù),這樣自動編碼器(變分自動編碼器,VariationalAutoencoders)就是生成式模型。

本文將會講述自動編碼器的基本原理以及常用的自動編碼器模型:堆棧自動編碼器(StackedAutoencoder)。后序的文章會講解自動編碼器其他模型:去噪自動編碼器(DenoisingAutoencoder),稀疏自動編碼器(SparseAutoencoder)以及變分自動編碼器。所有的模型都會使用Tensorflow進(jìn)行編程實(shí)現(xiàn)。

自動編碼器原理

自動編碼器的基本結(jié)構(gòu)如圖1所示,包括編碼和解碼兩個過程:

圖1自動編碼器的編碼與解碼

自動編碼器是將輸入進(jìn)行編碼,得到新的特征,并且希望原始的輸入能夠從新的特征重構(gòu)出來。編碼過程如下:

可以看到,和神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)一樣,其編碼就是線性組合之后加上非線性的激活函數(shù)。如果沒有非線性的包裝,那么自動編碼器就和普通的PCA沒有本質(zhì)區(qū)別了。利用新的特征,可以對輸入重構(gòu),即解碼過程:

我們希望重構(gòu)出的和盡可能一致,可以采用最小化負(fù)對數(shù)似然的損失函數(shù)來訓(xùn)練這個模型:

對于高斯分布的數(shù)據(jù),采用均方誤差就好,而對于伯努利分布可以采用交叉熵,這個是可以根據(jù)似然函數(shù)推導(dǎo)出來的。一般情況下,我們會對自動編碼器加上一些限制,常用的是使,這稱為綁定權(quán)重(tiedweights),本文所有的自動編碼器都加上這個限制。有時候,我們還會給自動編碼器加上更多的約束條件,去噪自動編碼器以及稀疏自動編碼器就屬于這種情況,因?yàn)榇蟛糠謺r候單純地重構(gòu)原始輸入并沒有什么意義,我們希望自動編碼器在近似重構(gòu)原始輸入的情況下能夠捕捉到原始輸入更有價值的信息。

堆棧自動編碼器

前面我們講了自動編碼器的原理,不過所展示的自動編碼器只是簡答的含有一層,其實(shí)可以采用更深層的架構(gòu),這就是堆棧自動編碼器或者深度自動編碼器,本質(zhì)上就是增加中間特征層數(shù)。這里我們以MNIST數(shù)據(jù)為例來說明自動編碼器,建立兩個隱含層的自動編碼器,如圖2所示:

圖2堆棧自動編碼器架構(gòu)

對于MNIST來說,其輸入是28*28=784維度的特征,這里使用了兩個隱含層其維度分別為300和150,可以看到是不斷降低特征的維度了。得到的最終編碼為150維度的特征,使用這個特征進(jìn)行反向重構(gòu)得到重建的特征,我們希望重建特征和原始特征盡量相同。由于MNIST是0,1量,可以采用交叉熵作為損失函數(shù),TF的代碼核心代碼如下:

(左右滑動,查看完整代碼)

n_inputs = 28*28
n_hidden1 = 300
n_hidden2 = 150

# 定義輸入占位符:不需要y
X = tf.placeholder(tf.float32, [None, n_inputs])

# 定義訓(xùn)練參數(shù)
initializer = tf.contrib.layers.variance_scaling_initializer()
W1 = tf.Variable(initializer([n_inputs, n_hidden1]), name="W1")
b1 = tf.Variable(tf.zeros([n_hidden1,]), name="b1")
W2 = tf.Variable(initializer([n_hidden1, n_hidden2]), name="W2")
b2 = tf.Variable(tf.zeros([n_hidden2,]), name="b2")
W3 = tf.transpose(W2, name="W3")
b3 = tf.Variable(tf.zeros([n_hidden1,]), name="b3")
W4 = tf.transpose(W1, name="W4")
b4 = tf.Variable(tf.zeros([n_inputs,]), name="b4")

# 構(gòu)建模型
h1 = tf.nn.sigmoid(tf.nn.xw_plus_b(X, W1, b1))
h2 = tf.nn.sigmoid(tf.nn.xw_plus_b(h1, W2, b2))
h3 = tf.nn.sigmoid(tf.nn.xw_plus_b(h2, W3, b3))
outputs = tf.nn.sigmoid(tf.nn.xw_plus_b(h3, W4, b4))

# 定義loss
loss = -tf.reduce_mean(tf.reduce_sum(X * tf.log(outputs) +
(1 - X) * tf.log(1 - outputs), axis=1))
train_op = tf.train.AdamOptimizer(1e-02).minimize(loss)

當(dāng)訓(xùn)練這個模型后,你可以將原始MNIST的數(shù)字手寫體與重構(gòu)出的手寫體做個比較,如圖3所示,上面是原始圖片,而下面是重構(gòu)圖片,基本上沒有差別了。盡管我們將維度從784降低到了150,得到的新特征還是抓取了原始特征的核心信息。

圖3原始圖片(上)與重構(gòu)圖片對比(下)

有一點(diǎn),上面的訓(xùn)練過程是一下子訓(xùn)練完成的,其實(shí)對于堆棧編碼器來說,有時候會采用逐層訓(xùn)練方式。直白點(diǎn)就是一層一層地訓(xùn)練:先訓(xùn)練X->h1的編碼,使h1->X的重構(gòu)誤差最小化;之后再訓(xùn)練h1->h2的編碼,使h2->h1的重構(gòu)誤差最小化。其實(shí)現(xiàn)代碼如下:

(左右滑動,查看完整代碼)

# 構(gòu)建模型
h1 = tf.nn.sigmoid(tf.nn.xw_plus_b(X, W1, b1))
h1_recon = tf.nn.sigmoid(tf.nn.xw_plus_b(h1, W4, b4))
h2 = tf.nn.sigmoid(tf.nn.xw_plus_b(h1, W2, b2))
h2_recon = tf.nn.sigmoid(tf.nn.xw_plus_b(h2, W3, b3))
outputs = tf.nn.sigmoid(tf.nn.xw_plus_b(h2_recon, W4, b4))

learning_rate = 1e-02
# X->h1
with tf.name_scope("layer1"):
layer1_loss = -tf.reduce_mean(tf.reduce_sum(X * tf.log(h1_recon) +
(1-X) * tf.log(1-h1_recon), axis=1))
layer1_train_op = tf.train.AdamOptimizer(learning_rate).minimize(layer1_loss,
var_list=[W1, b1, b4])

# h1->h2
with tf.name_scope("layer2"):
layer2_loss = -tf.reduce_mean(tf.reduce_sum(h1 * tf.log(h2_recon) +
(1 - h1) * tf.log(1 - h2_recon), axis=1))
layer2_train_op = tf.train.AdamOptimizer(learning_rate).minimize(layer2_loss,
var_list=[W2, b2, b3])

分層訓(xùn)練之后,最終得到如圖4所示的對比結(jié)果,結(jié)果還是不錯的。

圖4原始圖片(上)與重構(gòu)圖片對比(下)

小結(jié)

自動編碼器應(yīng)該是最通俗易懂的無監(jiān)督神經(jīng)網(wǎng)絡(luò)模型,這里我們介紹了其基本原理及堆棧自動編碼器。后序會介紹更多的自動編碼器模型。

參考文獻(xiàn)

1. Hands-On Machine Learning withScikit-Learn and TensorFlow, Aurélien Géron, 2017.

2. Deep Learning Tutorials:AutoEncoders, Denoising Autoencoders.

http://deeplearning.net/tutorial/dA.html#daa

3. Learning deep architectures for AI, Foundations and Trends inMachine Learning, Y. Bengio, 2009.

1.全面直觀認(rèn)識深度神經(jīng)網(wǎng)絡(luò)

2.機(jī)器學(xué)習(xí)實(shí)戰(zhàn)——LBP特征提取

3.RNN入門與實(shí)踐

4.Logistic回歸實(shí)戰(zhàn)篇之預(yù)測病馬死亡率(三)

掃描個人微信號,

拉你進(jìn)機(jī)器學(xué)習(xí)大牛群。

福利滿滿,名額已不多…

80%的AI從業(yè)者已關(guān)注我們微信公眾號

總結(jié)

以上是生活随笔為你收集整理的简单易懂的自动编码器(简单辅助官网)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。