详解自动编码器(AE)
自動(dòng)編碼器(AE,DAE,CAE,SAE)的方法介紹與簡(jiǎn)單實(shí)現(xiàn)(附代碼)
自動(dòng)編碼器的發(fā)展簡(jiǎn)述
自動(dòng)編碼器(Auto-Encoders,AE)
傳統(tǒng)的自動(dòng)編碼器是一種數(shù)據(jù)的壓縮算法
其算法包括編碼階段和解碼階段,且擁有對(duì)稱(chēng)的結(jié)構(gòu)。
目前自編碼器的應(yīng)用主要有兩個(gè)方面,第一是數(shù)據(jù)去噪,第二是為進(jìn)行可視化而降維。配合適當(dāng)?shù)木S度和稀疏約束,自編碼器可以學(xué)習(xí)到比PCA等技術(shù)更有意思的數(shù)據(jù)投影。
傳統(tǒng)編碼器的編解碼過(guò)程描述如圖:
評(píng)價(jià):
傳統(tǒng)自編碼器的目的是使輸出與輸入盡量相同,這完全可以通過(guò)學(xué)習(xí)兩個(gè)恒等函數(shù)來(lái)完成,但是這樣的變換沒(méi)有任何意義,因?yàn)槲覀冋嬲P(guān)心的是隱層表達(dá),而不是實(shí)際輸出。因此,針對(duì)自編碼器的很多改進(jìn)方法都是對(duì)隱層表達(dá)增加一定的約束,迫使隱層表達(dá)與輸入不同。
降噪自編碼(Denoising Auto-Encoders, DAE)(2008)
自編碼器真正關(guān)心的是隱藏層的特征表達(dá),一個(gè)好的表達(dá)能夠捕獲輸入信號(hào)的穩(wěn)定結(jié)構(gòu),以該目的為出發(fā)出現(xiàn)了降噪自動(dòng)編碼器。
降噪自動(dòng)編碼器,首先對(duì)干凈的輸入信號(hào)加入噪聲產(chǎn)生一個(gè)受損的信號(hào)。然后將受損信號(hào)送入傳統(tǒng)的自動(dòng)編碼器中,使其重建回原來(lái)的無(wú)損信號(hào)。
降噪自編碼器的編解碼過(guò)程描述如圖:
降噪自編碼器與傳統(tǒng)的自動(dòng)編碼器的主要區(qū)別在于:
1.降噪自編碼器通過(guò)人為的增加噪聲使模型獲得魯棒性的特征表達(dá)
2.避免使隱層單元學(xué)習(xí)一個(gè)傳統(tǒng)自編碼器中沒(méi)有意義的恒等函數(shù)
評(píng)價(jià):
降噪自編碼器通過(guò)對(duì)輸入信號(hào)人為地進(jìn)行損壞,主要是為了達(dá)到兩個(gè)目的,首先是為了避免使隱層單元學(xué)習(xí)一個(gè)傳統(tǒng)自編碼器中沒(méi)有實(shí)際意義的恒等函數(shù),其次就是為了使隱層單元可以學(xué)習(xí)到一個(gè)更加具有魯棒性的特征表達(dá)。
降噪自編碼器最大的優(yōu)點(diǎn)在于,重建信號(hào)對(duì)輸入中的噪聲具有一定的魯棒性,而最大的缺陷在于每次進(jìn)行網(wǎng)絡(luò)訓(xùn)練之前,都需要對(duì)干凈輸入信號(hào)人為地添加噪聲,以獲得它的損壞信號(hào),這無(wú)形中就增加了該模型的處理時(shí)間。
堆疊降燥自動(dòng)編碼器 (Stacked Denoising Auto-Encoders, SAE)(2008)
降噪自編碼器的編解碼過(guò)程描述如圖:
堆疊降噪自編碼器與降噪自編碼器的區(qū)別在于:
1.堆疊降噪自編碼器采用了降噪編碼器的編碼器作為基礎(chǔ)單元,并且使用其訓(xùn)練方法進(jìn)行預(yù)訓(xùn)練
2.降噪自動(dòng)編碼器是無(wú)監(jiān)督學(xué)習(xí)(自監(jiān)督)的一種方法,而降噪自編碼器是一種有監(jiān)督方法.
評(píng)價(jià):
堆疊降噪自編碼器是降噪自編碼器的一個(gè)應(yīng)用方法.
卷積自動(dòng)編碼器(Convolution Auto-Encoders, CAE)(2011)
全卷積網(wǎng)絡(luò)是一種面向特定應(yīng)用(圖像語(yǔ)義分割)的卷積神經(jīng)網(wǎng)絡(luò),其結(jié)構(gòu)圖如下圖所示:
與經(jīng)典的CNN在卷積層之后使用全連接層得到固定長(zhǎng)度的特征向量進(jìn)行分類(lèi)(全聯(lián)接層+softmax輸出)不同,F(xiàn)CN可以接受任意尺寸的輸入圖像,采用反卷積層對(duì)最后一個(gè)卷積層的feature map進(jìn)行上采樣, 使它恢復(fù)到輸入圖像相同的尺寸,從而可以對(duì)每個(gè)像素都產(chǎn)生了一個(gè)預(yù)測(cè), 同時(shí)保留了原始輸入圖像中的空間信息, 最后在上采樣的特征圖上進(jìn)行逐像素分類(lèi)。
與全卷積網(wǎng)絡(luò)類(lèi)似的一種無(wú)監(jiān)督方法稱(chēng)為卷機(jī)自動(dòng)編碼器。
由于卷積神經(jīng)網(wǎng)絡(luò)所取得的各種優(yōu)異表現(xiàn),直接推動(dòng)了卷積自編碼器的產(chǎn)生。
卷積自編碼器屬于傳統(tǒng)自編碼器的一個(gè)特例,它使用卷積層和池化層替代了原來(lái)的全連接層,卷積自編碼器能很好的保留二維信號(hào)的空間信息。
評(píng)價(jià):
其主要差別在于卷積自編碼器采用卷積方式對(duì)輸入信號(hào)進(jìn)行線性變換,并且其權(quán)重是共享的,這點(diǎn)與卷積神經(jīng)網(wǎng)絡(luò)一樣。因此,重建過(guò)程就是基于隱藏編碼的基本圖像塊的線性組合。
變分自動(dòng)編碼器(Variational Auto-Encoders, VAE)(Kingma, 2014)
變分自編碼器是一種主要用于數(shù)據(jù)生成的自編碼器的變體.當(dāng)作為生成模型時(shí),首先利用數(shù)據(jù)訓(xùn)練變分自編碼器,然后只使用變分自編碼器的解碼部分,自動(dòng)生成與訓(xùn)練數(shù)據(jù)類(lèi)似的輸出.
其結(jié)構(gòu)圖如圖所示:
整個(gè)結(jié)構(gòu)可以分成三個(gè)部分,分別是編碼部分,解碼部分和生成部分.編碼部分和解碼部分同時(shí)進(jìn)行訓(xùn)練,目標(biāo)函數(shù)是從KL散度的概念中推倒得到的.
loss函數(shù)的推導(dǎo)過(guò)程:
幾種算法的改進(jìn)點(diǎn)表格
| 編碼器名稱(chēng) | 提出時(shí)間 | 改進(jìn)點(diǎn) | 目的 |
|---|---|---|---|
| 傳統(tǒng)自編碼器 | 1986 | 無(wú) | 無(wú) |
| 降噪自編碼器 | 2008 | 將帶有噪聲的損壞信息作為輸入信號(hào) | 使重建信號(hào)魯棒性更強(qiáng) |
| 堆疊自編碼器 | 2008 | 將多層結(jié)構(gòu)和棧式訓(xùn)練引入自編碼器 | 使自編碼器可以訓(xùn)練更高層數(shù) |
| 卷積自編碼器 | 2011 | 將卷積層引入自編碼器 | 更好的處理圖片數(shù)據(jù),得到更好的效果 |
| 變分自編碼器 | 2014 | 相當(dāng)于在傳統(tǒng)自編碼器的隱層表達(dá)上增加一個(gè)對(duì)隱變量的約束,提出了一種將概率模型和神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的方法 | 使編碼器產(chǎn)生的隱層表達(dá)滿足正態(tài)分布,能夠更好的生成圖像模型 |
實(shí)現(xiàn)與Python實(shí)現(xiàn)
傳統(tǒng)的自動(dòng)編碼器實(shí)驗(yàn)結(jié)果
模型結(jié)構(gòu)與實(shí)現(xiàn)代碼
傳統(tǒng)的自動(dòng)編碼器分為編碼器部分和解碼器部分,整體模型結(jié)構(gòu)如圖所示:
模型分為三個(gè)子模塊,由上至下分別為輸入層,編碼器層和解碼器層,編碼器將輸入維度為784(28 28)的mnint灰度值轉(zhuǎn)化為一個(gè)維度為2的值.編碼器將維度為2的值解碼回維度為784(28 28)的mnint灰度值.
python-keras代碼實(shí)現(xiàn)關(guān)鍵代碼如下
def __init__(self, ENCODING_DIM_INPUT=784, ENCODING_DIM_OUTPUT=2, Name = "ae"):
input_image = Input(shape=(ENCODING_DIM_INPUT, ))
# encoding layer
hidden_layer = Dense(ENCODING_DIM_OUTPUT, activation='relu')(input_image)
# decoding layer
decode_output = Dense(ENCODING_DIM_INPUT, activation='relu')(hidden_layer)
# build autoencoder, encoder, decoder
autoencoder = Model(inputs=input_image, outputs=decode_output)
encoder = Model(inputs=input_image, outputs=hidden_layer)
# compile autoencoder
autoencoder.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
self.autoencoder = autoencoder
self.encoder = encoder
訓(xùn)練過(guò)程
本實(shí)驗(yàn)討論使用relu和tanh兩種激活函數(shù)的自監(jiān)督訓(xùn)練的情況.訓(xùn)練的loss函數(shù)選擇為方均根誤差.
訓(xùn)練過(guò)程的loss變化圖像如下.
使用tanh作為激活函數(shù)時(shí),loss變化情況如下:
可以觀察到,loss收斂到0.0685,效果較好.使用relu作為激活函數(shù)同樣能夠有效收斂,不過(guò)誤差數(shù)值相對(duì)較大.由于篇幅原因不將圖片在此進(jìn)行展示.
編碼器輸出的可視化結(jié)果
本節(jié)將從重建圖像和編碼器輸出層的二維可視化圖像兩部分進(jìn)行展示,分別展示使用tanh和relu兩種損失函數(shù)的訓(xùn)練結(jié)果.
訓(xùn)練好的自動(dòng)編碼器重建圖像(使用relu激活函數(shù))如下圖:
訓(xùn)練好的自動(dòng)編碼器重建圖像(使用tanh激活函數(shù))如下圖:
兩者對(duì)比可以發(fā)現(xiàn)relu函數(shù)訓(xùn)練出的模型存在一些像素顆粒,這也驗(yàn)證了上一節(jié)loss函數(shù)較大的實(shí)驗(yàn)結(jié)果.為了解釋該問(wèn)題,展示編碼器輸出層的二維可視化圖片.
訓(xùn)練好的編碼器輸出圖像(使用relu激活函數(shù))如下圖:
訓(xùn)練好的編碼器輸出圖像(使用tanh激活函數(shù))如下圖:
以上兩張圖片是 編碼器-解碼器 結(jié)構(gòu)中編碼器部分的輸出繪制成的二維可視化圖片,不同的顏色代表了不同的數(shù)字,對(duì)應(yīng)的數(shù)字在右邊的圖例中進(jìn)行了顯示.從以上兩張圖片中可以得到:
1.由于relu函數(shù)對(duì)負(fù)數(shù)的截?cái)嘈再|(zhì),使用relu激活函數(shù)訓(xùn)練的模型中有一部分點(diǎn)被限制在x=0,y=0兩條邊緣線上,這也是上文中提到的訓(xùn)練誤差較大和出現(xiàn)像素顆粒的原因.
2.自動(dòng)編碼器雖然能夠?qū)nist數(shù)據(jù)集進(jìn)行編碼和解碼,但是效果并沒(méi)有其改進(jìn)的其他方法理想,這一觀點(diǎn)可以從解碼圖片較為模糊和編碼器可視化后各個(gè)類(lèi)別的分類(lèi)相重合得到驗(yàn)證.
說(shuō)明與討論
傳統(tǒng)自編碼器有很大的改進(jìn)空間,改進(jìn)空間的可以從幾個(gè)方面闡述:
1.解碼器輸出較為模糊
2.編碼器可視化的類(lèi)別間的界限不明顯
堆疊降噪自編碼器
模型結(jié)構(gòu)與實(shí)現(xiàn)代碼
傳統(tǒng)的自動(dòng)編碼器分為編碼器部分和解碼器部分,整體模型結(jié)構(gòu)如圖所示:
模型分為三個(gè)子模塊,由上至下分別為輸入層,多層編碼器層和多層解碼器層,編碼器將輸入維度為784(28 28)的mnint灰度值轉(zhuǎn)化為一個(gè)維度為2的值.編碼器將維度為2的值解碼回維度為784(28 28)的mnint灰度值
python-keras代碼實(shí)現(xiàn)關(guān)鍵代碼如下
class DAE(ae.AE):
def __init__(
self, ENCODING_DIM_INPUT=784, ENCODING_DIM_LAYER1=128,
ENCODING_DIM_LAYER2=64, ENCODING_DIM_LAYER3=10,
ENCODING_DIM_OUTPUT=2,Name="dae" ):
# input placeholder
input_image = Input(shape=(ENCODING_DIM_INPUT, ))
# encoding layer
encode_layer1 = Dense(ENCODING_DIM_LAYER1,
activation='relu')(input_image)
encode_layer2 = Dense(ENCODING_DIM_LAYER2,
activation='relu')(encode_layer1)
encode_layer3 = Dense(ENCODING_DIM_LAYER3,
activation='relu')(encode_layer2)
encode_output = Dense(ENCODING_DIM_OUTPUT)(encode_layer3)
# decoding layer
decode_layer1 = Dense(ENCODING_DIM_LAYER3,
activation='relu')(encode_output)
decode_layer2 = Dense(ENCODING_DIM_LAYER2,
activation='relu')(decode_layer1)
decode_layer3 = Dense(ENCODING_DIM_LAYER1,
activation='relu')(decode_layer2)
decode_output = Dense(ENCODING_DIM_INPUT,
activation='tanh')(decode_layer3)
# build surprised learning model
SL_output = Dense(10, activation='softmax')(encode_output)
# build autoencoder, encoder
autoencoder = Model(inputs=input_image, outputs=decode_output)
encoder = Model(inputs=input_image, outputs=encode_output)
SL_model = Model(inputs=input_image, outputs=SL_output)
# compile autoencoder
autoencoder.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
SL_model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
代碼定義了三個(gè)模型,分別是用于自監(jiān)督訓(xùn)練的 autoencoder, 用于二維化的編碼器 encoder 和用于進(jìn)行有監(jiān)督訓(xùn)練的 SL_model.
訓(xùn)練過(guò)程
堆疊降噪自動(dòng)編碼器分為無(wú)監(jiān)督的預(yù)訓(xùn)練過(guò)程和有監(jiān)督的訓(xùn)練過(guò)程兩部分.
本部分分別進(jìn)行說(shuō)明.
自監(jiān)督的預(yù)訓(xùn)練過(guò)程loss變化情況如下.
無(wú)監(jiān)督的訓(xùn)練過(guò)程正確率acc變化情況如下.
可以看到,在兩個(gè)訓(xùn)練階段,方法可以有效的達(dá)到收斂.
以下幾點(diǎn)需要指出:
1.多層編碼器的訓(xùn)練沒(méi)有使用棧式編碼器的訓(xùn)練方式.
2.預(yù)訓(xùn)練次數(shù)20epoch,并不足夠模型充分收斂,但是作為預(yù)訓(xùn)練部分,已經(jīng)充分.
3.預(yù)訓(xùn)練部分的誤差與傳統(tǒng)自編碼器相比較大,是因?yàn)樵诔跏紝蛹尤肓嗽肼暤脑?
4.訓(xùn)練時(shí)間與傳統(tǒng)編碼器相比更長(zhǎng),是其3倍左右.
5.在有監(jiān)督學(xué)習(xí)的開(kāi)始階段,分類(lèi)的正確率并不高,這也印證了上一部分二位可視化的結(jié)果,很多點(diǎn)的界限不清晰.
編碼器輸出的可視化結(jié)果
本節(jié)將從重建圖像和編碼器輸出層的二維可視化圖像兩部分進(jìn)行展示
預(yù)訓(xùn)練部分
重建圖像
下圖展示了添加噪聲的效果(第一行原圖,第二行增加噪聲的圖).
下圖展示了,對(duì)添加噪聲的圖片進(jìn)行重構(gòu)的結(jié)果(第一行增加噪聲的圖,第二行重構(gòu)圖)
編碼器輸出層的二維可視化圖像
下圖展示了添加噪聲的效果(第一行原圖,第二行增加噪聲的圖).
以下幾點(diǎn)需要指出:
1.本方法可以有效的對(duì)隨機(jī)噪聲進(jìn)行去除
2.恢復(fù)圖與原圖相比雖然能夠識(shí)別但是效果更模糊
3.與傳統(tǒng)自動(dòng)編碼器相比,本方法得到的二維圖的界限更加清晰
有監(jiān)督訓(xùn)練部分
經(jīng)過(guò)有監(jiān)督的訓(xùn)練
重建圖像(因?yàn)椴皇悄繕?biāo),所以必然走樣)
下圖展示了,對(duì)添加噪聲的圖片進(jìn)行重構(gòu)的結(jié)果(第一行增加噪聲的圖,第二行重構(gòu)圖)
編碼器輸出層的二維可視化圖像
經(jīng)過(guò)有監(jiān)督學(xué)習(xí),二維可視化圖中各個(gè)組的界限更加清晰.
說(shuō)明與討論
堆疊降噪自編碼器的改進(jìn)有以下啟發(fā):
1.使用自監(jiān)督預(yù)訓(xùn)練與有監(jiān)督訓(xùn)練方式相結(jié)合的形式獲得更加優(yōu)秀的效果
2.使用增加噪聲的形式迫使模型學(xué)習(xí)更加有效的特征
3.將深度玻爾茲曼姬的思想遷移到自動(dòng)編碼器中
卷積自編碼器
模型結(jié)構(gòu)與實(shí)現(xiàn)代碼
卷積自編碼器自動(dòng)編碼器分為編碼器部分和解碼器部分,整體模型結(jié)構(gòu)如圖所示:
python-keras代碼實(shí)現(xiàn)關(guān)鍵代碼如下:
def __init__(self,CHANNEL_1 = 16,CHANNEL_2 = 8,CHANNEL_OUTPUT = 1, Name="cae"):
# input placeholder
input_image = Input(shape=(28, 28, 1))
# encoding layer
x = Conv2D(CHANNEL_1, (3, 3), activation='relu', padding="same")(input_image)
x = MaxPool2D((2, 2), padding='same')(x)
x = Conv2D(CHANNEL_2, (3, 3), activation='relu', padding='same')(x)
encode_output = MaxPool2D((2, 2), padding='same')(x)
# decoding layer
x = Conv2D(CHANNEL_2, (3, 3), activation='relu', padding='same')(encode_output)
x = UpSampling2D((2, 2))(x)
x = Conv2D(CHANNEL_1, (3, 3),activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decode_output = Conv2D(CHANNEL_OUTPUT, (3, 3), activation='sigmoid', padding='same')(x)
# build surprised learning model
encode_output_flatten = Flatten()(decode_output)
SL_output = Dense(10, activation='softmax')(encode_output_flatten)
# build autoencoder, encoder
autoencoder = Model(inputs=input_image, outputs=decode_output)
encoder = Model(inputs=input_image, outputs=encode_output)
SL_model = Model(inputs=input_image, outputs=SL_output)
# compile autoencoder
autoencoder.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
SL_model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
訓(xùn)練過(guò)程
堆疊降噪自動(dòng)編碼器分為無(wú)監(jiān)督的預(yù)訓(xùn)練過(guò)程和有監(jiān)督的訓(xùn)練過(guò)程兩部分.
本部分分別進(jìn)行說(shuō)明.
在自監(jiān)督的預(yù)訓(xùn)練過(guò)程loss變化情況如下:
圖像顯示,自監(jiān)督的訓(xùn)練loss收斂于0.07左右,該誤差比降噪自編碼器的0.09要小.與傳統(tǒng)自編碼器的訓(xùn)練誤差相差不多.但是從下文可知其訓(xùn)練效果明顯優(yōu)于傳統(tǒng)自動(dòng)編碼器.
在有監(jiān)督的訓(xùn)練過(guò)程正確率acc變化情況如下:
圖像顯示,有監(jiān)督訓(xùn)練過(guò)程的正確率上升到0.99,比降噪自動(dòng)編碼器的正確(0.95)率更高.
因此在mnist數(shù)據(jù)集中的重建任務(wù)和分類(lèi)任務(wù)中,卷積自動(dòng)編碼器有一定優(yōu)勢(shì).
不過(guò)以下幾點(diǎn)需要指出:
1.與sDAE相比,CAE有更高的準(zhǔn)確率和更低的損失
2.更好的效果除了卷積單元能夠更好的處理圖像數(shù)據(jù)外,可能與CAE方法的復(fù)雜度更高和其瓶頸處通道更寬有關(guān)
編碼器輸出的可視化結(jié)果
可以看到和stacked AE的主要區(qū)別在于局部卷積連接,而不所有層都是全連接。對(duì)圖像和某些其他數(shù)據(jù)影響在空間局部的問(wèn)題,比全連接更合適.因此效果更加優(yōu)秀.
于降噪自動(dòng)編碼器相同,首先對(duì)圖片增加噪聲:
然后對(duì)增加噪聲的圖片進(jìn)行去噪:
去噪結(jié)果比較優(yōu)秀,與上文中所有的結(jié)果相比是最優(yōu)秀的.
變分自編碼器
模型結(jié)構(gòu)與實(shí)現(xiàn)代碼
變分自動(dòng)編碼器的結(jié)構(gòu)最為復(fù)雜,并且在模型中引入了隱變量,和KL散度等概率論概念.對(duì)模型的實(shí)現(xiàn)造成了一定的影響.
自動(dòng)編碼器分為編碼器部分和解碼器部分,整體模型結(jié)構(gòu)如圖所示:
上圖中并沒(méi)有展開(kāi)編碼器和解碼器的結(jié)構(gòu),編碼器(encoder) 與 解碼器(decoder)的形式分別如下:
encoder:
decoder:
python-keras代碼實(shí)現(xiàn)關(guān)鍵代碼如下:
class VAE(ae.AE):
def __init__(
self,
ENCODING_DIM_INPUT = 784,
intermediate_dim = 512,
batch_size = 128,
latent_dim = 2,
mse_loss = True,
Name="vae"
):
self.name = Name
# input placeholder
input_image = Input(shape=(ENCODING_DIM_INPUT,), name='encoder_input')
# VAE model = encoder + decoder
# encoding layer
x = Dense(intermediate_dim, activation='relu')(input_image)
z_mean = Dense(latent_dim, name='z_mean')(x)
z_log_var = Dense(latent_dim, name='z_log_var')(x)
z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])
# build decoder model
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
x = Dense(intermediate_dim, activation='relu')(latent_inputs)
outputs = Dense(ENCODING_DIM_INPUT, activation='sigmoid')(x)
# # build surprised learning model
# SL_output = Dense(10, activation='softmax')()
# build autoencoder, encoder
encoder = Model(input_image, [z_mean, z_log_var, z], name='encoder')
decoder = Model(latent_inputs, outputs, name='decoder')
# SL_model = Model(inputs=input_image, outputs=SL_output)
outputs = decoder(encoder(input_image)[2])
autoencoder = Model(input_image, outputs, name='vae_mlp')
# compile autoencoder
# VAE loss = mse_loss or xent_loss + kl_loss
if mse_loss:
reconstruction_loss = mse(input_image, outputs)
else:
reconstruction_loss = binary_crossentropy(input_image,outputs)
reconstruction_loss *= ENCODING_DIM_INPUT
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.sum(kl_loss, axis=-1)
kl_loss *= -0.5
vae_loss = K.mean(reconstruction_loss + kl_loss)
autoencoder.add_loss(vae_loss)
autoencoder.compile(optimizer='adam')
autoencoder.summary()
# SL_model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
self.autoencoder = autoencoder
self.encoder = encoder
self.decoder = decoder
訓(xùn)練過(guò)程
由于,變分自動(dòng)編碼器主要應(yīng)用于圖像生成,而并非是提取與分類(lèi),因此變分降噪自動(dòng)編碼器只有自監(jiān)督的訓(xùn)練過(guò)程…
在自監(jiān)督的訓(xùn)練過(guò)程,使用 KL散度+交叉熵 作為loss函數(shù),loss變化情況如下.
可以看散度可以收斂到145的情況,能夠有效進(jìn)行收斂.
在自監(jiān)督的訓(xùn)練過(guò)程,使用 KL散度+方均根 作為loss函數(shù),loss變化情況如下.
對(duì)于兩種損失函數(shù)效果的討論在下文中進(jìn)行.
自編碼器輸出的可視化結(jié)果
使用 KL散度+交叉熵 作為損失函數(shù)
基于kl散度的loss訓(xùn)練結(jié)果二維可視化如下
使用生成器對(duì)圖像進(jìn)行生成可以得到如下結(jié)果.
使用 KL散度+方均根 作為損失函數(shù)
基于kl散度的loss訓(xùn)練結(jié)果二維可視化如下
使用生成器對(duì)圖像進(jìn)行生成可以得到如下結(jié)果.
由于方均根與交叉熵的區(qū)別在于 解碼器重現(xiàn)誤差上面的區(qū)別,在編碼器部分同樣使用kl散度作為loss,因此兩者的可視化結(jié)果類(lèi)似.
以下幾點(diǎn)需要指出:
1.二維可視化的結(jié)果中各個(gè)類(lèi)別的界限較為明顯,且其分布十分集中方便生成模型的圖像生成.
2.KL散度作為一種新的損失函數(shù)無(wú)法與其他方法的誤差進(jìn)行對(duì)比.
討論
1.自動(dòng)編碼器可能的應(yīng)用有特征提取,圖像分類(lèi),圖像去燥,圖像生成等
2.在特征提取領(lǐng)域和圖像分類(lèi)領(lǐng)域使用SAE有較優(yōu)秀的效果
3.在圖像去噪領(lǐng)域可以使用cae方法,CAE方法對(duì)二維圖片的去燥效果十分優(yōu)秀,但是由于中間部分是比較復(fù)雜的卷機(jī)核結(jié)構(gòu),無(wú)法進(jìn)行有效的可視化
4.VAE方法在圖像生成領(lǐng)域有出色的表現(xiàn),將中間的隱變量約束為正太分布的形式,十分方便的通過(guò)生成器完成圖像生成.
5.在研究角度,VAE方法將概率方法引入神經(jīng)網(wǎng)絡(luò)的計(jì)算體系中,通過(guò)網(wǎng)絡(luò)完成對(duì)概率分布的映射,使用散度的概念構(gòu)造損失函數(shù),對(duì)其他研究有些啟發(fā).
完成代碼
https://github.com/zangzelin/Auto-encoder-AE-SAE-DAE-CAE-DAE-with-keras-in-Mnist-and-report
總結(jié)
以上是生活随笔為你收集整理的详解自动编码器(AE)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何找到Fiori Launchpad
- 下一篇: Cloud for Customer的m