1. 程式人生 > 其它 >卷積、池化、BN及Dropout解讀

卷積、池化、BN及Dropout解讀

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