国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深度學習自動編碼器還能用于數據生成?這篇文章告訴你答案

移動開發
什么是自動編碼器?自動編碼器(AutoEncoder)最開始作為一種數據的壓縮方法。

什么是自動編碼器

自動編碼器(AutoEncoder)最開始作為一種數據的壓縮方法,其特點有:

  • 跟數據相關程度很高,這意味著自動編碼器只能壓縮與訓練數據相似的數據,這個其實比較顯然,因為使用神經網絡提取的特征一般是高度相關于原始的訓練集,使用人臉訓練出來的自動編碼器在壓縮自然界動物的圖片是表現就會比較差,因為它只學習到了人臉的特征,而沒有能夠學習到自然界圖片的特征;

  • 壓縮后數據是有損的,這是因為在降維的過程中不可避免的要丟失掉信息;

到了2012年,人們發現在卷積網絡中使用自動編碼器做逐層預訓練可以訓練更加深層的網絡,但是很快人們發現良好的初始化策略要比費勁的逐層預訓練有效地多,2014年出現的Batch Normalization技術也是的更深的網絡能夠被被有效訓練,到了15年底,通過殘差(ResNet)我們基本可以訓練任意深度的神經網絡。

所以現在自動編碼器主要應用有兩個方面,第一是數據去噪,第二是進行可視化降維。然而自動編碼器還有著一個功能就是生成數據。

我們之前講過GAN,它與GAN相比有著一些好處,同時也有著一些缺點。我們先來講講其跟GAN相比有著哪些優點。

第一點,我們使用GAN來生成圖片有個很不好的缺點就是我們生成圖片使用的隨機高斯噪聲,這意味著我們并不能生成任意我們指定類型的圖片,也就是說我們沒辦法決定使用哪種隨機噪聲能夠產生我們想要的圖片,除非我們能夠把初始分布全部試一遍。但是使用自動編碼器我們就能夠通過輸出圖片的編碼過程得到這種類型圖片的編碼之后的分布,相當于我們是知道每種圖片對應的噪聲分布,我們就能夠通過選擇特定的噪聲來生成我們想要生成的圖片。

第二點,這既是生成網絡的優點同時又有著一定的局限性,這就是生成網絡通過對抗過程來區分“真”的圖片和“假”的圖片,然而這樣得到的圖片只是盡可能像真的,但是這并不能保證圖片的內容是我們想要的,換句話說,有可能生成網絡盡可能的去生成一些背景圖案使得其盡可能真,但是里面沒有實際的物體。

自動編碼器的結構

首先我們給出自動編碼器的一般結構

深度學習自動編碼器還能用于數據生成?這篇文章告訴你答案

從上面的圖中,我們能夠看到兩個部分,第一個部分是編碼器(Encoder),第二個部分是解碼器(Decoder),編碼器和解碼器都可以是任意的模型,通常我們使用神經網絡模型作為編碼器和解碼器。輸入的數據經過神經網絡降維到一個編碼(code),接著又通過另外一個神經網絡去解碼得到一個與輸入原數據一模一樣的生成數據,然后通過去比較這兩個數據,最小化他們之間的差異來訓練這個網絡中編碼器和解碼器的參數。當這個過程訓練完之后,我們可以拿出這個解碼器,隨機傳入一個編碼(code),希望通過解碼器能夠生成一個和原數據差不多的數據,上面這種圖這個例子就是希望能夠生成一張差不多的圖片。

 

這件事情能不能實現呢?其實是可以的,下面我們會用PyTorch來簡單的實現一個自動編碼器。

