Pytorch:分步實施3D卷積神經網絡(附代碼教程!)

2020-12-04 人工智慧研究院

如何編寫3d CNN的PyTorch教程

首先,我們需要簡單解釋一下什麼是3d CNN,以及它與通用2d CNN的區別。然後,我們將逐步分析如何使用Pytorch實現3D卷積神經網絡。

什麼是3D卷積神經網絡?

無論我們說的CNN與2d CNN非常相似,都保留3d CNN。區別在於以下幾點(非詳盡列表):

3d卷積層

最初2d卷積層是輸入與不同過濾器之間的逐項乘法運算,其中過濾器和輸入是2d矩陣

在3d卷積層中,使用相同的操作。我們對多對二維矩陣進行這些操作。

填充選項和幻燈片步驟選項的工作方式相同。

3d MaxPool圖層

2d Maxpool圖層(2x2濾鏡)大約要取一個我們從輸入中劃定的2x2小正方形的最大元素。

現在,在3d Maxpool(2x2x2)中,我們在寬度為2的立方體中查找最大元素。此多維數據集表示從輸入以2x2x2區域分隔的空間。

請注意,運算數量(與2d CNN層相比)乘以使用的過濾器的大小(與Maxpool或卷積無關),也乘以輸入本身的大小。

3d數據點看起來如何?

那麼3D CNN的數據點看起來如何?

生動描述圖片的一種方法是使用以下圖片:

可用於CNN的其他現有數據集包括:

RGB-D設備:Google Tango,Microsoft Kinect等。雷射雷達從多個圖像進行3D重建現在如何實施?

可以自己嘗試使用我們正在使用的 Kaggle在該數據集上的代碼。

整個筆記本中將使用多個庫。這是它的列表。

# importing the librariesimport pandas as pdimport numpy as npfrom tqdm import tqdmimport os # for reading and displaying imagesfrom skimage.io import imreadimport matplotlib.pyplot as plt # for creating validation setfrom sklearn.model_selection import train_test_split# for evaluating the modelfrom sklearn.metrics import accuracy_score # PyTorch libraries and modulesimport torchfrom torch.autograd import Variableimport torch.nn as nnimport torch.nn.functional as Ffrom torch.optim import *import h5pyfrom plot3D import *

首先,由於數據集是特定的,因此在將它們提供給網絡之前,我們使用以下幫助函數來處理它們。

另外,數據集存儲為h5文件,因此要提取實際數據點,我們需要從h5文件讀取數據,並使用to_categorical函數將其轉換為向量。在此步驟中,我們還準備進行交叉驗證。

def array_to_color(array, cmap="Oranges"): s_m = plt.cm.ScalarMappable(cmap=cmap) return s_m.to_rgba(array)[:,:-1] def rgb_data_transform(data): data_t = [] for i in range(data.shape[0]): data_t.append(array_to_color(data[i]).reshape(16, 16, 16, 3)) return np.asarray(data_t, dtype=np.float32)

假設變量X_train / X_test分別具有(10000,16,16,16,3)和(2000,16,16,16,3)的形狀,而target_train / targets_test分別具有(10000,)(2000,)的形狀。但是現在我們再次將所有這些轉換為PyTorch張量格式。我們通過以下方式做到這一點。

with h5py.File("./full_dataset_vectors.h5", "r") as hf: # Split the data into training/test features/targets X_train = hf["X_train"][:] targets_train = hf["y_train"][:] X_test = hf["X_test"][:] targets_test = hf["y_test"][:] # Determine sample shape sample_shape = (16, 16, 16, 3) # Reshape data into 3D format X_train = rgb_data_transform(X_train) X_test = rgb_data_transform(X_test) # Convert target vectors to categorical targets targets_train = to_categorical(targets_train).astype(np.integer) targets_test = to_categorical(targets_test).astype(np.integer)

train_x = torch.from_numpy(X_train).float()train_y = torch.from_numpy(targets_train).long()test_x = torch.from_numpy(X_test).float()test_y = torch.from_numpy(targets_test).long() batch_size = 100 #We pick beforehand a batch_size that we will use for the training # Pytorch train and test setstrain = torch.utils.data.TensorDataset(train_x,train_y)test = torch.utils.data.TensorDataset(test_x,test_y) # data loadertrain_loader = torch.utils.data.DataLoader(train, batch_size = batch_size, shuffle = False)test_loader = torch.utils.data.DataLoader(test, batch_size = batch_size, shuffle = False)

