在PyTorch中使用深度自編碼器實現圖像重建

2021-01-11 人工智慧遇見磐創

人工神經網絡有許多流行的變體,可用於有監督和無監督學習問題。自編碼器也是神經網絡的一個變種,主要用於無監督學習問題。

當它們在體系結構中有多個隱藏層時,它們被稱為深度自編碼器。這些模型可以應用於包括圖像重建在內的各種應用。

在圖像重建中,他們學習輸入圖像模式的表示,並重建與原始輸入圖像模式匹配的新圖像。圖像重建有許多重要的應用,特別是在醫學領域,需要從現有的不完整或有噪聲的圖像中提取解碼後的無噪聲圖像。

在本文中,我們將演示在PyTorch中實現用於重建圖像的深度自編碼器。該深度學習模型將以MNIST手寫數字為訓練對象,在學習輸入圖像的表示後重建數字圖像。

自編碼器

自編碼器是人工神經網絡的變體,通常用於以無監督的方式學習有效的數據編碼。

他們通常在一個表示學習方案中學習,在那裡他們學習一組數據的編碼。網絡通過學習輸入數據的表示,以非常相似的方式重建輸入數據。自編碼器的基本結構如下所示。

該體系結構通常包括輸入層、輸出層和連接輸入和輸出層的一個或多個隱藏層。輸出層與輸入層具有相同數量的節點,因為它要重新構造輸入。

在它的一般形式中,只有一個隱藏層,但在深度自動編碼器的情況下,有多個隱藏層。這種深度的增加減少了表示某些函數的計算成本,也減少了學習某些函數所需的訓練數據量。其應用領域包括異常檢測、圖像處理、信息檢索、藥物發現等。

在PyTorch中實現深度自編碼器

首先,我們將導入所有必需的庫。

import osimport torch import torchvisionimport torch.nn as nnimport torchvision.transforms as transformsimport torch.optim as optimimport matplotlib.pyplot as pltimport torch.nn.functional as Ffrom torchvision import datasetsfrom torch.utils.data import DataLoaderfrom torchvision.utils import save_imagefrom PIL import Image現在,我們將定義超參數的值。

Epochs = 100Lr_Rate = 1e-3Batch_Size = 128以下函數將用於PyTorch模型所需的圖像轉換。

transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])使用下面的代碼片段,我們將下載MNIST手寫數字數據集,並為進一步處理做好準備。

