0
本文作者: AI研習(xí)社-譯站 | 2019-01-28 10:16 |
本文為 AI 研習(xí)社編譯的技術(shù)博客,原標(biāo)題 :
Building Autoencoder in Pytorch
作者 | Vipul Vaibhaw
翻譯 | 鄧普斯?杰弗、醬番梨、向日魁
校對(duì) | 鄧普斯?杰弗 整理 | 菠蘿妹
原文鏈接:
https://medium.com/@vaibhaw.vipul/building-autoencoder-in-pytorch-34052d1d280c
這篇文章中,我們將利用 CIFAR-10 數(shù)據(jù)集通過(guò) Pytorch 構(gòu)建一個(gè)簡(jiǎn)單的卷積自編碼器。
引用維基百科的定義,”自編碼器是一種人工神經(jīng)網(wǎng)絡(luò),在無(wú)監(jiān)督學(xué)習(xí)中用于有效編碼。自編碼的目的是通過(guò)一組數(shù)據(jù)學(xué)習(xí)出一種特征(編碼),通常用于降維?!?/p>
為了建立一個(gè)自編碼器,我們需要三件事:一個(gè)編碼函數(shù),一個(gè)解碼函數(shù),和一個(gè)衡量壓縮特征和解壓縮特征間信息損失的距離函數(shù)(也稱為損失函數(shù))。
如果我們要在 Pytorch 中編寫自動(dòng)編碼器,我們需要有一個(gè)自動(dòng)編碼器類,并且必須使用super()從父類繼承__init__。
我們通過(guò)導(dǎo)入必要的 Pytorch 模塊開始編寫卷積自動(dòng)編碼器。
import torchimport torchvision as tvimport torchvision.transforms as transformsimport torch.nn as nnimport torch.nn.functional as Ffrom torch.autograd import Variablefrom torchvision.utils import save_image
現(xiàn)在我們?cè)O(shè)置下載CIFAR-10數(shù)據(jù)集并將其轉(zhuǎn)換應(yīng)用于它。
我們對(duì)數(shù)據(jù)集應(yīng)用了兩個(gè)轉(zhuǎn)換 -
ToTensor() - 它將 PIL圖像或者 [0,255]范圍內(nèi)的 numpy.ndarray(H x W x C)轉(zhuǎn)換成 Torch 。 [0.0,1.0]范圍內(nèi)的形狀 FloatTensor。
Normalize() - 使用均值和標(biāo)準(zhǔn)差對(duì)張量圖像進(jìn)行標(biāo)準(zhǔn)化。
基本上在應(yīng)用變換之后,我們得到(-2,2)范圍內(nèi)的值 。
# Loading and Transforming datatransform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4466), (0.247, 0.243, 0.261))])trainTransform = tv.transforms.Compose([tv.transforms.ToTensor(), tv.transforms.Normalize((0.4914, 0.4822, 0.4466), (0.247, 0.243, 0.261))])trainset = tv.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)dataloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=False, num_workers=4)testset = tv.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)
你可以在這里閱讀更多關(guān)于上述變換的內(nèi)容。 現(xiàn)在下一步是編寫自動(dòng)編碼類。
# Writing our modelclass Autoencoder(nn.Module): def __init__(self): super(Autoencoder,self).__init__() self.encoder = nn.Sequential( nn.Conv2d(3, 6, kernel_size=5), nn.ReLU(True), nn.Conv2d(6,16,kernel_size=5), nn.ReLU(True)) self.decoder = nn.Sequential( nn.ConvTranspose2d(16,6,kernel_size=5), nn.ReLU(True), nn.ConvTranspose2d(6,3,kernel_size=5), nn.ReLU(True), nn.Sigmoid()) def forward(self,x): x = self.encoder(x) x = self.decoder(x) return x
卷積編碼器神經(jīng)網(wǎng)絡(luò)具有一些 Conv2d,并且我們有使用ReLU激活功能正在被使用。 現(xiàn)在我們定義一些參數(shù) -
#defining some paramsnum_epochs = 5 #you can go for more epochs, I am using a macbatch_size = 128
然后是時(shí)候設(shè)置訓(xùn)練模型了。我們調(diào)用模型并將其配置為在 cpu 上運(yùn)行。如果你有一個(gè) gpu,你可以使用 cuda。
我們使用 Mean Squared Error 作為損失函數(shù)。對(duì)于優(yōu)化器,我們使用 adam。
model = Autoencoder().cpu()distance = nn.MSELoss()optimizer = torch.optim.Adam(model.parameters(),weight_decay=1e-5)
讓咱們開始訓(xùn)練吧!
for epoch in range(num_epochs): for data in dataloader: img, _ = data img = Variable(img).cpu() # ===================forward===================== output = model(img) loss = distance(output, img) # ===================backward==================== optimizer.zero_grad() loss.backward() optimizer.step() # ===================log======================== print('epoch [{}/{}], loss:{:.4f}'.format(epoch+1, num_epochs, loss.data[0]))
這是我寫的一個(gè)簡(jiǎn)單的博客,展示了如何在 Pytorch 中構(gòu)建自動(dòng)編碼器。 但是,如果要在模型中包含 MaxPool2d(),請(qǐng)確保設(shè)置 return_indices = True,然后在解碼器中使用 MaxUnpool2d()圖層。
持續(xù)的學(xué)習(xí)和分享,可以在 github,Stack Overflow,LinkedIn,或者 Twitter 上 Follow 我。
想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻(xiàn)?
長(zhǎng)按鏈接點(diǎn)擊打開或點(diǎn)擊【用Pytorch構(gòu)建一個(gè)自動(dòng)解碼器】:
https://ai.yanxishe.com/page/TextTranslation/1284
AI研習(xí)社每日更新精彩內(nèi)容,觀看更多精彩內(nèi)容:雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
等你來(lái)譯:
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。