對於模型,這裡是我們將使用的架構

2套ConvMake:

· 兩個集合的過濾器大小為(3x3x3),步幅為(1x1x1)的3d卷積層

· 洩漏的Relu激活功能

· 具有濾鏡大小(2x2x2)和跨度(2x2x2)的3d MaxPool層

2個FC層,分別具有512128個節點。

在第一個FC層之後有一個Dropout層。

然後將模型通過以下方式轉換為代碼:

num_classes = 10 # Create CNN Modelclass CNNModel(nn.Module): def __init__(self): super(CNNModel, self).__init__() self.conv_layer1 = self._conv_layer_set(3, 32) self.conv_layer2 = self._conv_layer_set(32, 64) self.fc1 = nn.Linear(2**3*64, 128) self.fc2 = nn.Linear(128, num_classes) self.relu = nn.LeakyReLU() self.batch=nn.BatchNorm1d(128) self.drop=nn.Dropout(p=0.15) def _conv_layer_set(self, in_c, out_c): conv_layer = nn.Sequential( nn.Conv3d(in_c, out_c, kernel_size=(3, 3, 3), padding=0), nn.LeakyReLU(), nn.MaxPool3d((2, 2, 2)), ) return conv_layer def forward(self, x): # Set 1 out = self.conv_layer1(x) out = self.conv_layer2(out) out = out.view(out.size(0), -1) out = self.fc1(out) out = self.relu(out) out = self.batch(out) out = self.drop(out) out = self.fc2(out) return out #Definition of hyperparametersn_iters = 4500num_epochs = n_iters / (len(train_x) / batch_size)num_epochs = int(num_epochs) # Create CNNmodel = CNNModel()#model.cuda()print(model) # Cross Entropy Losserror = nn.CrossEntropyLoss() # SGD Optimizerlearning_rate = 0.001optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

在參數方面,請注意第一個完全卷積層上的輸入節點數。我們的數據集的形狀為(16,16,16,3),這就是我們獲得大小為(2x2x2)的濾波輸出的方式。

以下是訓練代碼。可以通過將優化器更改為Adam來進行優化,調整學習速度(有一定的動力)等等。

# CNN model trainingcount = 0loss_list = []iteration_list = []accuracy_list = []for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): train = Variable(images.view(100,3,16,16,16)) labels = Variable(labels) # Clear gradients optimizer.zero_grad() # Forward propagation outputs = model(train) # Calculate softmax and ross entropy loss loss = error(outputs, labels) # Calculating gradients loss.backward() # Update parameters optimizer.step() count += 1 if count % 50 == 0: # Calculate Accuracy correct = 0 total = 0 # Iterate through test dataset for images, labels in test_loader: test = Variable(images.view(100,3,16,16,16)) # Forward propagation outputs = model(test) # Get predictions from the maximum value predicted = torch.max(outputs.data, 1)[1] # Total number of labels total += len(labels) correct += (predicted == labels).sum() accuracy = 100 * correct / float(total) # store loss and iteration loss_list.append(loss.data) iteration_list.append(count) accuracy_list.append(accuracy) if count % 500 == 0: # Print Loss print('Iteration: {} Loss: {} Accuracy: {} %'.format(count, loss.data, accuracy))

經過少量樣本培訓,我們得到了以下準確性和損失。

3D CNN的應用場景

IRM數據處理及其推斷自動駕駛距離估算

