一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

深度學(xué)習(xí)第51講:自編碼器(AutoEncoder)及其keras實(shí)現(xiàn)

 LibraryPKU 2019-03-29

     從本講開(kāi)始,筆者將花一些時(shí)間和大家一起學(xué)習(xí)深度學(xué)習(xí)中的無(wú)監(jiān)督模型。從現(xiàn)有情況來(lái)看,無(wú)監(jiān)督學(xué)習(xí)很有可能是一把決定深度學(xué)習(xí)未來(lái)發(fā)展方向的鑰匙,在缺乏高質(zhì)量打標(biāo)數(shù)據(jù)的監(jiān)督機(jī)器學(xué)習(xí)時(shí)代,若是能在無(wú)監(jiān)督學(xué)習(xí)方向上有所突破對(duì)于未來(lái)深度學(xué)習(xí)的發(fā)展意義重大。從自編碼器到生成對(duì)抗網(wǎng)絡(luò),筆者將和大家一起來(lái)探索深度學(xué)習(xí)中的無(wú)監(jiān)督學(xué)習(xí)。

自編碼器

     所謂自編碼器(Autoencoder,AE),就是一種利用反向傳播算法使得輸出值等于輸入值的神經(jīng)網(wǎng)絡(luò),它現(xiàn)將輸入壓縮成潛在空間表征,然后將這種表征重構(gòu)為輸出。所以,從本質(zhì)上來(lái)講,自編碼器是一種數(shù)據(jù)壓縮算法,其壓縮和解壓縮算法都是通過(guò)神經(jīng)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)的。自編碼器有如下三個(gè)特點(diǎn):

  • 數(shù)據(jù)相關(guān)性。就是指自編碼器只能壓縮與自己此前訓(xùn)練數(shù)據(jù)類(lèi)似的數(shù)據(jù),比如說(shuō)我們使用mnist訓(xùn)練出來(lái)的自編碼器用來(lái)壓縮人臉圖片,效果肯定會(huì)很差。

  • 數(shù)據(jù)有損性。自編碼器在解壓時(shí)得到的輸出與原始輸入相比會(huì)有信息損失,所以自編碼器是一種數(shù)據(jù)有損的壓縮算法。

  • 自動(dòng)學(xué)習(xí)性。自動(dòng)編碼器是從數(shù)據(jù)樣本中自動(dòng)學(xué)習(xí)的,這意味著很容易對(duì)指定類(lèi)的輸入訓(xùn)練出一種特定的編碼器,而不需要完成任何新工作。

     構(gòu)建一個(gè)自編碼器需要兩部分:編碼器(Encoder)和解碼器(Decoder)。編碼器將輸入壓縮為潛在空間表征,可以用函數(shù)f(x)來(lái)表示,解碼器將潛在空間表征重構(gòu)為輸出,可以用函數(shù)g(x)來(lái)表示,編碼函數(shù)f(x)和解碼函數(shù)g(x)都是神經(jīng)網(wǎng)絡(luò)模型。

     所以,我們大致搞清楚了自編碼器是一種讓輸入等于輸出的算法。但僅僅如此嗎?當(dāng)然不是,如果一個(gè)算法只是為了讓輸入等于輸出,那這個(gè)算法意義肯定不大,自編碼器的核心價(jià)值在于經(jīng)編碼器壓縮后的潛在空間表征。上面我們提到自編碼器是一種數(shù)據(jù)有損的壓縮算法,經(jīng)過(guò)這種有損的數(shù)據(jù)壓縮,我們可以學(xué)習(xí)到輸入數(shù)據(jù)種最重要的特征。

     雖然自編碼器對(duì)于我們是個(gè)新概念,但是其內(nèi)容本身非常簡(jiǎn)單。在后面的keras實(shí)現(xiàn)中大家可以看到如何用幾行代碼搭建和訓(xùn)練一個(gè)自編碼器。那么重要的問(wèn)題來(lái)了,自編碼器這樣的自我學(xué)習(xí)模型到底有什么用呢?這個(gè)問(wèn)題的答案關(guān)乎無(wú)監(jiān)督學(xué)習(xí)在深度學(xué)習(xí)領(lǐng)域的價(jià)值,所以還是非常有必要說(shuō)一下的。自編碼器吸引了一大批研究和關(guān)注的主要原因之一是很長(zhǎng)時(shí)間一段以來(lái)它被認(rèn)為是解決無(wú)監(jiān)督學(xué)習(xí)的可能方案,即大家覺(jué)得自編碼器可以在沒(méi)有標(biāo)簽的時(shí)候?qū)W習(xí)到數(shù)據(jù)的有用表達(dá)。但就具體應(yīng)用層面上而言,自編碼器通常有兩個(gè)方面的應(yīng)用:一是數(shù)據(jù)去噪,二是為進(jìn)行可視化而降維。自編碼器在適當(dāng)?shù)木S度和系數(shù)約束下可以學(xué)習(xí)到比PCA等技術(shù)更有意義的數(shù)據(jù)映射。

