導(dǎo)語:'自編碼器是一種人工神經(jīng)網(wǎng)絡(luò),在無監(jiān)督學(xué)習(xí)中用于有效編碼。自編碼的目的是通過一組數(shù)據(jù)學(xué)習(xí)出一種特征(編碼),通常用于降維。' 本文為 AI 研習(xí)社編譯的技術(shù)博客,原標題 : Building Autoencoder in Pytorch 作者 | Vipul Vaibhaw 翻譯 | 鄧普斯·杰弗、醬番梨、向日魁 校對 | 鄧普斯·杰弗 整理 | 菠蘿妹 https:///@vaibhaw.vipul/building-autoencoder-in-pytorch-34052d1d280c 這篇文章中,我們將利用 CIFAR-10 數(shù)據(jù)集通過 Pytorch 構(gòu)建一個簡單的卷積自編碼器。 為了建立一個自編碼器,我們需要三件事:一個編碼函數(shù),一個解碼函數(shù),和一個衡量壓縮特征和解壓縮特征間信息損失的距離函數(shù)(也稱為損失函數(shù))。 如果我們要在 Pytorch 中編寫自動編碼器,我們需要有一個自動編碼器類,并且必須使用super()從父類繼承__init__。 我們通過導(dǎo)入必要的 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 現(xiàn)在我們設(shè)置下載CIFAR-10數(shù)據(jù)集并將其轉(zhuǎn)換應(yīng)用于它。 我們對數(shù)據(jù)集應(yīng)用了兩個轉(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() - 使用均值和標準差對張量圖像進行標準化。 基本上在應(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)在下一步是編寫自動編碼類。 # 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è)置訓(xùn)練模型了。我們調(diào)用模型并將其配置為在 cpu 上運行。如果你有一個 gpu,你可以使用 cuda。 我們使用 Mean Squared Error 作為損失函數(shù)。對于優(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])) 這是我寫的一個簡單的博客,展示了如何在 Pytorch 中構(gòu)建自動編碼器。 但是,如果要在模型中包含 MaxPool2d(),請確保設(shè)置 return_indices = True,然后在解碼器中使用 MaxUnpool2d()圖層。 持續(xù)的學(xué)習(xí)和分享,可以在 github,Stack Overflow,LinkedIn,或者 Twitter 上 Follow 我。 想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻? 長按鏈接點擊打開或點擊底部【用Pytorch構(gòu)建一個自動解碼器】: https://ai./page/TextTranslation/1284 AI研習(xí)社每日更新精彩內(nèi)容,觀看更多精彩內(nèi)容:雷鋒網(wǎng)雷鋒網(wǎng)(公眾號:雷鋒網(wǎng))雷鋒網(wǎng) 命名實體識別(NER)綜述 杰出數(shù)據(jù)科學(xué)家的關(guān)鍵技能是什么? 初學(xué)者怎樣使用Keras進行遷移學(xué)習(xí) 如果你想學(xué)數(shù)據(jù)科學(xué),這 7 類資源千萬不能錯過 等你來譯: 深度學(xué)習(xí)目標檢測算法綜述 一文教你如何用PyTorch構(gòu)建 Faster RCNN 高級DQNs:利用深度強化學(xué)習(xí)玩吃豆人游戲 用于深度強化學(xué)習(xí)的結(jié)構(gòu)化控制網(wǎng)絡(luò) (ICML 論文講解) |
|
來自: flyk0tcfb46p9f > 《AI》