用Pytorch構建一個自動解碼器

本文為 AI 研習社編譯的技術博客,原標題 :

Building Autoencoder in Pytorch

作者 | Vipul Vaibhaw

翻譯 | 鄧普斯•傑弗、醬番梨、向日魁

校對 | 鄧普斯•傑弗        整理 | 菠蘿妹

原文鏈接:

https://medium.com/@vaibhaw.vipul/building-autoencoder-in-pytorch-34052d1d280c


這篇文章中,我們將利用 CIFAR-10 數據集通過 Pytorch 構建一個簡單的卷積自編碼器。

引用維基百科的定義,」自編碼器是一種人工神經網絡,在無監督學習中用於有效編碼。自編碼的目的是通過一組數據學習出一種特徵(編碼),通常用於降維。「

為了建立一個自編碼器,我們需要三件事:一個編碼函數,一個解碼函數,和一個衡量壓縮特徵和解壓縮特徵間信息損失的距離函數(也稱為損失函數)。

如果我們要在 Pytorch 中編寫自動編碼器,我們需要有一個自動編碼器類,並且必須使用super()從父類繼承__init__。 

我們通過導入必要的 Pytorch 模塊開始編寫卷積自動編碼器。  

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

現在我們設置下載CIFAR-10數據集並將其轉換應用於它。

我們對數據集應用了兩個轉換 - 

  1. ToTensor() - 它將 PIL圖像或者 [0,255]範圍內的 numpy.ndarray(H x W x C)轉換成 Torch 。 [0.0,1.0]範圍內的形狀 FloatTensor。

  2. Normalize() - 使用均值和標準差對張量圖像進行標準化。

基本上在應用變換之後,我們得到(-2,2)範圍內的值 。 

# 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)

你可以在這裡閱讀更多關於上述變換的內容。 現在下一步是編寫自動編碼類。

# 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

卷積編碼器神經網絡具有一些 Conv2d,並且我們有使用ReLU激活功能正在被使用。 現在我們定義一些參數 -  

#defining some paramsnum_epochs = 5 #you can go for more epochs, I am using a macbatch_size = 128

然後是時候設置訓練模型了。我們調用模型並將其配置為在 cpu 上運行。如果你有一個 gpu,你可以使用 cuda。 

我們使用 Mean Squared Error 作為損失函數。對於優化器,我們使用 adam。

model = Autoencoder().cpu()distance = nn.MSELoss()optimizer = torch.optim.Adam(model.parameters(),weight_decay=1e-5)

讓咱們開始訓練吧!

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]))

這是我寫的一個簡單的博客,展示了如何在 Pytorch 中構建自動編碼器。 但是,如果要在模型中包含 MaxPool2d(),請確保設置 return_indices = True,然後在解碼器中使用 MaxUnpool2d()圖層。  

持續的學習和分享,可以在 github,Stack Overflow,LinkedIn,或者 Twitter 上 Follow 我。 


想要繼續查看該篇文章相關鏈接和參考文獻?

長按鏈接點擊打開或點擊【用Pytorch構建一個自動解碼器】:

https://ai.yanxishe.com/page/TextTranslation/1284


AI研習社每日更新精彩內容,觀看更多精彩內容:雷鋒網雷鋒網雷鋒網

命名實體識別(NER)綜述

傑出數據科學家的關鍵技能是什麼?

初學者怎樣使用Keras進行遷移學習

如果你想學數據科學,這 7 類資源千萬不能錯過


等你來譯:

深度學習目標檢測算法綜述

一文教你如何用PyTorch構建 Faster RCNN

高級DQNs:利用深度強化學習玩吃豆人遊戲

用於深度強化學習的結構化控制網絡 (ICML 論文講解)



想在手機閱讀更多博客及網站收入資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems