epochs中文翻譯,epochs是什么意思,epochs發(fā)音、用法及例句
1、epochs
epochs發(fā)音
英: 美:
epochs中文意思翻譯
常用釋義:時(shí)代
時(shí)代(epoch的復數形式)
時(shí)期(epoch的復數形式)
epochs雙語(yǔ)使用場(chǎng)景
1、Holocene sediments contain remnants of more recent plants and animals, so it's pretty easy to differentiate geologically between these two Epochs.───全新世的沉積物中含有較新的動(dòng)植物遺跡,因此很容易從地質(zhì)學(xué)上區分這兩個(gè)時(shí)期。
2、The 2. 4 scheduler divided time into epochs, and within each epoch, every task was allowed to execute up to its time slice.───調度器將時(shí)間分割成epoch,每個(gè)epoch中,每個(gè)任務(wù)允許執行到其時(shí)間切片用完。
3、Life would be doomed if the sea freezes completely during the coldest epochs.───如果海洋在最冷的時(shí)期完全結冰,那里的生命注定滅亡。
4、The great epochs of human progress have been identified, more or less directly, with the enlargement of the sources of subsistence .───人們發(fā)現,人類(lèi)進(jìn)步過(guò)程中每一個(gè)重要的新紀元大概多少都與生產(chǎn)資料的擴大有著(zhù)相應一致的關(guān)系。
5、The dissimilarity between two EEG epochs can be qualified via a simple distance measure between the distributions of order patterns.───該方法通過(guò)計算排序模式分布的距離來(lái)分析兩段腦電信號的相異性。
6、Ming Dynasty, which reigned China for 276 years, is described as one of the greatest epochs with orderly governance and social stability in human history.───明朝統治中國276年,被人們描繪成人類(lèi)歷史上治理有序、社會(huì )穩定的最偉大的時(shí)代之一。
7、Following a major shift of epochs, hydrogen began to appear spontaneously near the center of the spatial topology.───隨著(zhù)時(shí)代的大變遷,氫開(kāi)始在靠近拓撲空間的中心自然出現。
8、Vigour, energy , vitality : all the great civilisations -- or civilising epochs -- have had a weight of energy behind them .───活力、生氣、生命力:所有偉大的文明或文明時(shí)期,都有豐沛的活力做后盾。
9、I have spent my life getting to know diverse literatures of different epochs.───我花費一生時(shí)間來(lái)逐漸了解不同時(shí)代形形色色的文學(xué)。
epochs相似詞語(yǔ)短語(yǔ)
1、cenozoic epochs───新生代
2、變分自編碼器(VAE)目前存在哪些問(wèn)題,發(fā)展方向是什么?
代碼詳解:一文讀懂自動(dòng)編碼器的前世今生,希望對你有幫助~
全文共5718字,預計學(xué)習時(shí)長(cháng)20分鐘或更長(cháng)變分自動(dòng)編碼器(VAE)可以說(shuō)是最實(shí)用的自動(dòng)編碼器,但是在討論VAE之前,還必須了解一下用于數據壓縮或去噪的傳統自動(dòng)編碼器。
變分自動(dòng)編碼器的厲害之處
假設你正在開(kāi)發(fā)一款開(kāi)放性世界端游,且游戲里的景觀(guān)設定相當復雜。
你聘用了一個(gè)圖形設計團隊來(lái)制作一些植物和樹(shù)木以裝飾游戲世界,但是將這些裝飾植物放進(jìn)游戲中之后,你發(fā)現它們看起來(lái)很不自然,因為同種植物的外觀(guān)看起來(lái)一模一樣,這時(shí)你該怎么辦呢?
首先,你可能會(huì )建議使用一些參數化來(lái)嘗試隨機地改變圖像,但是多少改變才足夠呢?又需要多大的改變呢?還有一個(gè)重要的問(wèn)題:實(shí)現這種改變的計算強度如何?
這是使用變分自動(dòng)編碼器的理想情況。我們可以訓練一個(gè)神經(jīng)網(wǎng)絡(luò ),使其學(xué)習植物的潛在特征,每當我們將一個(gè)植物放入游戲世界中,就可以從“已學(xué)習”的特征中隨機抽取一個(gè)樣本,生成獨特的植物。事實(shí)上,很多開(kāi)放性世界游戲正在通過(guò)這種方法構建他們的游戲世界設定。
再看一個(gè)更圖形化的例子。假設我們是一個(gè)建筑師,想要為任意形狀的建筑生成平面圖??梢宰屢粋€(gè)自動(dòng)編碼器網(wǎng)絡(luò )基于任意建筑形狀來(lái)學(xué)習數據生成分布,它將從數據生成分布中提取樣本來(lái)生成一個(gè)平面圖。詳見(jiàn)下方的動(dòng)畫(huà)。
對于設計師來(lái)說(shuō),這些技術(shù)的潛力無(wú)疑是最突出的。
再假設我們?yōu)橐粋€(gè)時(shí)裝公司工作,需要設計一種新的服裝風(fēng)格,可以基于“時(shí)尚”的服裝來(lái)訓練自動(dòng)編碼器,使其學(xué)習時(shí)裝的數據生成分布。隨后,從這個(gè)低維潛在分布中提取樣本,并以此來(lái)創(chuàng )造新的風(fēng)格。
在該節中我們將研究fashion MNIST數據集。
自動(dòng)編碼器
傳統自動(dòng)編碼器
自動(dòng)編碼器其實(shí)就是非常簡(jiǎn)單的神經(jīng)結構。它們大體上是一種壓縮形式,類(lèi)似于使用MP3壓縮音頻文件或使用jpeg壓縮圖像文件。
自動(dòng)編碼器與主成分分析(PCA)密切相關(guān)。事實(shí)上,如果自動(dòng)編碼器使用的激活函數在每一層中都是線(xiàn)性的,那么瓶頸處存在的潛在變量(網(wǎng)絡(luò )中最小的層,即代碼)將直接對應(PCA/主成分分析)的主要組件。通常,自動(dòng)編碼器中使用的激活函數是非線(xiàn)性的,典型的激活函數是ReLU(整流線(xiàn)性函數)和sigmoid/S函數。
網(wǎng)絡(luò )背后的數學(xué)原理理解起來(lái)相對容易。從本質(zhì)上看,可以把網(wǎng)絡(luò )分成兩個(gè)部分:編碼器和解碼器。
編碼器函數用?表示,該函數將原始數據X映射到潛在空間F中(潛在空間F位于瓶頸處)。解碼器函數用ψ表示,該函數將瓶頸處的潛在空間F映射到輸出函數。此處的輸出函數與輸入函數相同。因此,我們基本上是在一些概括的非線(xiàn)性壓縮之后重建原始圖像。
編碼網(wǎng)絡(luò )可以用激活函數傳遞的標準神經(jīng)網(wǎng)絡(luò )函數表示,其中z是潛在維度。
相似地,解碼網(wǎng)絡(luò )可以用相同的方式表示,但需要使用不同的權重、偏差和潛在的激活函數。
隨后就可以利用這些網(wǎng)絡(luò )函數來(lái)編寫(xiě)損失函數,我們會(huì )利用這個(gè)損失函數通過(guò)標準的反向傳播程序來(lái)訓練神經(jīng)網(wǎng)絡(luò )。
由于輸入和輸出的是相同的圖像,神經(jīng)網(wǎng)絡(luò )的訓練過(guò)程并不是監督學(xué)習或無(wú)監督學(xué)習,我們通常將這個(gè)過(guò)程稱(chēng)為自我監督學(xué)習。自動(dòng)編碼器的目的是選擇編碼器和解碼器函數,這樣就可以用最少的信息來(lái)編碼圖像,使其可以在另一側重新生成。
如果在瓶頸層中使用的節點(diǎn)太少,重新創(chuàng )建圖像的能力將受到限制,導致重新生成的圖像模糊或者和原圖像差別很大。如果使用的節點(diǎn)太多,那么就沒(méi)必要壓縮了。
壓縮背后的理論其實(shí)很簡(jiǎn)單,例如,每當你在Netflix下載某些內容時(shí),發(fā)送給你的數據都會(huì )被壓縮。一旦這個(gè)內容傳輸到電腦上就會(huì )通解壓算法在電腦屏幕顯示出來(lái)。這類(lèi)似于zip文件的運行方式,只是這里說(shuō)的壓縮是在后臺通過(guò)流處理算法完成的。
去噪自動(dòng)編碼器
有幾種其它類(lèi)型的自動(dòng)編碼器。其中最常用的是去噪自動(dòng)編碼器,本教程稍后會(huì )和Keras一起進(jìn)行分析。這些自動(dòng)編碼器在訓練前給數據添加一些白噪聲,但在訓練時(shí)會(huì )將誤差與原始圖像進(jìn)行比較。這就使得網(wǎng)絡(luò )不會(huì )過(guò)度擬合圖像中出現的任意噪聲。稍后,將使用它來(lái)清除文檔掃描圖像中的折痕和暗黑區域。
稀疏自動(dòng)編碼器
與其字義相反的是,稀疏自動(dòng)編碼器具有比輸入或輸出維度更大的潛在維度。然而,每次網(wǎng)絡(luò )運行時(shí),只有很小一部分神經(jīng)元會(huì )觸發(fā),這意味著(zhù)網(wǎng)絡(luò )本質(zhì)上是“稀疏”的。稀疏自動(dòng)編碼器也是通過(guò)一種規則化的形式來(lái)減少網(wǎng)絡(luò )過(guò)度擬合的傾向,這一點(diǎn)與去噪自動(dòng)編碼器相似。
收縮自動(dòng)編碼器
收縮編碼器與前兩個(gè)自動(dòng)編碼器的運行過(guò)程基本相同,但是在收縮自動(dòng)編碼器中,我們不改變結構,只是在丟失函數中添加一個(gè)正則化器。這可以被看作是嶺回歸的一種神經(jīng)形式。
現在了解了自動(dòng)編碼器是如何運行的,接下來(lái)看看自動(dòng)編碼器的弱項。一些最顯著(zhù)的挑戰包括:
· 潛在空間中的間隙
· 潛在空間中的可分性
· 離散潛在空間
這些問(wèn)題都在以下圖中體現。
MNIST數據集的潛在空間表示
這張圖顯示了潛在空間中不同標記數字的位置??梢钥吹綕撛诳臻g中存在間隙,我們不知道字符在這些空間中是長(cháng)什么樣的。這相當于在監督學(xué)習中缺乏數據,因為網(wǎng)絡(luò )并沒(méi)有針對這些潛在空間的情況進(jìn)行過(guò)訓練。另一個(gè)問(wèn)題就是空間的可分性,上圖中有幾個(gè)數字被很好地分離,但也有一些區域被標簽字符是隨機分布的,這讓我們很難區分字符的獨特特征(在這個(gè)圖中就是數字0-9)。還有一個(gè)問(wèn)題是無(wú)法研究連續的潛在空間。例如,我們沒(méi)有針對任意輸入而訓練的統計模型(即使我們填補了潛在空間中的所有間隙也無(wú)法做到)。
這些傳統自動(dòng)編碼器的問(wèn)題意味著(zhù)我們還要做出更多努力來(lái)學(xué)習數據生成分布并生成新的數據與圖像。
現在已經(jīng)了解了傳統自動(dòng)編碼器是如何運行的,接下來(lái)討論變分自動(dòng)編碼器。變分自動(dòng)編碼器采用了一種從貝葉斯統計中提取的變分推理形式,因此會(huì )比前幾種自動(dòng)編碼器稍微復雜一些。我們會(huì )在下一節中更深入地討論變分自動(dòng)編碼器。
變分自動(dòng)編碼器
變分自動(dòng)編碼器延續了傳統自動(dòng)編碼器的結構,并利用這一結構來(lái)學(xué)習數據生成分布,這讓我們可以從潛在空間中隨機抽取樣本。然后,可以使用解碼器網(wǎng)絡(luò )對這些隨機樣本進(jìn)行解碼,以生成獨特的圖像,這些圖像與網(wǎng)絡(luò )所訓練的圖像具有相似的特征。
對于熟悉貝葉斯統計的人來(lái)說(shuō),編碼器正在學(xué)習后驗分布的近似值。這種分布通常很難分析,因為它沒(méi)有封閉式的解。這意味著(zhù)我們要么執行計算上復雜的采樣程序,如馬爾可夫鏈蒙特卡羅(MCMC)算法,要么采用變分方法。正如你可能猜測的那樣,變分自動(dòng)編碼器使用變分推理來(lái)生成其后驗分布的近似值。
我們將會(huì )用適量的細節來(lái)討論這一過(guò)程,但是如果你想了解更深入的分析,建議你閱覽一下Jaan Altosaar撰寫(xiě)的博客。變分推理是研究生機器學(xué)習課程或統計學(xué)課程的一個(gè)主題,但是了解其基本概念并不需要擁有一個(gè)統計學(xué)學(xué)位。
若對背后的數學(xué)理論不感興趣,也可以選擇跳過(guò)這篇變分自動(dòng)編碼器(VAE)編碼教程。
首先需要理解的是后驗分布以及它無(wú)法被計算的原因。先看看下面的方程式:貝葉斯定理。這里的前提是要知道如何從潛變量“z”生成數據“x”。這意味著(zhù)要搞清p(z|x)。然而,該分布值是未知的,不過(guò)這并不重要,因為貝葉斯定理可以重新表達這個(gè)概率。但是這還沒(méi)有解決所有的問(wèn)題,因為分母(證據)通常很難解。但也不是就此束手無(wú)辭了,還有一個(gè)挺有意思的辦法可以近似這個(gè)后驗分布值。那就是將這個(gè)推理問(wèn)題轉化為一個(gè)優(yōu)化問(wèn)題。
要近似后驗分布值,就必須找出一個(gè)辦法來(lái)評估提議分布與真實(shí)后驗分布相比是否更好。而要這么做,就需要貝葉斯統計員的最佳伙伴:KL散度。KL散度是兩個(gè)概率分布相似度的度量。如果它們相等,那散度為零;而如果散度是正值,就代表這兩個(gè)分布不相等。KL散度的值為非負數,但實(shí)際上它不是一個(gè)距離,因為該函數不具有對稱(chēng)性??梢圆捎孟旅娴姆绞绞褂肒L散度:
這個(gè)方程式看起來(lái)可能有點(diǎn)復雜,但是概念相對簡(jiǎn)單。那就是先猜測可能生成數據的方式,并提出一系列潛在分布Q,然后再找出最佳分布q*,從將提議分布和真實(shí)分布的距離最小化,然后因其難解性將其近似。但這個(gè)公式還是有一個(gè)問(wèn)題,那就是p(z|x)的未知值,所以也無(wú)法計算KL散度。那么,應該怎么解決這個(gè)問(wèn)題呢?
這里就需要一些內行知識了??梢韵冗M(jìn)行一些計算上的修改并針對證據下界(ELBO)和p(x)重寫(xiě)KL散度:
有趣的是ELBO是這個(gè)方程中唯一取決于所選分布的變量。而后者由于不取決于q,則不受所選分布的影響。因此,可以在上述方程中通過(guò)將ELBO(負值)最大化來(lái)使KL散度最小化。這里的重點(diǎn)是ELBO可以被計算,也就是說(shuō)現在可以進(jìn)行一個(gè)優(yōu)化流程。
所以現在要做的就是給Q做一個(gè)好的選擇,再微分ELBO,將其設為零,然后就大功告成了??墒情_(kāi)始的時(shí)候就會(huì )面臨一些障礙,即必須選擇最好的分布系列。
一般來(lái)說(shuō),為了簡(jiǎn)化定義q的過(guò)程,會(huì )進(jìn)行平均場(chǎng)變分推理。每個(gè)變分參數實(shí)質(zhì)上是相互獨立的。因此,每個(gè)數據點(diǎn)都有一個(gè)單獨的q,可被相稱(chēng)以得到一個(gè)聯(lián)合概率,從而獲得一個(gè)“平均場(chǎng)”q。
實(shí)際上,可以選用任意多的場(chǎng)或者集群。比如在MINIST數據集中,可以選擇10個(gè)集群,因為可能有10個(gè)數字存在。
要做的第二件事通常被稱(chēng)為再參數化技巧,通過(guò)把隨機變量帶離導數完成,因為從隨機變量求導數的話(huà)會(huì )由于它的內在隨機性而產(chǎn)生較大的誤差。
再參數化技巧較為深奧,但簡(jiǎn)單來(lái)說(shuō)就是可以將一個(gè)正態(tài)分布寫(xiě)成均值加標準差,再乘以誤差。這樣在微分時(shí),我們不是從隨機變量本身求導數,而是從它的參數求得。
這個(gè)程序沒(méi)有一個(gè)通用的閉型解,所以近似后驗分布的能力仍然受到一定限制。然而,指數分布族確實(shí)有一個(gè)閉型解。這意味著(zhù)標準分布,如正態(tài)分布、二項分布、泊松分布、貝塔分布等。所以,就算真正的后驗分布值無(wú)法被查出,依然可以利用指數分布族得出最接近的近似值。
變分推理的奧秘在于選擇分布區Q,使其足夠大以求得后驗分布的近似值,但又不需要很長(cháng)時(shí)間來(lái)計算。
既然已經(jīng)大致了解如何訓練網(wǎng)絡(luò )學(xué)習數據的潛在分布,那么現在可以探討如何使用這個(gè)分布生成數據。
數據生成過(guò)程
觀(guān)察下圖,可以看出對數據生成過(guò)程的近似認為應生成數字‘2’,所以它從潛在變量質(zhì)心生成數值2。但是也許不希望每次都生成一摸一樣的數字‘2’,就好像上述端游例子所提的植物,所以我們根據一個(gè)隨機數和“已學(xué)”的數值‘2’分布范圍,在潛在空間給這一過(guò)程添加了一些隨機噪聲。該過(guò)程通過(guò)解碼器網(wǎng)絡(luò )后,我們得到了一個(gè)和原型看起來(lái)不一樣的‘2’。
這是一個(gè)非常簡(jiǎn)化的例子,抽象描述了實(shí)際自動(dòng)編碼器網(wǎng)絡(luò )的體系結構。下圖表示了一個(gè)真實(shí)變分自動(dòng)編碼器在其編碼器和解碼器網(wǎng)絡(luò )使用卷積層的結構體系。從這里可以觀(guān)察到,我們正在分別學(xué)習潛在空間中生成數據分布的中心和范圍,然后從這些分布“抽樣”生成本質(zhì)上“虛假”的數據。
該學(xué)習過(guò)程的固有性代表所有看起來(lái)很相似的參數(刺激相同的網(wǎng)絡(luò )神經(jīng)元放電)都聚集到潛在空間中,而不是隨意的分散。如下圖所示,可以看到數值2都聚集在一起,而數值3都逐漸地被推開(kāi)。這一過(guò)程很有幫助,因為這代表網(wǎng)絡(luò )并不會(huì )在潛在空間隨意擺放字符,從而使數值之間的轉換更有真實(shí)性。
整個(gè)網(wǎng)絡(luò )體系結構的概述如下圖所示。希望讀者看到這里,可以比較清晰地理解整個(gè)過(guò)程。我們使用一組圖像訓練自動(dòng)編碼器,讓它學(xué)習潛在空間里均值和標準值的差,從而形成我們的數據生成分布。接下來(lái),當我們要生成一個(gè)類(lèi)似的圖像,就從潛在空間的一個(gè)質(zhì)心取樣,利用標準差和一些隨機誤差對它進(jìn)行輕微的改變,然后使其通過(guò)解碼器網(wǎng)絡(luò )。從這個(gè)例子可以明顯看出,最終的輸出看起來(lái)與輸入圖像相似,但卻是不一樣的。
變分自動(dòng)編碼器編碼指南
本節將討論一個(gè)簡(jiǎn)單的去噪自動(dòng)編碼器,用于去除文檔掃描圖像上的折痕和污痕,以及去除Fashion MNIST數據集中的噪聲。然后,在MNIST數據集訓練網(wǎng)絡(luò )后,就使用變分自動(dòng)編碼器生成新的服裝。
去噪自編碼器
Fashion MNIST
在第一個(gè)練習中,在Fashion MNIST數據集添加一些隨機噪聲(椒鹽噪聲),然后使用去噪自編碼器嘗試移除噪聲。首先進(jìn)行預處理:下載數據,調整數據大小,然后添加噪聲。
## Download the data(x_train, y_train), (x_test, y_test) = datasets.fashion_mnist.load_data()
## normalize and reshape
x_train = x_train/255.
x_test = x_test/255.
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)
# Lets add sample noise - Salt and Pepper
noise = augmenters.SaltAndPepper(0.1)
seq_object = augmenters.Sequential([noise])
train_x_n = seq_object.augment_images(x_train * 255) / 255
val_x_n = seq_object.augment_images(x_test * 255) / 255
接著(zhù),給自編碼器網(wǎng)絡(luò )創(chuàng )建結構。這包括多層卷積神經(jīng)網(wǎng)絡(luò )、編碼器網(wǎng)絡(luò )的最大池化層和解碼器網(wǎng)絡(luò )上的升級層。
# input layerinput_layer =Input(shape=(28, 28, 1))
# encodingarchitecture
encoded_layer1= Conv2D(64, (3, 3), activation='relu', padding='same')(input_layer)
encoded_layer1= MaxPool2D( (2, 2), padding='same')(encoded_layer1)
encoded_layer2= Conv2D(32, (3, 3), activation='relu', padding='same')(encoded_layer1)
encoded_layer2= MaxPool2D( (2, 2), padding='same')(encoded_layer2)
encoded_layer3= Conv2D(16, (3, 3), activation='relu', padding='same')(encoded_layer2)
latent_view = MaxPool2D( (2, 2),padding='same')(encoded_layer3)
# decodingarchitecture
decoded_layer1= Conv2D(16, (3, 3), activation='relu', padding='same')(latent_view)
decoded_layer1= UpSampling2D((2, 2))(decoded_layer1)
decoded_layer2= Conv2D(32, (3, 3), activation='relu', padding='same')(decoded_layer1)
decoded_layer2= UpSampling2D((2, 2))(decoded_layer2)
decoded_layer3= Conv2D(64, (3, 3), activation='relu')(decoded_layer2)
decoded_layer3= UpSampling2D((2, 2))(decoded_layer3)
output_layer = Conv2D(1, (3, 3), padding='same',activation='sigmoid')(decoded_layer3)
# compile themodel
model =Model(input_layer, output_layer)
model.compile(optimizer='adam',loss='mse')
# run themodel
early_stopping= EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=5,mode='auto')
history =model.fit(train_x_n, x_train, epochs=20, batch_size=2048,validation_data=(val_x_n, x_test), callbacks=[early_stopping])
所輸入的圖像,添加噪聲的圖像,和輸出圖像。
從時(shí)尚MNIST輸入的圖像。
添加椒鹽噪聲的輸入圖像。
從去噪網(wǎng)絡(luò )輸出的圖像。
從這里可以看到,我們成功從噪聲圖像去除相當的噪聲,但同時(shí)也失去了一定量的服裝細節的分辨率。這是使用穩健網(wǎng)絡(luò )所需付出的代價(jià)之一??梢詫υ摼W(wǎng)絡(luò )進(jìn)行調優(yōu),使最終的輸出更能代表所輸入的圖像。
文本清理
去噪自編碼器的第二個(gè)例子包括清理掃描圖像的折痕和暗黑區域。這是最終獲得的輸入和輸出圖像。
輸入的有噪聲文本數據圖像。
經(jīng)清理的文本圖像。
為此進(jìn)行的數據預處理稍微復雜一些,因此就不在這里進(jìn)行介紹,預處理過(guò)程和相關(guān)數據可在GitHub庫里獲取。網(wǎng)絡(luò )結構如下:
input_layer= Input(shape=(258, 540, 1))
#encoder
encoder= Conv2D(64, (3, 3), activation='relu', padding='same')(input_layer)
encoder= MaxPooling2D((2, 2), padding='same')(encoder)
#decoder
decoder= Conv2D(64, (3, 3), activation='relu', padding='same')(encoder)
decoder= UpSampling2D((2, 2))(decoder)
output_layer= Conv2D(1, (3, 3), activation='sigmoid', padding='same')(decoder)
ae =Model(input_layer, output_layer)
ae.compile(loss='mse',optimizer=Adam(lr=0.001))
batch_size= 16
epochs= 200
early_stopping= EarlyStopping(monitor='val_loss',min_delta=0,patience=5,verbose=1,mode='auto')
history= ae.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,validation_data=(x_val, y_val), callbacks=[early_stopping])
變分自編碼器
最后的壓軸戲,是嘗試從FashionMNIST數據集現有的服裝中生成新圖像。
其中的神經(jīng)結構較為復雜,包含了一個(gè)稱(chēng)‘Lambda’層的采樣層。
batch_size = 16latent_dim = 2 # Number of latent dimension parameters
# ENCODER ARCHITECTURE: Input -> Conv2D*4 -> Flatten -> Dense
input_img = Input(shape=(28, 28, 1))
x = Conv2D(32, 3,
padding='same',
activation='relu')(input_img)
x = Conv2D(64, 3,
padding='same',
activation='relu',
strides=(2, 2))(x)
x = Conv2D(64, 3,
padding='same',
activation='relu')(x)
x = Conv2D(64, 3,
padding='same',
activation='relu')(x)
# need to know the shape of the network here for the decoder
shape_before_flattening = K.int_shape(x)
x = Flatten()(x)
x = Dense(32, activation='relu')(x)
# Two outputs, latent mean and (log)variance
z_mu = Dense(latent_dim)(x)
z_log_sigma = Dense(latent_dim)(x)
## SAMPLING FUNCTION
def sampling(args):
z_mu, z_log_sigma = args epsilon = K.random_normal(shape=(K.shape(z_mu)[0], latent_dim),
mean=0., stddev=1.)
return z_mu + K.exp(z_log_sigma) * epsilon
# sample vector from the latent distribution
z = Lambda(sampling)([z_mu, z_log_sigma])
## DECODER ARCHITECTURE
# decoder takes the latent distribution sample as input
decoder_input = Input(K.int_shape(z)[1:])
# Expand to 784 total pixels
x = Dense(np.prod(shape_before_flattening[1:]),
activation='relu')(decoder_input)
# reshape
x = Reshape(shape_before_flattening[1:])(x)
# use Conv2DTranspose to reverse the conv layers from the encoder
x = Conv2DTranspose(32, 3,
padding='same',
activation='relu',
strides=(2, 2))(x)
x = Conv2D(1, 3,
padding='same',
activation='sigmoid')(x)
# decoder model statement
decoder = Model(decoder_input, x)
# apply the decoder to the sample from the latent distribution
z_decoded = decoder(z)
這就是體系結構,但還是需要插入損失函數再合并KL散度。
# construct a custom layer to calculate the loss
class CustomVariationalLayer(Layer):
def vae_loss(self, x, z_decoded):
x = K.flatten(x)
z_decoded = K.flatten(z_decoded)
# Reconstruction loss
xent_loss = binary_crossentropy(x, z_decoded)
# KL divergence
kl_loss = -5e-4 * K.mean(1 + z_log_sigma - K.square(z_mu) - K.exp(z_log_sigma), axis=-1)
return K.mean(xent_loss + kl_loss)
# adds the custom loss to the class
def call(self, inputs):
x = inputs[0]
z_decoded = inputs[1]
loss = self.vae_loss(x, z_decoded)
self.add_loss(loss, inputs=inputs)
return x
# apply the custom loss to the input images and the decoded latent distribution sample
y = CustomVariationalLayer()([input_img, z_decoded])
# VAE model statement
vae = Model(input_img, y)
vae.compile(optimizer='rmsprop', loss=None)
vae.fit(x=train_x, y=None,
shuffle=True,
epochs=20,
batch_size=batch_size,
validation_data=(val_x, None))
現在,可以查看重構的樣本,看看網(wǎng)絡(luò )能夠學(xué)習到什么。
從這里可以清楚看到鞋子、手袋和服裝之間的過(guò)渡。在此并沒(méi)有標出所有使畫(huà)面更清晰的潛在空間。也可以觀(guān)察到Fashion MNIST數據集現有的10件服裝的潛在空間和顏色代碼。
可看出這些服飾分成了不同的集群。
留言 點(diǎn)贊 關(guān)注
我們一起分享AI學(xué)習與發(fā)展的干貨
歡迎關(guān)注全平臺AI垂類(lèi)自媒體 “讀芯術(shù)”
版權聲明: 本站僅提供信息存儲空間服務(wù),旨在傳遞更多信息,不擁有所有權,不承擔相關(guān)法律責任,不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責。如因作品內容、版權和其它問(wèn)題需要同本網(wǎng)聯(lián)系的,請發(fā)送郵件至 舉報,一經(jīng)查實(shí),本站將立刻刪除。