丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開(kāi)發(fā)者 正文
發(fā)私信給AI研習(xí)社
發(fā)送

1

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

本文作者: AI研習(xí)社 編輯:賈智龍 2017-07-18 15:43
導(dǎo)語(yǔ):前言這周工作太忙,本來(lái)想更把 Attention tranlsation 寫(xiě)出來(lái),但一直抽不出時(shí)間,等后面有時(shí)間再來(lái)寫(xiě)。我們這周來(lái)看一個(gè)簡(jiǎn)單的自編碼器實(shí)戰(zhàn)代碼,

雷鋒網(wǎng)按:本文原作者天雨粟,原文載于作者的知乎專欄機(jī)器不學(xué)習(xí)。本文獲得作者授權(quán)轉(zhuǎn)載至雷鋒網(wǎng)。

前言

這周工作太忙,本來(lái)想更把 Attention tranlsation 寫(xiě)出來(lái),但一直抽不出時(shí)間,等后面有時(shí)間再來(lái)寫(xiě)。我們這周來(lái)看一個(gè)簡(jiǎn)單的自編碼器實(shí)戰(zhàn)代碼,關(guān)于自編碼器的理論介紹我就不詳細(xì)介紹了,網(wǎng)上一搜一大把。最簡(jiǎn)單的自編碼器就是通過(guò)一個(gè) encoder 和 decoder 來(lái)對(duì)輸入進(jìn)行復(fù)現(xiàn),例如我們將一個(gè)圖片輸入到一個(gè)網(wǎng)絡(luò)中,自編碼器的 encoder 對(duì)圖片進(jìn)行壓縮,得到壓縮后的信息,進(jìn)而 decoder 再將這個(gè)信息進(jìn)行解碼從而復(fù)現(xiàn)原圖。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

作圖工具:OmniGraffle

自編碼器實(shí)際上是通過(guò)去最小化 target 和 input 的差別來(lái)進(jìn)行優(yōu)化,即讓輸出層盡可能地去復(fù)現(xiàn)原來(lái)的信息。由于自編碼器的基礎(chǔ)形式比較簡(jiǎn)單,對(duì)于它的一些變體也非常之多,包括 DAE,SDAE,VAE 等等,如果感興趣的小伙伴可以去網(wǎng)上搜一下其他相關(guān)信息。

本篇文章將實(shí)現(xiàn)兩個(gè) Demo,第一部分即實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 input-hidden-output 結(jié)的自編碼器,第二部分將在第一部分的基礎(chǔ)上實(shí)現(xiàn)卷積自編碼器來(lái)對(duì)圖片進(jìn)行降噪。

工具說(shuō)明

  • TensorFlow1.0

  • jupyter notebook

  • 數(shù)據(jù):MNIST 手寫(xiě)數(shù)據(jù)集

  • 完整代碼地址:NELSONZHAO/zhihu

第一部分

首先我們將實(shí)現(xiàn)一個(gè)如上圖結(jié)構(gòu)的最簡(jiǎn)單的 AutoEncoder。

加載數(shù)據(jù)

在這里,我們使用 MNIST 手寫(xiě)數(shù)據(jù)集來(lái)進(jìn)行實(shí)驗(yàn)。首先我們需要導(dǎo)入數(shù)據(jù),TensorFlow 已經(jīng)封裝了這個(gè)實(shí)驗(yàn)數(shù)據(jù)集,所以我們使用起來(lái)也非常簡(jiǎn)單。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

如果想讓數(shù)據(jù)顯示灰度圖像,使用代碼 plt.imshow(img.reshape((28,28)), cmap='Greys_r') 即可。

通過(guò) input_data 就可以加載我們的數(shù)據(jù)集。如果小伙伴本地已經(jīng)有了 MNIST 數(shù)據(jù)集(四個(gè)壓縮包),可以把這四個(gè)壓縮包放在目錄 MNIST_data 下,這樣 TensorFlow 就會(huì)直接 Extract 數(shù)據(jù),而不用再重新下載。我們可以通過(guò) imshow 來(lái)隨便查看一個(gè)圖像。由于我們加載進(jìn)來(lái)的數(shù)據(jù)已經(jīng)被處理成一個(gè) 784 維度的向量,因此重新顯示的時(shí)候需要 reshape 一下。

