點擊上方“AI算法與圖像處理”,選擇加"星標"或“置頂”
重磅乾貨,第一時間送達
文 |AI_study
在上一篇文章中,我們通過擴展PyTorch神經網絡模塊類並定義一些層作爲類屬性來開始構建CNN。通過在構造函數中指定它們,我們定義了兩個卷積層和三個線性層。
面向對象編程的方式搭建CNN網絡 | PyTorch系列(十三)
class Network(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)
self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)
def forward(self, t):
# implement the forward pass
return t
我們的每一層都擴展了PyTorch的神經網絡Module 類。對於每一層,內部封裝了兩個主要項目,即forward函數定義和權重張量。
每層內部的權重張量包含隨着網絡在訓練過程中學習而更新的權重值,這就是我們將各層指定爲Network類中的屬性的原因。
PyTorch的神經網絡Module 類跟蹤每層內部的權重張量。進行此跟蹤的代碼位於nn.Module類內部,並且由於我們正在擴展神經網絡模塊類,因此我們會自動繼承此功能。
請記住,繼承是我們上次討論的那些面向對象的概念之一。爲了利用此功能,我們要做的就是在網絡模塊中將各層分配爲屬性,而Module基類將看到這一點並將權重作爲網絡的可學習參數。
CNN層參數
我們在這篇文章中的目標是更好地瞭解我們已定義的層。爲此,我們將學習有關參數以及在層構造函數中爲這些參數傳遞的值。
一、Parameter Vs Argument
首先,讓我們澄清一些與參數有關的術語。我們經常聽到 parameter 和 argument,這兩個詞,但是兩者之間有什麼區別?
parameters將在函數定義中用作佔位符,而arguments 是傳遞給函數的實際值。可以將parameters 視爲函數內部的局部變量。
在我們的網絡中,名稱是 parameters 數,而我們指定的值是arguments。
二、Two Types Of Parameters
爲了更好地理解這些parameters的參數值,讓我們考慮在構造層時使用的兩種類型的參數。
超參數(Hyperparameters)
數據相關的超參數(Data dependent hyperparameters)
深度學習中的許多術語是寬鬆使用的,單詞 parameter 就是其中之一。儘量不要讓它通過你。關於任何類型的參數要記住的主要事情是,該參數是一個佔位符,它將最終保存或具有一個值。
這些特定類別的目的是幫助我們記住如何確定每個參數的值。
構造層時,我們將每個參數的值傳遞給層的構造函數。對於我們的卷積層,有三個參數,線性層有兩個參數。
卷積層
in_channels
out_channels
kernel_size
線性層
in_features
out_features
讓我們看看如何確定參數的值。我們將從查看超參數開始,然後,我們將瞭解相關超參數如何落入適當位置。
(1)Hyperparameters
通常,超參數是手動和任意選擇其值的參數。
作爲神經網絡程序員,我們選擇超參數值主要是基於嘗試和錯誤,並越來越多地使用過去已經證明有效的值。對於構建CNN層,這些是我們手動選擇的參數。
kernel_size
out_channels
out_features
這意味着我們只需爲這些參數選擇值。在神經網絡編程中,這是很常見的,我們通常測試和調整這些參數,以找到工作得最好的值。
Parameter | Description |
kernel_size | Sets the filter size. The words kernel and filter are interchangeable.(設置filter 大小。kernel和filter這兩個詞是可以互換的。) |
out_channels | Sets the number of filters. One filter produces one output channel.(設置filter的數量。一個filter產生一個輸出通道。) |
out_features | Sets the size of the output tensor.(設置輸出張量的大小。) |
在經常出現的模式中,我們在添加額外的conv層時增加out_channels,在切換到線性層之後,在過濾到輸出類的數量時縮小out_features。
所有這些參數都會影響我們的網絡架構。具體來說,這些參數直接影響層內的權值張量。在下一篇文章中,當我們討論可學習參數並檢查權重張量時,我們將對此進行更深入的討論,但是現在,讓我們討論依賴超參數。
(2)Data Dependent Hyperparameters
數據相關超參數是其值依賴於數據的參數。突出的前兩個數據相關超參數是第一個卷積層的in_channels和輸出層的out_features。
你看,第一個convolutional layer的in_channels取決於訓練集中圖像中出現的彩色通道的數量。因爲我們處理的是灰度圖像,所以我們知道這個值應該是 1.
輸出層的out_features取決於訓練集中的類的數量。因爲Fashion-MNIST數據集中有10個服裝類,所以我們知道我們需要10個輸出特性。
通常,一層的輸入是上一層的輸出,所以conv層中的所有in_channels和線性層中的in_features都依賴於上一層的數據。
當我們從一個conv層轉換到一個線性層時,我們必須使我們的張量變平。這就是爲什麼我們有12 * 4 * 4。12是前一層輸出通道的數量,爲什麼我們有兩個4 呢?我們將在以後的文章中討論如何獲得這些值。
層參數彙總
我們將更多地瞭解網絡的內部工作方式,以及在實現forward() 函數時張量是如何流經網絡的。現在,一定要查看這個描述每個參數的表,以確保您能夠理解每個參數值是如何確定的。
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)
self.fc1 = nn.Linear(in_features=12 * 4 * 4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)
總結
在下一篇文章中,我們將開始瞭解可學習參數,這些參數的值是在訓練過程中學習的。
文章中內容都是經過仔細研究的,本人水平有限,翻譯無法做到完美,但是真的是費了很大功夫,希望小夥伴能動動你性感的小手,分享朋友圈或點個“在看”,支持一下我 ^_^
英文原文鏈接是:
https://deeplizard.com/learn/video/IKOHHItzukk
加羣交流
歡迎小夥伴加羣交流,目前已有交流羣的方向包括:AI學習交流羣,目標檢測,秋招互助,資料下載等等;加羣可掃描並回復感興趣方向即可(註明:地區+學校/企業+研究方向+暱稱)
謝謝你看到這裏! ????