自編碼器的keras實(shí)現(xiàn)

     原始的自編碼器實(shí)現(xiàn)起來(lái)非常容易,我們來(lái)看一下如何使用keras來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)易的自編碼器。使用全連接網(wǎng)絡(luò)作為編碼和解碼器:

from keras.layers import Input, Dense
from keras.models import Model
import warningswarnings.filterwarnings('ignore')
# 編碼潛在空間表征維度
encoding_dim = 32  
# 自編碼器輸入
input_img = Input(shape=(784,))
# 使用一個(gè)全連接網(wǎng)絡(luò)來(lái)搭建編碼器
encoded = Dense(encoding_dim, activation='relu')(input_img)
# 使用一個(gè)全連接網(wǎng)絡(luò)來(lái)對(duì)編碼器進(jìn)行解碼
decoded = Dense(784, activation='sigmoid')(encoded)
# 構(gòu)建keras模型
autoencoder = Model(input=input_img, output=decoded)

     模型概要如下:

     我們也可以把編碼器和解碼器當(dāng)作單獨(dú)的模型來(lái)使用:

# 編碼器模型
encoder = Model(input=input_img, output=encoded)
# 解碼器模型
encoded_input = Input(shape=(encoding_dim,))decoder_layer = autoencoder.layers[-1]decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))

對(duì)自編碼器模型進(jìn)行編譯并使用mnist數(shù)據(jù)進(jìn)行訓(xùn)練:

# 編譯模型
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
# 準(zhǔn)備mnist數(shù)據(jù)
from keras.datasets import mnist
import numpy as np(x_train, _), (x_test, _) = mnist.load_data()x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
# 訓(xùn)練
autoencoder.fit(x_train, x_train,                nb_epoch=50,                batch_size=256,                shuffle=True,                validation_data=(x_test, x_test))

     50輪訓(xùn)練之后的損失降低到0.1:

     對(duì)原始輸入圖像和自編碼器訓(xùn)練后的圖像進(jìn)行可視化的直觀展示,看看自編碼器學(xué)習(xí)效果如何:

import matplotlib.pyplot as pltencoded_imgs = encoder.predict(x_test)decoded_imgs = decoder.predict(encoded_imgs)n = 10  
plt.figure(figsize=(20, 4))
for i in range(1, n):    
# 展示原始圖像    ax = plt.subplot(2, n, i)    plt.imshow(x_test[i].reshape(28, 28))    plt.gray()    ax.get_xaxis().set_visible(False)    ax.get_yaxis().set_visible(False)    
   # 展示自編碼器重構(gòu)后的圖像    ax = plt.subplot(2, n, i + n)    plt.imshow(decoded_imgs[i].reshape(28, 28))    plt.gray()    ax.get_xaxis().set_visible(False)    ax.get_yaxis().set_visible(False)plt.show()

     效果如下,可見(jiàn)基于全連接網(wǎng)絡(luò)的自編碼器在mnist數(shù)據(jù)集上表現(xiàn)還不錯(cuò)。

自編碼器的降噪作用

     前面我們講到自編碼器的一個(gè)重要作用就是給數(shù)據(jù)進(jìn)行降噪處理。同樣是mnist數(shù)據(jù)集,我們給原始數(shù)據(jù)添加一些噪聲看看:

