卷積、池化、BN及Dropout解讀
阿新 • • 發佈:2021-10-03
nn.Conv2d() & nn.Max_pool2d() & nn.BatchNorm2d()& nn.Dropout2d()
nn.Conv2d():
一個二維卷積層的輸入張量為($N, C_{in}, H, W$),輸出為 ($N, C_{out}, H, W$),分別為:批資料量、通道數、圖片高、圖片寬
torch.nn.Conv2d( in_channels, # 輸入的通道數目 【必填】 out_channels, # 輸出的通道數目,也是卷積操作中卷積核 filter 的數量 【必填】 kernel_size, # 卷積核的大小,當卷積是方形的時候,只需要一個整數邊長即可,不是方形,要輸入一個元組表示高和寬。【必填】 stride=1, # 卷積每次滑動的步長為多少,預設是 1 padding=0, # 填充操作,控制 padding_mode 的數目。預設的話就是在 feature map 外圍增加 n 圈0 dilation=1, # 控制卷積核之間的間距,即卷積核在feature map上 插空 進行畫素抽取 groups=1, # 將輸入和輸出分為多少組,組之間各自進行運算 bias=True, # 後接BN則不需要bias,bias = False padding_mode=‘zeros’) # padding 模式,預設為 填充 0 。
注:我們在使用 nn.Conv()
的過程中,只定義卷積的數目及大小,並不定義卷積核裡面的引數,一開始是隨機數,它本身是需要訓練的權重值。它會隨著網路的訓練,逐漸發生變化,最後生成固定的權重值。
nn.Max_pool2d():
torch.nn.MaxPool2d( kernel_size, # 表示做最大池化的視窗大小,可以是單個值,也可以是tuple元組 【必填】 stride=None, # 步長,可以是單個值,也可以是tuple元組 padding=0, # 填充,可以是單個值,也可以是tuple元組 dilation=1, # 控制視窗中元素步幅 return_indices=False, # 布林型別,返回最大值位置索引(有啥用,不太瞭解) ceil_mode=False) # 計算輸出形狀,預設是向下取整,為True,用向上取整的方法
nn.max_pool2d()與F.max_pool2d()間的差異:
本質上是相同的,不同之處在於 torch.nn.MaxPool2d
是一個顯式的 nn.Module
,它呼叫 torch.nn.functional.max_pool2d()
來定義它自己的 forward()
方法。
def forward(self, input): return F.max_pool2d(input, self.kernel_size, self.stride, self.padding, self.dilation, self.ceil_mode, self.return_indices)
nn.BatchNorm2d():
正則化公式:
$$
y=\frac{x-\mathrm{E}[x]}{\sqrt{\operatorname{Var}[x]+\epsilon}} * \gamma+\beta
$$
torch.nn.BatchNorm2d(
num_features, # 通道 channel 數 【必填】
eps=1e-05, # 為分數值穩定而新增到分母的值。 預設值:1e-5
momentum=0.1, # 一個用於執行過程中均值和方差的一個估計引數。
affine=True, # 此模組具有可學習的仿射引數。γ(gamma) 和 β(beta) (可學習的仿射變換引數) 預設值:True
track_running_stats=True, # 當設定為True時,此模組跟蹤執行平均值和方差;設定為False時,此模組不跟蹤此類統計資訊,並將統計資訊緩衝區running_mean和running_var初始化為None。
device=None, # 沒找到定義?
dtype=None) # 沒找到定義?
注:Batch Normalization 強行將資料拉回到均值為0,方差為1的正態分佈上,一方面使得資料分佈一致,另一方面避免梯度消失。
nn.Dropout2d():
torch.nn.Dropout2d(
p=0.5, # 元素歸零的概率【必填】
inplace=False) # 如果設定為 True ,將對 tensor 執行歸零操作,而預設值不會修改tensor