優達學城深度學習之七——TensorFlow卷積神經網絡
一、膠囊網絡
池化運算會丟失一些圖像信息。這是因為為了獲得更小的特征級圖像表示,池化會丟棄像素信息。與池化層相比,有一些分類方法不會丟棄空間信息,而是學習各個部分之間的關系(例如眼睛、鼻子和嘴之間的空間關系)。
學習各部分之間的空間關系的一種方法就叫膠囊網絡。
膠囊網絡能夠從圖像中檢測出對象的各個部分,并表示這些部分之間的空間關系。如果對象(例如人臉)具有不同的形態和典型數量的特征(眼睛、鼻子、嘴),膠囊網絡便能夠識別同一對象,即使沒有在訓練數據里見過這些形態。
膠囊網絡由父節點和子節點組成,這些節點構成了對象的完整樣貌。
在上述示例中,模型能夠識別葉節點中的人臉部分(眼睛、鼻子、嘴等),然后在父節點中形成更完整的人臉部分。
什么是膠囊
膠囊實際上是節點集合,每個節點都包含關于特定部分的信息,例如寬度、方向、顏色等特性。注意,每個膠囊都輸出一個向量,該向量由大小和方向組成。
大小 (m) = 某個部分存在的概率;值在 0 到 1 之間。
方向 (theta) = 某個部分的狀態。
我們可以對這些輸出向量執行數學運算并構建一個解析樹,最終識別出由多個小部分組成的完整對象。
大小是一個特殊的屬性,即使對象朝著不同的方向,大小也應該很大,如下圖所示。
增加深度
pytorch層級
卷積層,通常我們在PyTorch 中使用?nn.Conv2d?定義卷積層,并指定以下參數:
nn.conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0)
in_channels 是指輸入深度。對于灰階圖像來說,深度 = 1
out_channels 是指輸出深度,或你希望獲得的過濾圖像數量
kernel_size 是卷積核的大小(通常為 3,表示 3x3 核)
stride 和 padding 具有默認值,但是應該根據你希望輸出在空間維度 x, y 里具有的大小設置它們的值
pytorch中的卷積層
要在 PyTorch 中創建卷積層,必須首先導入必要的模塊:
import torch.nn as nn
然后定義卷積層和模型的前饋行為(輸入如何經過網絡層級)。首先必須定義一個 Model 類并填寫兩個函數。
你可以通過以下格式在?__init__?函數里定義卷積層:
self.conv1=nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0))
forward
然后在 forward 函數里引用該層級!在此例中,我傳入了輸入圖像?x,并向此層的輸出應用了 ReLU 函數。
x=F.relu(self.conv1(x))
參數
必須傳遞以下參數:
in_channels?- 輸入數量(深度),例如 RGB 圖像是 3。
out_channels?- 輸出通道的數量,即卷積層包含的過濾“圖像”數量,或者將應用到輸入上的唯一卷積核數量。
kernel_size?- 表示(方形)卷積核的高度和寬度。
你還可以調整其他可選參數:
stride?- 卷積步長。如果不指定任何值,stride?將設為?1。
padding?- 輸入數組周圍的 0 邊。如果不指定任何值,padding?將設為?0。
注意:可以將?kernel_size?和?stride?表示為數字或元組。
你還可以設置很多其他可調參數,從而更改卷積層的行為。要了解詳情,請參閱此官方文檔。
池化層
池化層的參數是核大小和步長。通常和下采樣因子的值一樣。例如,以下代碼將使輸入的 x-y 維度下采樣到一半大小:
self.pool=nn.MaxPool2d(2,2)
以下代碼將池化層應用到了 forward 函數。
x=F.relu(self.conv1(x))
x=self.pool(x)
卷積示例 1
假設我要構建一個 CNN,輸入層接受的是 200 x 200 像素(對應于高 200、寬 200、深 1 的三維數組)的灰階圖像。然后,假設下一層是一個卷積層,包含 16 個過濾器,每個過濾器的寬和高都是 2。在進行卷積運算時,我希望過濾器一次跳過 2 個像素。但是我不希望過濾器越過圖像邊界;換句話說,我不想用 0 填充圖像。要構建此卷積層,我會使用以下代碼:
self.conv1=nn.Conv2d(1,16,2,stride=2)
序列模型
我們還可以在?__init__?函數里使用?Sequential?封裝容器,這樣就能在 PyTorch 中創建 CNN 模型。序列模型使我們能夠堆疊不同的層級,并在層級之間指定激活函數。
def __init__(self):
super(ModelName, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 16, 2, stride=2),
nn.MaxPool2d(2, 2),
nn.ReLU(True),
nn.Conv2d(16, 32, 3, padding=1),
nn.MaxPool2d(2, 2),
nn.ReLU(True)
TensorFlow 神經網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。