日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

如何使用自动编码器生成图像

發(fā)布時(shí)間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用自动编码器生成图像 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

How to Generate Images using Autoencoders

你知道什么會(huì)很酷嗎?如果我們不需要所有那些標(biāo)記數(shù)據(jù)來(lái)訓(xùn)練我們的模型。我的意思是標(biāo)記和分類數(shù)據(jù)需要太多的工作。不幸的是,從支持向量機(jī)到卷積神經(jīng)網(wǎng)絡(luò)的大多數(shù)現(xiàn)有模型如果沒(méi)有它們就無(wú)法進(jìn)行訓(xùn)練。

除了一小組算法,他們可以。好奇?這就是所謂的無(wú)監(jiān)督學(xué)習(xí)。無(wú)監(jiān)督學(xué)習(xí)通過(guò)自己的無(wú)標(biāo)簽數(shù)據(jù)推斷出一個(gè)函數(shù)。最著名的無(wú)監(jiān)督算法是K-Means,它已被廣泛用于將數(shù)據(jù)聚類成組和PCA,這是降維的解決方案。 K-Means和PCA可能是有史以來(lái)最好的兩種機(jī)器學(xué)習(xí)算法。讓他們變得更好的是他們的簡(jiǎn)單。我的意思是,如果你掌握它們,你就會(huì)像:“我為什么不早點(diǎn)想到它?”

我們想到的下一個(gè)問(wèn)題是:“是否存在無(wú)監(jiān)督的神經(jīng)網(wǎng)絡(luò)? “。你可能知道帖子標(biāo)題的答案。自動(dòng)編碼。

為了更好地理解自動(dòng)編碼器,我將在解釋的同時(shí)提供一些代碼。請(qǐng)注意,我們將使用Pytorch來(lái)構(gòu)建和訓(xùn)練我們的模型。

import torch from torch import nn, optim from torch.autograd import Variable from torch.nn import functional as F

自動(dòng)編碼器是簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),它們的輸出是它們的輸入。 就那么簡(jiǎn)單。 他們的目標(biāo)是學(xué)習(xí)如何重建輸入數(shù)據(jù)。 但它有什么用呢? 訣竅是他們的結(jié)構(gòu)。 網(wǎng)絡(luò)的第一部分就是我們所說(shuō)的編碼器。 它接收輸入并將其編碼在較低維度的潛在空間中。 第二部分(解碼器)采用該向量并對(duì)其進(jìn)行解碼以生成原始輸入。

中間的潛在向量是我們想要的,因?yàn)樗禽斎氲膲嚎s表示。應(yīng)用程序非常豐富,例如:

  • 壓縮

  • 降維

此外,很明顯,我們可以應(yīng)用它們來(lái)重現(xiàn)相同但有點(diǎn)不同甚至更好的數(shù)據(jù)。例如:

  • 數(shù)據(jù)去噪:用嘈雜的圖像輸入它們并訓(xùn)練它們輸出相同的圖像但沒(méi)有噪聲

  • 訓(xùn)練數(shù)據(jù)增加

  • 異常檢測(cè):在一個(gè)類上訓(xùn)練它們,以便每個(gè)異常都會(huì)產(chǎn)生很大的重建錯(cuò)誤。

然而,自動(dòng)編碼器面臨與大多數(shù)神經(jīng)網(wǎng)絡(luò)相同的幾個(gè)問(wèn)題。他們往往過(guò)度適應(yīng),他們?cè)馐芟У奶荻葐?wèn)題。有解決方案嗎?變分自動(dòng)編碼器是一個(gè)非常好的和優(yōu)雅的努力。它本質(zhì)上增加了隨機(jī)性但不完全相同。
讓我們進(jìn)一步解釋一下。變分自動(dòng)編碼器經(jīng)過(guò)訓(xùn)練,可以學(xué)習(xí)模擬輸入數(shù)據(jù)的概率分布,而不是映射輸入和輸出的函數(shù)。然后,它從該分布中采樣點(diǎn)并將它們饋送到解碼器以生成新的輸入數(shù)據(jù)樣本。但是等一下。當(dāng)我聽說(shuō)概率分布時(shí),只有一件事物浮現(xiàn)在腦海中:貝葉斯。是的,貝葉斯規(guī)則再次成為主要原則。順便說(shuō)一句,我并不是夸大其詞,但貝葉斯公式是有史以來(lái)最好的方程式。而且我不是在開玩笑。無(wú)處不在。如果您不知道是什么,請(qǐng)查閱。放棄那篇文章,了解貝葉斯是什么。我會(huì)原諒你的。

回到變分自動(dòng)編碼器。我認(rèn)為以下圖像清晰起來(lái):


你有它。 隨機(jī)神經(jīng)網(wǎng)絡(luò)。 在我們構(gòu)建一個(gè)生成新圖像的示例之前,討論更多細(xì)節(jié)是合適的。

VAE的一個(gè)關(guān)鍵方面是損失功能。 最常見的是,它由兩部分組成。 重建損失測(cè)量重建數(shù)據(jù)與原始數(shù)據(jù)的不同程度(例如二進(jìn)制交叉熵)。 KL-分歧試圖使過(guò)程正規(guī)化并使重建數(shù)據(jù)盡可能多樣化。

def loss_function(recon_x, x, mu, logvar) -> Variable:BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784))KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())KLD /= BATCH_SIZE * 784return BCE + KLD