train_set = datasets.MNIST(root='./data', train=True, download=True, transform=transform)test_set = datasets.MNIST(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(train_set, Batch_Size=Batch_Size, shuffle=True)test_loader = DataLoader(test_set, Batch_Size=Batch_Size, shuffle=True)讓我們看看關於訓練數據及其類的一些信息。

print(train_set)

print(train_set.classes)

在下一步中,我們將定義用於定義模型的Autoencoder類。

class Autoencoder(nn.Module): def __init__(self): super(Autoencoder, self).__init__() #編碼器 self.enc1 = nn.Linear(in_features=784, out_features=256) # Input image (28*28 = 784) self.enc2 = nn.Linear(in_features=256, out_features=128) self.enc3 = nn.Linear(in_features=128, out_features=64) self.enc4 = nn.Linear(in_features=64, out_features=32) self.enc5 = nn.Linear(in_features=32, out_features=16) #解碼器 self.dec1 = nn.Linear(in_features=16, out_features=32) self.dec2 = nn.Linear(in_features=32, out_features=64) self.dec3 = nn.Linear(in_features=64, out_features=128) self.dec4 = nn.Linear(in_features=128, out_features=256) self.dec5 = nn.Linear(in_features=256, out_features=784) # Output image (28*28 = 784) def forward(self, x): x = F.relu(self.enc1(x)) x = F.relu(self.enc2(x)) x = F.relu(self.enc3(x)) x = F.relu(self.enc4(x)) x = F.relu(self.enc5(x)) x = F.relu(self.dec1(x)) x = F.relu(self.dec2(x)) x = F.relu(self.dec3(x)) x = F.relu(self.dec4(x)) x = F.relu(self.dec5(x)) return x現在,我們將創建Autoencoder模型作為上面定義的Autoencoder類的一個對象。

model = Autoencoder()print(model)

現在,我們將定義損失函數和優化方法。

criterion = nn.MSELoss()optimizer = optim.Adam(net.parameters(), lr=Lr_Rate)以下函數將啟用CUDA環境。

def get_device(): if torch.cuda.is_available(): device = 'cuda:0' else: device = 'cpu' return device下面的函數將創建一個目錄來保存結果。

def make_dir(): image_dir = 'MNIST_Out_Images' if not os.path.exists(image_dir): os.makedirs(image_dir)使用下面的函數,我們將保存模型生成的重建圖像。

def save_decod_img(img, epoch): img = img.view(img.size(0), 1, 28, 28) save_image(img, './MNIST_Out_Images/Autoencoder_image{}.png'.format(epoch))將調用下面的函數來訓練模型。

def training(model, train_loader, Epochs): train_loss = [] for epoch in range(Epochs): running_loss = 0.0 for data in train_loader: img, _ = data img = img.to(device) img = img.view(img.size(0), -1) optimizer.zero_grad() outputs = model(img) loss = criterion(outputs, img) loss.backward() optimizer.step() running_loss += loss.item() loss = running_loss / len(train_loader) train_loss.append(loss) print('Epoch {} of {}, Train Loss: {:.3f}'.format( epoch+1, Epochs, loss)) if epoch % 5 == 0: save_decod_img(outputs.cpu().data, epoch) return train_loss以下函數將對訓練後的模型進行圖像重建測試。

def test_image_reconstruct(model, test_loader): for batch in test_loader: img, _ = batch img = img.to(device) img = img.view(img.size(0), -1) outputs = model(img) outputs = outputs.view(outputs.size(0), 1, 28, 28).cpu().data save_image(outputs, 'MNIST_reconstruction.png') break在訓練之前,模型將被推送到CUDA環境中,並使用上面定義的函數創建目錄來保存結果圖像。

device = get_device()model.to(device)make_dir()現在,將對模型進行訓練。

train_loss = training(model, train_loader, Epochs)

訓練成功後,我們將在訓練中可視化損失。

plt.figure()plt.plot(train_loss)plt.title('Train Loss')plt.xlabel('Epochs')plt.ylabel('Loss')plt.savefig('deep_ae_mnist_loss.png')

我們將可視化訓練期間保存的一些圖像。

Image.open('/content/MNIST_Out_Images/Autoencoder_image0.png')

Image.open('/content/MNIST_Out_Images/Autoencoder_image50.png')

Image.open('/content/MNIST_Out_Images/Autoencoder_image95.png')

在最後一步,我們將測試我們的自編碼器模型來重建圖像。

test_image_reconstruct(model, testloader)Image.open('/content/MNIST_reconstruction.png')

所以,我們可以看到,自訓練過程開始時,自編碼器模型就開始重建圖像。第一個epoch以後,重建的質量不是很好,直到50 epoch後才得到改進。

經過完整的訓練,我們可以看到,在95 epoch以後生成的圖像和測試中,它可以構造出與原始輸入圖像非常匹配的圖像。

我們根據loss值,可以知道epoch可以設置100或200。

經過長時間的訓練,有望獲得更清晰的重建圖像。然而,通過這個演示,我們可以理解如何在PyTorch中實現用於圖像重建的深度自編碼器。

參考文獻:

Sovit Ranjan Rath, 「Implementing Deep Autoencoder in PyTorch」Abien Fred Agarap, 「Implementing an Autoencoder in PyTorch」Reyhane Askari, 「Auto Encoders」

相關焦點

  • 朱茂華:深度自編碼器解析及MLP應用實例
    中國科學院國家天文臺絲綢之路項目博士後李碩在主題演講中首先介紹了中國科學院國家天文臺及絲綢之路計劃,並指出「老虎」高性能計算機集群是中國科學院國家天文臺推出的世界領先高性能計算平臺,可以更好幫助中國天文學者熟悉GPU異構計算。AMD工程師朱茂華在演講中首先解釋了人工神經網絡、針對它進行的數據建模及AMD研究深度神經網絡的原因。
  • 深度學習新應用:在PyTorch中用單個2D圖像創建3D模型
    選自Medium作者:Phúc Lê機器之心編譯參與:李詩萌、王淑婷深度學習在諸多 2D 圖像任務中表現出色,毋庸置疑。但如何將它應用於 3D 圖像問題中呢?文本通過探索,將深度學習擴展到了單個 2D 圖像的 3D 重建任務中,並成功實現了這一應用。
  • 輕鬆學Pytorch-使用ResNet50實現圖像分類
    Hello大家好,這篇文章給大家詳細介紹一下pytorch中最重要的組件torchvision,它包含了常見的數據集、模型架構與預訓練模型權重文件、常見圖像變換、計算機視覺任務訓練。可以是說是pytorch中非常有用的模型遷移學習神器。本文將會介紹如何使用torchvison的預訓練模型ResNet50實現圖像分類。
  • 手把手教你用PyTorch實現圖像分類器(第一部分)
    最後一個項目是用PyTorch創建一個102種不同類型的花的圖像分類器。在做這個final project的時候,很多同學都遇到了類似的問題和挑戰。當我接近完成的時候,我決定與大家分享一些在未來對他人有益的建議和見解。通過3篇短文,介紹如何實現圖像分類器的概念基礎——這是一種能夠理解圖像內容的算法。
  • Deep CARs:使用Pytorch學習框架實現遷移學習
    本模型將通過神經網絡來實現目標。更準確地說,是使用一個深度神經網絡,因此得名Deep CARs(深度計算機自動額定值系統)。想要實現這一目標,需要完成兩部分的學習,第1部分:構建汽車分類器;第2部分:部署分類器。本文將著重論述第1部分內容。我們將使用一種叫做遷移學習的方法來訓練分類器。什麼是遷移學習?
  • PyTorch實現TPU版本CNN模型
    隨著深度學習模型在各種應用中的成功實施,現在是時候獲得不僅準確而且速度更快的結果。為了得到更準確的結果,數據的大小是非常重要的,但是當這個大小影響到機器學習模型的訓練時間時,這一直是一個值得關注的問題。為了克服訓練時間的問題,我們使用TPU運行時環境來加速訓練。為此,PyTorch一直在通過提供最先進的硬體加速器來支持機器學習的實現。
  • 使用TensorFlow創建能夠圖像重建的自編碼器模型
    在這篇文章之前,我們先看一下代碼實現我建議您在另一個選項卡中打開這個筆記本(TF實現),這樣您就可以直觀地了解發生了什麼。因此,我們的模型將利用它在訓練中學習到的上下文重建圖像中缺失的部分。數據我們將為任務選擇一個域。我們選擇了一些山地圖像,它們是Puneet Bansal在Kaggle上的 Intel Image Classification數據集的一部分。為什麼只有山脈的圖像?在這裡,我們選擇屬於某個特定域的圖像。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    介紹圖像分類是計算機視覺的最重要應用之一。它的應用範圍包括從自動駕駛汽車中的物體分類到醫療行業中的血細胞識別,從製造業中的缺陷物品識別到建立可以對戴口罩與否的人進行分類的系統。在所有這些行業中,圖像分類都以一種或另一種方式使用。他們是如何做到的呢?他們使用哪個框架?
  • 使用Google Colab上的PyTorch YOLOv3
    在本文中,我將共享處理視頻的代碼,以獲取谷歌Colab內每個對象的邊框。 我們將不討論YOLO的概念或架構,因為很多好的文章已經在媒體中詳細闡述了這一點。這裡我們只討論函數代碼。開始對視頻中的每一幀進行循環以獲得預測。
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    在本教程中,假設你運行的是使用 CPU 進行深度學習運算的機器,但我也會向你展示如何在 GPU 中定義張量:PyTorch 的默認張量類型是一個浮點型張量,定義為「torch.FloatTensor」。
  • PyTorch實現,GitHub4000星:微軟開源的CV庫
    該庫沒有從頭開始創建實現,而是基於已有的 SOTA 庫發展而來,並圍繞加載圖像數據、優化和評估模型、擴展至雲端構建了額外的工具函數。此外,微軟團隊表示,希望通過該項目回答計算機視覺領域的常見問題、指出頻繁出現的缺陷問題,並展示如何利用雲進行模型訓練和部署。該庫中所有示例以 Jupyter notebooks 和常見工具函數的形式呈現。
  • 用Java實現目標檢測|PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。
  • 使用PyTorch 檢測眼部疾病
    深度學習是當今普遍存在的一種學習方式,它被廣泛應用於從圖像分類到語音識別的各個領域。在這篇文章中,我將向你展示如何構建一個簡單的神經網絡,用PyTorch從視網膜光學相干斷層掃描圖像中檢測不同的眼部疾病。 數據集 OCT 是一種成像技術,用於捕捉活體患者視網膜的高解析度橫截面。
  • 用Java實現目標檢測 | PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。
  • 如何用PyTorch訓練圖像分類器
    -99465a1e9bf5如果你剛剛開始使用PyTorch並想學習如何進行基本的圖像分類,那麼你可以參考本教程。它將介紹如何組織訓練數據,使用預訓練神經網絡訓練模型,然後預測其他圖像。為此,我將使用由Google地圖中的地圖圖塊組成的數據集,並根據它們包含的地形特徵對它們進行分類。我會在另一篇文章中介紹如何使用它(簡而言之:為了識別無人機起飛或降落的安全區域)。但是現在,我只想使用一些訓練數據來對這些地圖圖塊進行分類。下面的代碼片段來自Jupyter Notebook。
  • 使用PyTorch進行情侶幸福度測試指南
    例如,如果數據中幸福夫妻的圖像平均比不幸福夫妻的圖像更亮,我們並不希望我們的模型映射這種關聯。我們使用了強大的ImgAug庫[3]進行了相當多策略的數據擴充,以確保我們模型的魯棒性。基本上對於每個批次的每個圖像,我們至都至少應用多種數據增強技術。下圖是一張圖片應用了48種數據增強策略的示例。
  • 獨家 | 教你使用torchlayers 來構建PyTorch 模型(附連結)
    這個項目的開發者簡潔地定義了它:torchlayers是一個基於PyTorch的庫,提供了torch.nn層的形狀和維度的自動推斷以及當前最好的網絡結構(例如Efficient-Net)中的構建塊。我喜歡這個圖像和文本分類二合一的例子(見下面連結)!
  • 福利,PyTorch中文版官方教程來了
    教程作者來自 pytorchchina.com。教程網站:http://pytorch123.com教程裡有什麼教程根據 PyTorch 官方版本目錄,完整地還原了所有的內容。包括簡單的環境搭建、快速入門相關 API、高級操作、圖像處理實戰、文本處理實戰、GAN 和強化學習等,基本涵蓋了目前所有深度學習相關的知識點。教程的一部分內容,使用 torch.view 改變 tensor 的大小或形狀用教程設計一個聊天機器人,以上為部分對話。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    主要流程分為以下三個部分:1,自定義生成一個訓練集,具體為在二維平面上的一些點,分為兩類;2,構建一個淺層神經網絡,實現對特徵的擬合,主要是明白在 pytorch 中網絡結構如何搭建;3,完成訓練和測試部分的工作,熟悉 pytorch 如何對網絡進行訓練和測試。1.
  • PyTorch 1.7發布,支持CUDA 11、Windows分布式訓練
    此外,一些特性也更新為穩定版,包括自定義 C++ 類、內存分析器、通過自定義類張量對象進行擴展、RPC 中的用戶異步函數,以及 torch.distributed 中的許多其他特性(如 Per-RPC 超時、DDP dynamic bucketing、RRef helper)。