1. 激活函數如何在兩個層之間作用
如果不在兩個層之間添加激活函數,模型將無法學習非線性關系,表現出像線性模型一樣的局限性。
LeakyReLU(0.2) 是一個激活函數,它的作用是對每一層的輸出進行非線性轉換。激活函數通常在神經網絡中用于增加網絡的非線性能力,使得網絡能夠擬合更復雜的函數。
- LeakyReLU 的定義
LeakyReLU 是一種變種的 ReLU 激活函數。與普通的 ReLU 激活函數不同,LeakyReLU 對負值部分并不會直接輸出 0,而是給負值部分留下一點點“泄漏”:
其中,α(通常為 0.01)是負半軸的斜率,LeakyReLU 通過給負值加上一個較小的斜率(通常是 0.01 或其他小值)來避免神經元完全“死亡”的問題(即神經元在訓練過程中因為權重更新過小導致輸出始終為零)。
在神經網絡中,LeakyReLU 會接收上一層的輸出并對其進行變換,從而得到下一層的輸入。
讓我們通過一個簡化的例子來說明如何將 LeakyReLU 用在網絡中。
model = []
model += block(nROI, int(nROI/2)) + block(int(nROI/2), int(nROI/4))
這里的 block 函數定義了一個標準的網絡塊,其中包含以下內容:
def block(in_layer, out_layer):layers = [nn.Linear(in_layer, out_layer, bias=False)]layers.append(nn.LeakyReLU(0.2, inplace=True))return layers
block函數的目的是將多個神經網絡層組合成一個模塊。這個模塊返回的是一個列表(layers),其中每個元素都是一個nn.Module對象。nn.Module是PyTorch中所有神經網絡層和功能模塊的基類,包括激活函數(如nn.ReLU、nn.Sigmoid等)。因此,block函數中的每個元素可以是一個神經網絡層,也可以是一個激活函數模塊。通過這種方式,block函數能夠靈活地組合不同的層和功能模塊,形成一個完整的神經網絡模塊。
假設我們調用了 block(8, 4) 和 block(4, 2)。這些 block 函數會返回一組層(包括線性層以及 LeakyReLU 激活函數)。
比如 block(8, 4)會得到:
[nn.Linear(8, 4, bias=False), nn.LeakyReLU(0.2)]
這個模塊先通過 nn.Linear(8, 4, bias=False) 將輸入的 8 維數據轉換為 4 維數據,然后將結果傳遞給 LeakyReLU(0.2) 激活函數,進行非線性變換。
假設輸入數據為 x = [2, -3, 1, 0.5, …],經過線性層后輸出為 4 維數據(假設輸出為 [1.0, -0.5, 3.2, 0.1])。然后,經過 LeakyReLU 變換:
1.0 → 1.0(因為大于 0)
-0.5 → -0.5 * 0.2 = -0.1(因為小于 0,乘以 0.2)
3.2 → 3.2(因為大于 0)
0.1 → 0.1(因為大于 0)
最終經過 LeakyReLU 處理后的輸出為:[1.0, -0.1, 3.2, 0.1]。
2 多個網絡層之間如何連接
網絡層是通過每個層的輸出作為下一個層的輸入來連接的。當一個神經網絡的層經過 LeakyReLU 激活后,其輸出成為下一層的輸入。
在你的代碼中,每個 block 函數會返回一個層列表,這些層會依次執行:
model += block(nROI, int(nROI/2)) + block(int(nROI/2), int(nROI/4))
假設輸入數據 x 的維度為 nROI=8,那么這個 block 會返回如下的網絡結構:
nn.Linear(8, 4):將輸入的 8 維數據映射到 4 維。
nn.LeakyReLU(0.2):對 4 維輸出應用 LeakyReLU 激活函數。
然后繼續使用另一個 block(4, 2):
nn.Linear(4, 2):將 4 維數據映射到 2 維。
nn.LeakyReLU(0.2):對 2 維輸出應用 LeakyReLU 激活函數。
block 函數的作用是將一些神經網絡層組合成一個列表。你將這些層組合起來,形成一個完整的神經網絡結構。通過 model +=,這些層會被加到 model 列表中,從而組成模型的一部分。