構(gòu)建模型

我們把數(shù)據(jù)加載進(jìn)來(lái)以后就可以進(jìn)行最簡(jiǎn)單的建模。在這之前,我們首先來(lái)獲取一下 input 數(shù)據(jù)的大小,我們加載進(jìn)來(lái)的圖片是 28x28 的像素塊,TensorFlow 已經(jīng)幫我們處理成了 784 維度的向量。同時(shí)我們還需要指定一下 hidden layer 的大小。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

在這里我指定了 64,hidden_units 越小,意味著信息損失的越多,小伙伴們也可以嘗試一下其他的大小來(lái)看看結(jié)果。

AutoEncoder 中包含了 input,hidden 和 output 三層。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

在隱層,我們采用了 ReLU 作為激活函數(shù)。

至此,一個(gè)簡(jiǎn)單的 AutoEncoder 就構(gòu)造完成,接下來(lái)我們可以啟動(dòng) TensorFlow 的 graph 來(lái)進(jìn)行訓(xùn)練。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

訓(xùn)練結(jié)果可視化

經(jīng)過(guò)上面的步驟,我們構(gòu)造了一個(gè)簡(jiǎn)單的 AutoEncoder,下面我們將對(duì)結(jié)果進(jìn)行可視化看一下它的表現(xiàn)。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

這里,我挑選了測(cè)試數(shù)據(jù)集中的 5 個(gè)樣本來(lái)進(jìn)行可視化,同樣的,如果想觀察灰度圖像,指定 cmap 參數(shù)為'Greys_r'即可。上面一行為 test 數(shù)據(jù)集中原始圖片,第二行是經(jīng)過(guò) AutoEncoder 復(fù)現(xiàn)以后的圖片,可以很明顯的看到像素信息的損失。

同樣,我們也可以把隱層壓縮的數(shù)據(jù)拿出來(lái)可視化,結(jié)果如下:

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

這五張圖分別對(duì)應(yīng)了 test 中五張圖片的隱層壓縮后的圖像。

通過(guò)上面一個(gè)簡(jiǎn)單的例子,我們了解了 AutoEncoder 的基本工作原理,下面我們將更進(jìn)一步改進(jìn)我們的模型,將隱層轉(zhuǎn)換為卷積層來(lái)進(jìn)行圖像降噪。

上面過(guò)程中省略了一部分代碼,完整代碼請(qǐng)去我的 GitHub 上查看。

第二部分

在了解了上面 AutoEncoder 工作原理的基礎(chǔ)上,我們?cè)谶@一部分將對(duì) AutoEncoder 加入多個(gè)卷積層來(lái)進(jìn)行圖片的降噪處理。

同樣的我們還是使用 MNIST 數(shù)據(jù)集來(lái)進(jìn)行實(shí)驗(yàn),關(guān)于數(shù)據(jù)導(dǎo)入的步驟不再贅述,請(qǐng)下載代碼查看。在開(kāi)始之前,我們先通過(guò)一張圖片來(lái)看一下我們的整個(gè)模型結(jié)構(gòu):

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

作圖工具:OmniGraffle

我們通過(guò)向模型輸入一個(gè)帶有噪聲的圖片,在輸出端給模型沒(méi)有噪聲的圖片,讓模型通過(guò)卷積自編碼器去學(xué)習(xí)降噪的過(guò)程。

輸入層

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

這里的輸入層和我們上一部分的輸入層已經(jīng)不同,因?yàn)檫@里我們要使用卷積操作,因此,輸入層應(yīng)該是一個(gè) height x width x depth 的一個(gè)圖像,一般的圖像 depth 是 RGB 格式三層,這里我們的 MNIST 數(shù)據(jù)集的 depth 只有 1。

Encoder 卷積層

Encoder 卷積層設(shè)置了三層卷積加池化層,對(duì)圖像進(jìn)行處理。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