首先我們構建一個簡單的多層感知器來實現一下。

  1. class autoencoder(nn.Module): 
  2.     def __init__(self): 
  3.         super(autoencoder, self).__init__() 
  4.         self.encoder = nn.Sequential( 
  5.             nn.Linear(28*28128), 
  6.             nn.ReLU(True), 
  7.             nn.Linear(12864), 
  8.             nn.ReLU(True), 
  9.             nn.Linear(6412), 
  10.             nn.ReLU(True), 
  11.             nn.Linear(123
  12.         ) 
  13.         self.decoder = nn.Sequential( 
  14.             nn.Linear(312), 
  15.             nn.ReLU(True), 
  16.             nn.Linear(1264), 
  17.             nn.ReLU(True), 
  18.             nn.Linear(64128), 
  19.             nn.ReLU(True), 
  20.             nn.Linear(12828*28), 
  21.             nn.Tanh() 
  22.         ) 
  23.  
  24.     def forward(self, x): 
  25.         x = self.encoder(x) 
  26.         x = self.decoder(x) 
  27.         return x 

這里我們定義了一個簡單的4層網絡作為編碼器,中間使用ReLU激活函數,最后輸出的維度是3維的,定義的解碼器,輸入三維的編碼,輸出一個28x28的圖像數據,特別要注意最后使用的激活函數是Tanh,這個激活函數能夠將最后的輸出轉換到-1 ~1之間,這是因為我們輸入的圖片已經變換到了-1~1之間了,這里的輸出必須和其對應。

訓練過程也比較簡單,我們使用最小均方誤差來作為損失函數,比較生成的圖片與原始圖片的每個像素點的差異。

同時我們也可以將多層感知器換成卷積神經網絡,這樣對圖片的特征提取有著更好的效果。

  1. class autoencoder(nn.Module): 
  2.     def __init__(self): 
  3.         super(autoencoder, self).__init__() 
  4.         self.encoder = nn.Sequential( 
  5.             nn.Conv2d(1163, stride=3, padding=1),  # b, 16, 10, 10 
  6.             nn.ReLU(True), 
  7.             nn.MaxPool2d(2, stride=2),  # b, 16, 5, 5 
  8.             nn.Conv2d(1683, stride=2, padding=1),  # b, 8, 3, 3 
  9.             nn.ReLU(True), 
  10.             nn.MaxPool2d(2, stride=1)  # b, 8, 2, 2 
  11.         ) 
  12.         self.decoder = nn.Sequential( 
  13.             nn.ConvTranspose2d(8163, stride=2),  # b, 16, 5, 5 
  14.             nn.ReLU(True), 
  15.             nn.ConvTranspose2d(1685, stride=3, padding=1),  # b, 8, 15, 15 
  16.             nn.ReLU(True), 
  17.             nn.ConvTranspose2d(812, stride=2, padding=1),  # b, 1, 28, 28 
  18.             nn.Tanh() 
  19.         ) 
  20.  
  21.     def forward(self, x): 
  22.         x = self.encoder(x) 
  23.         x = self.decoder(x) 
  24.         return x 

這里使用了 nn.ConvTranspose2d(),這可以看作是卷積的反操作,可以在某種意義上看作是反卷積。

我們使用卷積網絡得到的最后生成的圖片效果會更好,具體的圖片效果我就不再這里放了,可以在我們的github上看到圖片的展示。github 地址:

http://t.cn/RK5gxpM

變分自動編碼器(Variational Auto Encoder)

變分編碼器是自動編碼器的升級版本,其結構跟自動編碼器是類似的,也由編碼器和解碼器構成。

回憶一下我們在自動編碼器中所做的事,我們需要輸入一張圖片,然后將一張圖片編碼之后得到一個隱含向量,這比我們隨機取一個隨機噪聲更好,因為這包含著原圖片的信息,然后我們隱含向量解碼得到與原圖片對應的照片。

但是這樣我們其實并不能任意生成圖片,因為我們沒有辦法自己去構造隱藏向量,我們需要通過一張圖片輸入編碼我們才知道得到的隱含向量是什么,這時我們就可以通過變分自動編碼器來解決這個問題。

其實原理特別簡單,只需要在編碼過程給它增加一些限制,迫使其生成的隱含向量能夠粗略的遵循一個標準正態分布,這就是其與一般的自動編碼器最大的不同。

這樣我們生成一張新圖片就很簡單了,我們只需要給它一個標準正態分布的隨機隱含向量,這樣通過解碼器就能夠生成我們想要的圖片,而不需要給它一張原始圖片先編碼。

在實際情況中,我們需要在模型的準確率上與隱含向量服從標準正態分布之間做一個權衡,所謂模型的準確率就是指解碼器生成的圖片與原圖片的相似程度。我們可以讓網絡自己來做這個決定,非常簡單,我們只需要將這兩者都做一個loss,然后在將他們求和作為總的loss,這樣網絡就能夠自己選擇如何才能夠使得這個總的loss下降。另外我們要衡量兩種分布的相似程度,如何看過之前一片GAN的數學推導,你就知道會有一個東西叫KL divergence來衡量兩種分布的相似程度,這里我們就是用KL divergence來表示隱含向量與標準正態分布之間差異的loss,另外一個loss仍然使用生成圖片與原圖片的均方誤差來表示。

我們可以給出KL divergence 的公式

 

這里變分編碼器使用了一個技巧“重新參數化”來解決 KL divergence 的計算問題。

 

這時不再是每次產生一個隱含向量,而是生成兩個向量,一個表示均值,一個表示標準差,然后通過這兩個統計量來合成隱含向量,這也非常簡單,用一個標準正態分布先乘上標準差再加上均值就行了,這里我們默認編碼之后的隱含向量是服從一個正態分布的。這個時候我們是想讓均值盡可能接近0,標準差盡可能接近1。而論文里面有詳細的推導如何得到這個loss的計算公式,有興趣的同學可以去看看具體推到過程:

https://arxiv.org/pdf/1606.05908.pdf

下面是PyTorch的實現:

  1. reconstruction_function = nn.BCELoss(size_average=False)  # mse loss 
  2.  
  3. def loss_function(recon_x, x, mu, logvar): 
  4.     """ 
  5.     recon_x: generating images 
  6.     x: origin images 
  7.     mu: latent mean 
  8.     logvar: latent log variance 
  9.     """ 
  10.     BCE = reconstruction_function(recon_x, x) 
  11.     # loss = 0.5 * sum(1 + log(sigma^2) - mu^2 - sigma^2) 
  12.     KLD_element = mu.pow(2).add_(logvar.exp()).mul_(-1).add_(1).add_(logvar) 
  13.     KLD = torch.sum(KLD_element).mul_(-0.5
  14.     # KL divergence 
  15.     return BCE + KLD 

另外變分編碼器除了可以讓我們隨機生成隱含變量,還能夠提高網絡的泛化能力。

最后是VAE的代碼實現:

  1. class VAE(nn.Module): 
  2.     def __init__(self): 
  3.         super(VAE, self).__init__() 
  4.  
  5.         self.fc1 = nn.Linear(784400
  6.         self.fc21 = nn.Linear(40020
  7.         self.fc22 = nn.Linear(40020
  8.         self.fc3 = nn.Linear(20400
  9.         self.fc4 = nn.Linear(400784
  10.  
  11.     def encode(self, x): 
  12.         h1 = F.relu(self.fc1(x)) 
  13.         return self.fc21(h1), self.fc22(h1) 
  14.  
  15.     def reparametrize(self, mu, logvar): 
  16.         std = logvar.mul(0.5).exp_() 
  17.         if torch.cuda.is_available(): 
  18.             eps = torch.cuda.FloatTensor(std.size()).normal_() 
  19.         else
  20.             eps = torch.FloatTensor(std.size()).normal_() 
  21.         eps = Variable(eps) 
  22.         return eps.mul(std).add_(mu) 
  23.  
  24.     def decode(self, z): 
  25.         h3 = F.relu(self.fc3(z)) 
  26.         return F.sigmoid(self.fc4(h3)) 
  27.  
  28.     def forward(self, x): 
  29.         mu, logvar = self.encode(x) 
  30.         z = self.reparametrize(mu, logvar) 
  31.         return self.decode(z), mu, logvar 

VAE的結果比普通的自動編碼器要好很多,下面是結果:

深度學習自動編碼器還能用于數據生成?這篇文章告訴你答案  深度學習自動編碼器還能用于數據生成?這篇文章告訴你答案

VAE的缺點也很明顯,他是直接計算生成圖片和原始圖片的均方誤差而不是像GAN那樣去對抗來學習,這就使得生成的圖片會有點模糊?,F在已經有一些工作是將VAE和GAN結合起來,使用VAE的結構,但是使用對抗網絡來進行訓練,具體可以參考一下這篇論文:

https://arxiv.org/pdf/1512.09300.pdf

文中相關代碼鏈接:

http://t.cn/RK5gxpM

英文參考:

http://t.cn/RtoJRAa

本文轉自雷鋒網,如需轉載請至雷鋒網官網申請授權

責任編輯:張子龍 來源: 雷鋒網
相關推薦

2017-09-24 12:13:52

深度學習自動編碼器機器學習

2018-02-08 18:16:39

數據庫MySQL鎖定機制

2017-07-05 15:42:58

卷積神經網絡Non-Euclide計算機視覺

2017-07-12 16:56:42

卷積神經網絡結構數據CNN

2020-07-09 10:21:03

網絡排錯TCPIP

2020-09-18 10:18:08

MySQL數據插入數據庫

2019-01-08 07:43:53

路由器調制解調器

2023-04-06 11:10:31

閉包JavaScript

2023-09-22 07:52:16

HDMI 2.14K HDR游戲

2019-05-22 17:34:16

代碼開發工具

2020-02-12 18:55:24

負載因子初始值為什么

2021-03-22 10:52:13

人工智能深度學習自編碼器

2021-03-29 11:37:50

人工智能深度學習

2023-12-24 22:42:57

數據庫分片中間件

2019-09-02 09:06:04

無線路由器光貓WiFi

2021-12-17 10:09:47

編碼器語言模型DeepMind

2023-11-30 08:27:38

泛化調用架構

2019-01-28 11:24:53

Windows 功能系統

2017-08-16 21:58:05

自動編碼器DeepCoder深度學習

2025-12-08 08:59:51

裝飾器Python代碼
點贊
收藏

51CTO技術棧公眾號

av资源网一区| 日韩电影中文字幕在线观看| 欧美一区三区二区在线观看| 亚洲国产不卡| 婷婷丁香激情网| 在线高清一区| 午夜在线电影亚洲一区| 日韩精品久久一区二区| 一区二区国产精品| 国产不卡一区二区三区在线观看| 少妇精品导航| 欧美精品在线视频观看| ****av在线网毛片| 欧美一区二区人人喊爽| 免费a级在线播放| 欧美日韩国产中文| 麻豆传媒在线观看| 欧美一区二区久久久| 精品欧美不卡一区二区在线观看 | 国产精品玖玖玖在线资源| 中文字幕欧美亚洲| 主播大秀视频在线观看一区二区| 日韩高清人体午夜| 亚洲精品555| 日韩性xxxx爱| 久久av网站| **欧美日韩vr在线| 色琪琪久久se色| 亚洲精品免费一区二区三区| 国产一区二区三区四区老人| 91免费电影网站| 久久国产高清| 日韩视频在线视频| 一区在线观看视频| 天堂中文在线8| 亚洲成色999久久网站| 吉吉日韩欧美| 欧美久久久精品| 国产欧美一区二区三区精品观看 | 户外露出一区二区三区| 亚洲一区二区福利| 四虎地址8848精品| 日韩av电影国产| 日韩视频久久| 激情小视频网站| 国产精品美女www爽爽爽| 欧美日夜夜逼| 欧美变态凌虐bdsm| 免费观看性欧美大片无片| 国产精品电影在线观看| 在线亚洲伦理| 国产美女在线一区| 亚洲成人免费视| 美女视频在线免费| 久久久久久久av| 一区在线视频观看| 黄色激情在线视频| 欧美日韩精品国产| 国产免费拔擦拔擦8x高清在线人| 欧美高清不卡在线| 亚洲伦理一区| 97av视频在线观看| 欧美日韩一卡二卡三卡| 青草综合视频| 成人免费在线一区二区三区| 国产成人av电影在线观看| 久久综合色播| 亚洲国产精品va在线| 欧美重口另类| 欧美日韩一区二区三区免费| 久久久久9999亚洲精品| 国产系列电影在线播放网址| 国产亚洲欧美另类中文| 日韩高清av在线| 不卡av播放| 日本人成精品视频在线| 日韩精品电影在线观看| 日韩av手机版| 欧美一区二区精品久久911| 一区二区三区四区精品视频| 国产精品区一区二区三含羞草| 97精品久久久午夜一区二区三区| 欧美日韩视频精品二区| 中文字幕日本精品| 一区在线视频观看| 91人人澡人人爽人人精品| 欧美肥妇毛茸茸| 红杏aⅴ成人免费视频| 91九色鹿精品国产综合久久香蕉| 亚洲精品成a人在线观看| 西野翔中文久久精品国产| 欧美日韩国产一二| 一区二区三区在线观看视频| 久久五月精品中文字幕| 日韩免费在线免费观看| 久久精品99久久久| 欧美色视频免费| 久久久久久久久久国产| 992tv在线观看免费进| 精品国产自在久精品国产| 经典一区二区| 熟女人妇 成熟妇女系列视频| 777亚洲妇女| 日韩精品免费| 色偷偷亚洲女人天堂观看欧| 国产亚洲精品高潮| 夜夜嗨网站十八久久| 超碰在线电影| 欧美第一页在线| 99久久99久久综合| 超碰在线中文字幕| 九九久久99| 91精品福利视频| 日韩国产一区二区| 国产理论在线播放| 欧美人成在线视频| av不卡在线观看| 香蕉成人av| 伊人狠狠色丁香综合尤物| 91福利区一区二区三区| 久久一区二区三区喷水| 老鸭窝av在线| 欧美一区二区三区艳史| 久久老女人爱爱| 91成人在线| 这里只有精品66| 欧美久久久久久久久久| 水蜜桃久久夜色精品一区| 国产精品粉嫩av| 欧美大片欧美激情性色a∨久久| 国产专区综合网| 亚洲人体影院| av中文字幕av| 亚洲香蕉成人av网站在线观看| 男人操女人的视频在线观看欧美| 国产黄色在线免费观看| 国产精品视频免费一区| 色哟哟一区二区在线观看| 一区二区三区午夜视频| 国产中文字幕在线看| 国产美女精品在线观看| 欧美乱熟臀69xxxxxx| 免费欧美日韩| 99久久精品免费看国产小宝寻花 | 精品免费av一区二区三区| 老司机午夜网站| 亚洲性生活视频在线观看| 不卡av免费在线观看| 日韩电影精品| 九九热免费精品视频| 欧美综合在线观看| 精品久久久久久久久久| av不卡免费看| 台湾佬成人网| 美女张开让男人捅| 亚洲最大福利视频| 日韩欧美国产综合| 国产成人久久精品77777最新版本| 亚洲精品第一| 波多野结衣中文字幕在线| 黄色小网站91| 亚洲天堂av综合网| 中文字幕在线观看不卡| 欧美福利一区| 美脚恋feet久草欧美| 在线观看免费播放网址成人| 91中文字幕在线| 日韩av影院在线观看| 久久亚洲一区二区三区明星换脸| 国产成人3p视频免费观看| 午夜在线视频| 91九色在线观看视频| 青青草99啪国产免费| 欧美伊人久久大香线蕉综合69| 久久99精品国产.久久久久久 | 欧美精品精品一区| 国产精品小仙女| 免费一区二区三区视频导航| 成人三级黄色免费网站| 青青在线视频免费观看| 国产成人综合精品在线| 日韩欧美在线1卡| 国产亚洲欧美日韩日本| 亚洲中无吗在线| 一区二区乱码| 高清色视频在线观看| 一区二区91美女张开腿让人桶| 久久久在线视频| 在线综合视频播放| 日本一二三四高清不卡| 亚洲在线网站| 精品三级av在线导航| 亚洲国产美女 | 国产成人精品日本亚洲11| 精品久久久久久久久久久久久久久 | 黄色国产网站在线观看| 国产精品久久久久久亚洲影视 | 午夜视频国产| 午夜久久久精品| 视频二区在线|