1、卷積層
1.1 Convolution
1.1.1 卷積操作
- 卷積運算:卷積核在輸入信號(圖像)上滑動,相應位置上進行乘加
- 卷積核:又稱為濾波器、過濾器,可認為是某種模式、某種特征
1.1.2 卷積維度
一般情況下,卷積核在幾個維度上滑動就是幾維卷積
- 一維卷積
- 二維卷積
- 三維卷積
1.2 nn.Conv2d
# nn.Conv2d(
# in_channels,
# out_channels,
# kernel_size,
# stride=1,
# padding=0,
# dilation=1,
# groups=1,
# bias=True,
# padding_mode='zeros'
# )
1.2.1 基本介紹
功能:對多個二維信號進行二維卷積
主要參數:
in_channels
:輸入通道數out_channels
:輸出通道數,等價于卷積核個數kernel_size
:卷積核尺寸stride
:步長padding
:填充個數dilation
:空洞卷積大小groups
:分組卷積設置,默認為1,即不分組bias
:是否使用偏置
尺寸計算:
H o u t = ? H i n + 2 × p a d d i n g [ 0 ] ? d i l a t i o n [ 0 ] × ( k e r n e l _ s i z e [ 0 ] ? 1 ) ? 1 s t r i d e [ 0 ] + 1 ? H_{out} = \lfloor \frac{H_{in} + 2 \times padding[0] - dilation[0] \times (kernel\_size[0] - 1) - 1}{stride[0]} + 1 \rfloor Hout?=?stride[0]Hin?+2×padding[0]?dilation[0]×(kernel_size[0]?1)?1?+1?
1.2.2 代碼框架
conv_layer = nn.Conv2d(3, 1, 3) # input:(i, o, size) weights:(o, i , h, w)nn.init.xavier_normal_(conv_layer.weight.data)img_conv = conv_layer(img_tensor)
1.3 nn.ConvTranspose
# nn.ConvTranspose(
# in_channels,
# out_channels,
# kernel_size,
# stride=1,
# padding=0,
# output_padding=0,
# groups=1,
# bias=True,
# dilation=1,
# padding_mode='zeros'
# )
1.3.1 基本介紹
功能:用于對圖像進行上采樣
對比:
- 正常卷積:假設圖像尺寸為4×4,卷積核為3×3,padding=0,stride=1,
則圖像: I 16 ? 1 I_{16*1} I16?1?,卷積核: K 4 ? 16 K_{4*16} K4?16?,輸出: O 4 ? 1 = K 4 ? 16 × I 16 ? 1 O_{4*1}=K_{4*16}×I_{16*1} O4?1?=K4?16?×I16?1? - 轉置卷積:假設圖像尺寸為2×2,卷積核為3×3,padding=0,stride=1,
則圖像: I 4 ? 1 I_{4*1} I4?1?,卷積核: K 16 ? 4 K_{16*4} K16?4?,輸出: O 16 ? 1 = K 16 ? 4 × I 4 ? 1 O_{16*1}=K_{16*4}×I_{4*1} O16?1?=K16?4?×I4?1?
主要參數:
in_channels
:輸入通道數out_channels
:輸出通道數kernel_size
:卷積核大小stride
:步長padding
:填充dilation
:空洞卷積大小groups
:分組卷積bias
:是否使用偏置
尺寸計算: H o u t = ( H i n ? 1 ) × s t r i d e [ 0 ] ? 2 × p a d d i n g [ 0 ] + d i l a t i o n [ 0 ] × ( k e r n e l _ s i z e [ 0 ] ? 1 ) + o u t p u t _ p a d d i n g [ 0 ] + 1 H_{out} = (H_{in} - 1) \times stride[0] - 2 \times padding[0] + dilation[0] \times (kernel\_size[0] - 1) + output\_padding[0] + 1 Hout?=(Hin??1)×stride[0]?2×padding[0]+dilation[0]×(kernel_size[0]?1)+output_padding[0]+1
1.3.2 代碼框架
conv_layer = nn.ConvTranspose2d(3, 1, 3, stride=2) # input:(i, o, size)nn.init.xavier_normal_(conv_layer.weight.data)img_conv = conv_layer(img_tensor)
2、池化層
2.1 概念
對信息進行收集并總結,類似水池收集水資源,因而得名池化層
- 收集:多變少
- 總結:最大值/平均值
2.2 nn.MaxPool2d
# nn.MaxPool2d(
# kernel_size,
# stride=None,
# padding=0,
# dilation=1,
# return_indices=False,
# ceil_mode=False,
# )
2.2.1 基本介紹
功能:對二維信號(圖像)進行最大值池化
主要參數:
kernel_size
:池化核大小stride
:步長padding
:填充dilation
:池化核間隔大小return_indices
:是否返回最大值索引ceil_mode
:是否向上取整
2.2.2 代碼框架
MaxPool2d
maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2)) # input:(i, o, size) weights:(o, i , h, w)img_pool = maxpool_layer(img_tensor)
MaxPool2d
unpool
# poolingimg_tensor = torch.randint(high=5, size=(1, 1, 4, 4), dtype=torch.float)maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2), return_indices=True)img_pool, indices = maxpool_layer(img_tensor)# unpoolingimg_reconstruct = torch.randn_like(img_pool, dtype=torch.float)maxunpool_layer = nn.MaxUnpool2d((2, 2), stride=(2, 2))img_unpool = maxunpool_layer(img_reconstruct, indices)
2.3 nn.AvgPool2d
# nn.AvgPool2d(
# kernel_size,
# stride=None,
# padding=0,
# ceil_mode=False,
# count_include_pad=True,
# divisor_override=None
# )
2.3.1 基本介紹
功能:對二維信號(圖像)進行平均值池化
主要參數:
kernel_size
:池化核大小stride
:步長padding
:填充ceil_mode
:是否向上取整count_include_pad
:是否包含填充的像素divisor_override
:除數重寫
2.3.2 代碼框架
AvgPool2d
avgpoollayer = nn.AvgPool2d((2, 2), stride=(2, 2)) # input:(i, o, size) weights:(o, i , h, w)img_pool = avgpoollayer(img_tensor)
AvgPool2d
divisor_override
img_tensor = torch.ones((1, 1, 4, 4))avgpool_layer = nn.AvgPool2d((2, 2), stride=(2, 2), divisor_override=3)img_pool = avgpool_layer(img_tensor)
3、線性層
3.1 概念
又稱全連接層,其每個神經元與上一層所有神經元相連實現對前一層的線性組合、線性變換
3.2 nn.Linear
# nn.Linear(
# in_features,
# out_features,
# bias=True
# )
3.2.1 基本介紹
功能:對一維信號(向量)進行線性組合
主要參數:
in_features
:輸入結點數out_features
:輸出結點數bias
:是否使用偏置
計算公式: y = x W T + b i a s y = xW^T + bias y=xWT+bias
3.2.2 代碼框架
inputs = torch.tensor([[1., 2, 3]])linear_layer = nn.Linear(3, 4)linear_layer.weight.data = torch.tensor([[1., 1., 1.],[2., 2., 2.],[3., 3., 3.],[4., 4., 4.]])linear_layer.bias.data.fill_(0.5)output = linear_layer(inputs)
4、激活函數層
4.1 nn.Sigmoid
計算公式: y = 1 1 + e ? x y = \frac{1}{1 + e^{-x}} y=1+e?x1?
梯度公式: y ‘ = y × ( 1 ? y ) y^{`} = y \times (1 - y) y‘=y×(1?y)
特性:
- 輸出值在(0, 1),符合概率
- 導數范圍是[0, 0.25],易導致梯度消失
- 輸出為非0,破壞數據分布
4.2 nn.tanh
計算公式: y = s i n x c o s x = e x ? e ? x e ? + e ? x = 2 1 + e ? 2 x + 1 y = \frac{sinx}{cosx} = \frac{e^x - e^{-x}}{e^{-} + e^{-x}} = \frac{2}{1 + e^{-2x}} + 1 y=cosxsinx?=e?+e?xex?e?x?=1+e?2x2?+1
梯度公式: y ‘ = 1 ? y 2 y^{`} = 1 - y^2 y‘=1?y2
特性:
- 輸出值在(-1, 1),數據符合0均值
- 導數范圍是(0, 1),易導致梯度消失
4.3 nn.ReLU
計算公式: y = m a x ( 0 , x ) y = max(0, x) y=max(0,x)
梯度公式:
y ′ = { 1 , x > 0 undefined , x = 0 0 , x < 0 y' = \begin{cases} 1, & x > 0 \\ \text{undefined}, & x = 0 \\ 0, & x < 0 \end{cases} y′=? ? ??1,undefined,0,?x>0x=0x<0?
特性:
- 輸出值均為正數,負半軸導致死神經元
- 導數是1,緩解梯度消失,但易引發梯度爆炸
4.3.1 nn.LeakuReLU
negative_slope
: 負斜率的值,默認為0.01,即負斜率
4.3.2 nn.PReLU
init
:可學習斜率
4.3.3 nn.RReLU
lower
:均勻分布下限upper
:均勻分布上限
微語錄:黑暗中有人擎花而來,驚動火焰,燃燒萬千蝴蝶迷了眼。