第一層卷積中,我們使用了 64 個(gè)大小為 3 x 3 的濾波器(filter),strides 默認(rèn)為 1,padding 設(shè)置為 same 后我們的 height 和 width 不會(huì)被改變,因此經(jīng)過(guò)第一層卷積以后,我們得到的數(shù)據(jù)從最初的 28 x 28 x 1 變?yōu)?28 x 28 x 64。

緊接著對(duì)卷積結(jié)果進(jìn)行最大池化操作(max pooling),這里我設(shè)置了 size 和 stride 都是 2 x 2,池化操作不改變卷積結(jié)果的深度,因此池化以后的大小為 14 x 14 x 64。

對(duì)于其他卷積層不再贅述。所有卷積層的激活函數(shù)都是用了 ReLU。

經(jīng)過(guò)三層的卷積和池化操作以后,我們得到的 conv3 實(shí)際上就相當(dāng)于上一部分中 AutoEncoder 的隱層,這一層的數(shù)據(jù)已經(jīng)被壓縮為 4 x 4 x 32 的大小。

至此,我們就完成了 Encoder 端的卷積操作,數(shù)據(jù)維度從開(kāi)始的 28 x 28 x 1 變成了 4 x 4 x 32。

Decoder 卷積層

接下來(lái)我們就要開(kāi)始進(jìn)行 Decoder 端的卷積。在這之前,可能有小伙伴要問(wèn)了,既然 Encoder 中都已經(jīng)把圖片卷成了 4 x 4 x 32,我們?nèi)绻^續(xù)在 Decoder 進(jìn)行卷積的話,那豈不是得到的數(shù)據(jù) size 越來(lái)越???所以,在 Decoder 端,我們并不是單純進(jìn)行卷積操作,而是使用了 Upsample(中文翻譯可以為上采樣)+ 卷積的組合。

我們知道卷積操作是通過(guò)一個(gè)濾波器對(duì)圖片中的每個(gè) patch 進(jìn)行掃描,進(jìn)而對(duì) patch 中的像素塊加權(quán)求和后再進(jìn)行非線性處理。舉個(gè)例子,原圖中我們的 patch 的大小假如是 3 x 3(說(shuō)的通俗點(diǎn)就是一張圖片中我們?nèi)∑渲幸粋€(gè) 3 x 3 大小的像素塊出來(lái)),接著我們使用 3 x 3 的濾波器對(duì)這個(gè) patch 進(jìn)行處理,那么這個(gè) patch 經(jīng)過(guò)卷積以后就變成了 1 個(gè)像素塊。在 Deconvolution 中(或者叫 transposed convolution)這一過(guò)程是反過(guò)來(lái)的,1 個(gè)像素塊會(huì)被擴(kuò)展成 3 x 3 的像素塊。

但是 Deconvolution 有一些弊端,它會(huì)導(dǎo)致圖片中出現(xiàn) checkerboard patterns,這是因?yàn)樵?Deconvolution 的過(guò)程中,濾波器中會(huì)出現(xiàn)很多重疊。為了解決這個(gè)問(wèn)題,有人提出了使用 Upsample 加卷積層來(lái)進(jìn)行解決。

關(guān)于 Upsample 有兩種常見(jiàn)的方式,一種是 nearest neighbor interpolation,另一種是 bilinear interpolation。

本文也會(huì)使用 Upsample 加卷積的方式來(lái)進(jìn)行 Decoder 端的處理。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

在 TensorFlow 中也封裝了對(duì) Upsample 的操作,我們使用 resize_nearest_neighbor 對(duì) Encoder 卷積的結(jié)果 resize,進(jìn)而再進(jìn)行卷積處理。經(jīng)過(guò)三次 Upsample 的操作,我們得到了 28 x 28 x 64 的數(shù)據(jù)大小。最后,我們要將這個(gè)結(jié)果再進(jìn)行一次卷積,處理成我們?cè)紙D像的大小。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

最后一步定義 loss 和 optimizer。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

loss 函數(shù)我們使用了交叉熵進(jìn)行計(jì)算,優(yōu)化函數(shù)學(xué)習(xí)率為 0.001。

構(gòu)造噪聲數(shù)據(jù)