另一個(gè)重要方面是如何訓(xùn)練模型。 難以發(fā)生,因?yàn)樽兞渴亲⑨尨_定性的,但隨機(jī)和梯度下降通常不會(huì)那樣工作。 為解決這個(gè)問(wèn)題,我們使用重新參數(shù)化。 潛在向量(z)將等于我們分布的學(xué)習(xí)平均值(μ)加上學(xué)習(xí)的標(biāo)準(zhǔn)偏差(σ)乘以epsilon(ε),其中ε遵循正態(tài)分布。 我們重新參數(shù)化樣本,使隨機(jī)性與參數(shù)無(wú)關(guān)。

def reparameterize(self, mu: Variable, logvar: Variable) -> Variable:#mu : mean matrix#logvar : variance matrixif self.training: std = logvar.mul(0.5).exp_() # type: Variableeps = Variable(std.data.new(std.size()).normal_())return eps.mul(std).add_(mu)else:return mu

在我們的示例中,我們將嘗試使用變分自動(dòng)編碼器生成新圖像。 我們將使用MNIST數(shù)據(jù)集,重建的圖像將是手寫的數(shù)字。 正如我已經(jīng)告訴過(guò)你的那樣,除了熟悉之外,我使用Pytorch作為框架,沒(méi)有特別的原因。 首先,我們應(yīng)該定義我們的圖層。

def __init__(self):super(VAE, self).__init__()# ENCODERself.fc1 = nn.Linear(784, 400)self.relu = nn.ReLU()self.fc21 = nn.Linear(400, 20) # mu layerself.fc22 = nn.Linear(400, 20) # logvariance layer# DECODERself.fc3 = nn.Linear(20, 400)self.fc4 = nn.Linear(400, 784)self.sigmoid = nn.Sigmoid()

如您所見,我們將使用一個(gè)非常簡(jiǎn)單的網(wǎng)絡(luò),只有Dense(在pytorch的情況下為L(zhǎng)inear)層。 下一步是構(gòu)建運(yùn)行編碼器和解碼器的功能。

def encode(self, x: Variable) -> (Variable, Variable):h1 = self.relu(self.fc1(x)) return self.fc21(h1), self.fc22(h1)def decode(self, z: Variable) -> Variable:h3 = self.relu(self.fc3(z))return self.sigmoid(self.fc4(h3))def forward(self, x: Variable) -> (Variable, Variable, Variable):mu, logvar = self.encode(x.view(-1, 784))z = self.reparameterize(mu, logvar)return self.decode(z), mu, logvar

它只是幾行python代碼。 沒(méi)什么大不了。 最后,我們將訓(xùn)練我們的模型并查看生成的圖像。

快速提醒:與tensorflow相比,Pytorch有一個(gè)動(dòng)態(tài)圖表,這意味著代碼在運(yùn)行中運(yùn)行。 沒(méi)有必要?jiǎng)?chuàng)建圖形然后編譯執(zhí)行它,Tensorflow最近以其急切的執(zhí)行模式引入了上述功能。

optimizer = optim.Adam(model.parameters(), lr=1e-3)def train(epoch):model.train()train_loss = 0for batch_idx, (data, _) in enumerate(train_loader):data = Variable(data)optimizer.zero_grad()recon_batch, mu, logvar = model(data)loss = loss_function(recon_batch, data, mu, logvar)loss.backward()train_loss += loss.data[0]optimizer.step()def test(epoch):model.eval()test_loss = 0for i, (data, _) in enumerate(test_loader):data = Variable(data, volatile=True)recon_batch, mu, logvar = model(data)test_loss += loss_function(recon_batch, data, mu, logvar).data[0]for epoch in range(1, EPOCHS + 1):train(epoch)test(epoch)

培訓(xùn)完成后,我們執(zhí)行測(cè)試功能以檢查模型的工作情況。 事實(shí)上,它做得非常好,構(gòu)造的圖像與原始圖像完全相同,我相信沒(méi)有人能夠在不知道整個(gè)故事的情況下將它們區(qū)分開來(lái)。

下圖顯示了第一行中的原始照片和第二行中的原始照片。

相當(dāng)不錯(cuò),不是嗎?

在我們結(jié)束這篇文章之前,我想再介紹一個(gè)主題。 如我們所見,變分自動(dòng)編碼器能夠生成新圖像。 這是生成模型的經(jīng)典行為。 生成模型正在生成新數(shù)據(jù)。 另一方面,判別模型是對(duì)類或類別中的現(xiàn)有數(shù)據(jù)進(jìn)行分類或區(qū)分。

用一些數(shù)學(xué)術(shù)語(yǔ)來(lái)解釋:生成模型學(xué)習(xí)聯(lián)合概率分布p(x,y),而判別模型學(xué)習(xí)條件概率分布p(y | x)。

在我看來(lái),生成模型更有趣,因?yàn)樗鼈優(yōu)閺臄?shù)據(jù)增加到模擬未來(lái)可能狀態(tài)的眾多可能性打開了大門。 但更多關(guān)于下一篇文章的內(nèi)容。 關(guān)于一種稱為生成性對(duì)抗性網(wǎng)絡(luò)的相對(duì)較新的生成模型的帖子。

在那之前,繼續(xù)學(xué)習(xí)AI。

總結(jié)

以上是生活随笔為你收集整理的如何使用自动编码器生成图像的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。