相關焦點

  • 給卷積神經網絡動動刀:加法網絡探究
    卷積神經網絡(CNN)在計算機視覺任務中有著廣泛的應用,然而它的運算量非常巨大,這使得我們很難將CNN直接運用到計算資源受限的行動裝置上。為了減少CNN的計算代價,許多模型壓縮和加速的方法被提出。AdderNet的訓練代碼主要分為幾個文件:adder.pymain.pyresnet20.pyresnet50.pytest.py其中adder.py定義了AdderNet的基礎算子,main.py是訓練AdderNet的文件,test.py是測試文件,resnet20.py和resnet50.py定義了網絡結構
  • 福利,PyTorch中文版官方教程來了
    近日,一款完整的 PyTorch 中文版官方教程出爐,讀者朋友可以更好的學習了解 PyTorch 的相關細節了。教程作者來自 pytorchchina.com。教程網站:http://pytorch123.com教程裡有什麼教程根據 PyTorch 官方版本目錄,完整地還原了所有的內容。包括簡單的環境搭建、快速入門相關 API、高級操作、圖像處理實戰、文本處理實戰、GAN 和強化學習等,基本涵蓋了目前所有深度學習相關的知識點。
  • 深度學習入門教程:手把手帶你用Numpy實現卷積神經網絡(一)
    本教程由深度學習中文社區(Studydl.com)持續發布與更新, 教程中完整代碼已上傳至github上, 可關注我百家號後發送消息"CNN代碼", 獲得地址.前言Numpy是一個非常好用的python科學計算的庫,CNN是現在視覺領域深度學習的基礎之一。
  • 《PyTorch中文手冊》來了
    本書提供PyTorch快速入門指南並與最新版本保持一致,其中包含的 Pytorch 教程全部通過測試保證可以成功運行。PyTorch 是一個深度學習框架,旨在實現簡單靈活的實驗。這是一本開源的書籍,目標是幫助那些希望和使用 PyTorch 進行深度學習開發和研究的朋友快速入門,其中包含的 Pytorch 教程全部通過測試保證可以成功運行。
  • 了解1D和3D卷積神經網絡|Keras
    當我們說卷積神經網絡(CNN)時,通常是指用於圖像分類的2維CNN。但是,現實世界中還使用了其他兩種類型的卷積神經網絡,即1維CNN和3維CNN。在本指南中,我們將介紹1D和3D CNN及其在現實世界中的應用。我假設你已經大體上熟悉卷積網絡的概念。
  • Pytorch 中文文檔和中文教程
    筆者獲得了ApacheCN社區的同意,放出該社區的翻譯文檔和官方教程,歡迎大家多去GitHub頁面 fork,star!簡單介紹GitHub項目管理:https://github.com/apachecn/pytorch-doc-zh
  • PyTorch可視化理解卷積神經網絡
    造就機器能夠獲得在這些視覺方面取得優異性能可能是源於一種特定類型的神經網絡——卷積神經網絡(CNN)。如果你是一個深度學習愛好者,你可能早已聽說過這種神經網絡,並且可能已經使用一些深度學習框架比如caffe、TensorFlow、pytorch實現了一些圖像分類器。然而,這仍然存在一個問題:數據是如何在人工神經網絡傳送以及計算機是如何從中學習的。
  • 孿生網絡如何識別面部相似度?這有篇PyTorch教程
    在前一篇文章中,我們討論了小樣本數據旨在解決的主要問題類別,以及孿生網絡之所以能夠成為解決這個問題優良選擇的原因。首先,我們來重溫一個特殊的損失函數,它能夠在數據對中計算兩個的圖像相似度。我們現在將在PyTorch中實施我們之前所討論的全部內容。
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    學習本教程之前,你需要很熟悉 Scikit-learn,Pandas,NumPy 和 SciPy。這些程序包是使用本教程的重要先決條件。教程大綱何為深度學習?Pytorch 簡介相較於其它 Python 深度學習庫,Pytorch 有何優勢?
  • PyTorch官方教程書限時免費!500頁內容帶你上手最流行框架
    這本書為使用 PyTorch 構建和訓練神經網絡提供了詳細且易於上手的教程,使用的程式語言為 Python。該書一改往日教程或教科書刻板的風格,書中隨處可見的插圖令人印象深刻,還包括大量手繪插圖。例如,下圖展示了 PyTorch 使用 autograd 進行計算時的模型前向圖和後向圖:而在介紹神經網絡的計算過程時,這本書不惜用公式 + 手繪流程圖 + 插圖的形式,力求將整個抽象過程進行簡潔地說明。此外,該書具備配套代碼,且書中案例和代碼塊隨處可見。
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    它主要由Facebookd的人工智慧小組開發,不僅能夠 實現強大的GPU加速,同時還支持動態神經網絡,這一點是現在很多主流框架如TensorFlow都不支持的。 PyTorch提供了兩個高級功能: 1.具有強大的GPU加速的張量計算(如Numpy) 2.包含自動求導系統的深度神經網絡 除了Facebook之外,Twitter、GMU和Salesforce等機構都採用了PyTorch。
  • Facebook 開源 3D 深度學習函數庫 PyTorch3D
    Facebook表示,之所以深度學習技術較少用於3D場景,是因為缺乏足夠的工具和資源來支撐神經網絡與3D數據結合使用的複雜性,這種場景要求更多的內存與更高的算力,不像2D圖像可以使用張量表示,而且許多傳統圖形運算符不可微分,因此3D深度學習技術的研究受到了限制。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    回想了一下自己關於 pytorch 的學習路線,一開始找的各種資料,寫下來都能跑,但是卻沒有給自己體會到學習的過程。有的教程一上來就是寫一個 cnn,雖然其實內容很簡單,但是直接上手容易讓人找不到重點,學的雲裡霧裡。有的教程又淺嘗輒止,師傅領到了門檻跟前,總感覺自己還沒有進門,教程就結束了。
  • 大話卷積神經網絡CNN,小白也能看懂的深度學習算法教程,全程乾貨...
    來源 | 程式設計師管小亮本文創作的主要目的,是對時下最火最流行的深度學習算法的基礎知識做一個簡介,作者看過許多教程,感覺對小白不是特別友好,尤其是在踩過好多坑之後,於是便有了寫這篇文章的想法。如下圖所示:重點來了,什麼是卷積神經網絡?
  • 一行代碼安裝,TPU也能運行PyTorch,修改少量代碼即可快速移植
    pip install pytorch-lightning該項目的開發者William Falcon說,PyTorch Lightning是他在紐約大學和FAIR做博士生時研發,專門為從事AI研究的專業研究人員和博士生創建的。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    官網:http://pytorch.orgGitHub:https://github.com/pytorch/pytorchPyTorch 是一個 Python 軟體包,其提供了兩種高層面的功能:使用強大的 GPU 加速的 Tensor 計算(類似 numpy)構建於基於 tape 的 autograd 系統的深度神經網絡如有需要,你也可以復用你最喜歡的
  • 9大主題卷積神經網絡(CNN)的PyTorch實現
    上文聚焦於源碼和論文,對於各種卷積神經網絡模型的實現,本文將介紹它們的 PyTorch 實現,非常有用!這份資源已經開源在了 GitHub 上,連結如下:https://github.com/shanglianlm0525/PyTorch-Networks先來個總結介紹,該系列的卷積神經網絡實現包含了 9 大主題,目錄如下:1. 典型網絡2. 輕量級網絡3. 目標檢測網絡4.
  • 華為雲應用編排,手把手教您完成pytorch代碼部署
    本文將以一個使用了pytorch的demo代碼pytorch-classify為例,通過華為雲上的容器服務一鍵式部署, 5 分鐘完成免費的雲上pytorch代碼的部署。傳統部署方式首先是準備環境。先有個伺服器,這臺伺服器需要能夠被外部訪問。
  • 使用Keras構建具有自定義結構和層次圖卷積神經網絡
    來源:DeepHub IMBA本文約3600字,建議閱讀5分鐘本文為你介紹了如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)。如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)在生活中的某個時刻我們會發現,在Tensorflow Keras中預先定義的層已經不夠了!我們想要更多的層!我們想要建立一個具有創造性結構的自定義神經網絡!幸運的是,通過定義自定義層和模型,我們可以在Keras中輕鬆地執行此任務。
  • 大家心心念念的PyTorch Windows官方支持來了
    GitHub 發布地址:https://github.com/pytorch/pytorch/releasesPyTorch 官網:http://pytorch.org/在沒有官方支持前,Windows 上安裝 PyTorch 需要藉助其它開發者發布的第三方 conda 包,而現在我們可以直接在 PyTorch 首頁上獲取使用 conda 或 pip 安裝的命令行,或跟隨教程使用源文件安裝。