通過(guò)上面的步驟我們就構(gòu)造完了整個(gè)卷積自編碼器模型。由于我們想通過(guò)這個(gè)模型對(duì)圖片進(jìn)行降噪,因此在訓(xùn)練之前我們還需要在原始數(shù)據(jù)的基礎(chǔ)上構(gòu)造一下我們的噪聲數(shù)據(jù)。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

我們通過(guò)上面一個(gè)簡(jiǎn)單的例子來(lái)看一下如何加入噪聲,我們獲取一張圖片的數(shù)據(jù) img(大小為 784),在它的基礎(chǔ)上加入噪聲因子乘以隨機(jī)數(shù)的結(jié)果,就會(huì)改變圖片上的像素。接著,由于 MNIST 數(shù)據(jù)的每個(gè)像素?cái)?shù)據(jù)都被處理成了 0-1 之間的數(shù),所以我們通過(guò) numpy.clip 對(duì)加入噪聲的圖片進(jìn)行 clip 操作,保證每個(gè)像素?cái)?shù)據(jù)還是在 0-1 之間。

np.random.randn(*img.shape) 的操作等于 np.random.randn(img.shape[0], img.shape[1])

我們下來(lái)來(lái)看一下加入噪聲前后的圖像對(duì)比。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

訓(xùn)練模型

介紹完模型構(gòu)建和噪聲處理,我們接下來(lái)就可以訓(xùn)練我們的模型了。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

在訓(xùn)練模型時(shí),我們的輸入已經(jīng)變成了加入噪聲后的數(shù)據(jù),而輸出是我們的原始沒(méi)有噪聲的數(shù)據(jù),主要要對(duì)原始數(shù)據(jù)進(jìn)行 reshape 操作,變成與 inputs_相同的格式。由于卷積操作的深度,所以模型訓(xùn)練時(shí)候有些慢,建議使用 GPU 跑。

記得最后關(guān)閉 sess。

結(jié)果可視化

經(jīng)過(guò)上面漫長(zhǎng)的訓(xùn)練,我們的模型終于訓(xùn)練好了,接下來(lái)我們就通過(guò)可視化來(lái)看一看模型的效果如何。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

可以看到通過(guò)卷積自編碼器,我們的降噪效果還是非常好的,最終生成的圖片看起來(lái)非常順滑,噪聲也幾乎看不到了。

有些小伙伴可能就會(huì)想,我們也可以用基礎(chǔ)版的 input-hidden-output 結(jié)構(gòu)的 AutoEncoder 來(lái)實(shí)現(xiàn)降噪。因此我也實(shí)現(xiàn)了一版用最簡(jiǎn)單的 input-hidden-output 結(jié)構(gòu)進(jìn)行降噪訓(xùn)練的模型(代碼在我的 GitHub)。我們來(lái)看看它的結(jié)果:

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

可以看出,跟卷積自編碼器相比,它的降噪效果更差一些,在重塑的圖像中還可以看到一些噪聲的影子。

結(jié)尾

至此,我們完成了基礎(chǔ)版本的 AutoEncoder 模型,還在此基礎(chǔ)上加入卷積層來(lái)進(jìn)行圖片降噪。相信小伙伴對(duì) AntoEncoder 也有了一個(gè)初步的認(rèn)識(shí)。

完整的代碼已經(jīng)放在我的 GitHub(NELSONZHAO/zhihu) 上,其中包含了六個(gè)文件:

  • BasicAE,基礎(chǔ)版本的 AutoEncoder(包含 jupyter notebook 和 html 兩個(gè)文件)

  • EasyDAE,基礎(chǔ)版本的降噪 AutoEncoder(包含 jupyter notebook 和 html 兩個(gè)文件)

  • ConvDAE,卷積降噪 AutoEncoder(包含 jupyter notebook 和 html 兩個(gè)文件)

如果覺(jué)得不錯(cuò),可以給我的 GitHub 點(diǎn)個(gè) star 就更好啦!

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。

利用卷積自編碼器對(duì)圖片進(jìn)行降噪

分享:
相關(guān)文章

編輯

聚焦數(shù)據(jù)科學(xué),連接 AI 開(kāi)發(fā)者。更多精彩內(nèi)容,請(qǐng)?jiān)L問(wèn):yanxishe.com
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)