from keras.datasets import mnist
import numpy as np(x_train, _), (x_test, _) = mnist.load_data()x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 1, 28, 28))x_test = np.reshape(x_test, (len(x_test), 1, 28, 28))
# 給數(shù)據(jù)添加噪聲
noise_factor = 0.5
x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) x_train_noisy = np.clip(x_train_noisy, 0., 1.)x_test_noisy = np.clip(x_test_noisy, 0., 1.)

     展示添加了噪聲后的mnist數(shù)據(jù)示例:

# 噪聲數(shù)據(jù)展示
n = 10  
plt.figure(figsize=(20, 4))
for i in range(1, n):    ax = plt.subplot(2, n, i)    plt.imshow(x_train_noisy[i].reshape(28, 28))    plt.gray()    ax.get_xaxis().set_visible(False)    ax.get_yaxis().set_visible(False)plt.show()

     下面我們想要自編碼器模型對(duì)上述經(jīng)過(guò)噪聲處理后的數(shù)據(jù)進(jìn)行降噪和還原,我們使用卷積神經(jīng)網(wǎng)絡(luò)作為編碼和解碼模型:

from keras.layers import Input, Dense, UpSampling2D
from keras.layers import Convolution2D, MaxPooling2D
from keras.models import Model
# 輸入維度
input_img = Input(shape=(1, 28, 28))
# 基于卷積和池化的編碼器
x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(input_img)x = MaxPooling2D((2, 2), border_mode='same')(x)x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(x)encoded = MaxPooling2D((2, 2), border_mode='same')(x)
# 基于卷積核上采樣的解碼器
x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(encoded)x = UpSampling2D((2, 2))(x)x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(x)x = UpSampling2D((2, 2))(x)decoded = Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same')(x)
# 搭建模型并編譯
autoencoder = Model(input_img, decoded)autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

對(duì)噪聲數(shù)據(jù)進(jìn)行自編碼器的訓(xùn)練:

# 對(duì)噪聲數(shù)據(jù)進(jìn)行自編碼訓(xùn)練
autoencoder.fit(x_train_noisy, x_train,                nb_epoch=100,                batch_size=128,                shuffle=True,                validation_data=(x_test_noisy, x_test))

     經(jīng)過(guò)卷積自編碼器訓(xùn)練之后的噪聲圖像還原效果如下:

     添加的噪聲基本被消除了,可見(jiàn)自編碼器確實(shí)是一種較好的數(shù)據(jù)降噪算法。本講的筆記就到這里,后面筆者將繼續(xù)深入分享關(guān)于變分自編碼器(VAE)的相關(guān)內(nèi)容。

參考資料:

https://blog./building-autoencoders-in-keras.html

深度學(xué)習(xí)  Ian GoodFellow

https://zhuanlan.zhihu.com/p/34238979

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    日韩精品视频香蕉视频| 夜色福利久久精品福利| 性欧美唯美尤物另类视频| 中文字幕亚洲视频一区二区| 夫妻性生活黄色录像视频| 亚洲国产精品一区二区| 国产成人精品综合久久久看| 人妻久久这里只有精品| 亚洲欧美日韩色图七区| 国产精品久久男人的天堂| 久久午夜福利精品日韩| 老司机精品一区二区三区| 91精品视频全国免费| 欧美日韩少妇精品专区性色| 99久久国产精品免费| 日韩欧美一区二区不卡视频| 国产欧美日韩精品一区二| 99久久国产综合精品二区| 老司机精品视频免费入口| 美女黄片大全在线观看| 久久99亚洲小姐精品综合| 伊人天堂午夜精品草草网| 麻豆果冻传媒一二三区| 欧美日韩国产精品第五页| 日韩成人午夜福利免费视频| 伊人天堂午夜精品草草网| 色婷婷丁香激情五月天| 日韩精品免费一区二区三区| 果冻传媒精选麻豆白晶晶| 日韩一区二区三区观看| 深夜福利欲求不满的人妻| 不卡视频在线一区二区三区| 日韩精品一区二区三区射精| 97人妻精品免费一区二区| 国产不卡在线免费观看视频| 超碰在线免费公开中国黄片| 国产目拍亚洲精品区一区| 视频一区二区 国产精品| 色婷婷中文字幕在线视频| 亚洲最大的中文字幕在线视频| 不卡中文字幕在线视频|