天天看點

Pytorch系列:(五)CNN

目錄

    • 卷積
      • Conv2d
      • Conv1d
      • 轉置卷積
    • 池化函數
      • nn.MaxPool2d
      • nn.AvgPool2d
      • nn.MaxUnpool2d

卷積

Conv2d

2D卷積函數和參數如下

nn.Conv2d(
    in_channels,
    out_channels,
    kernel_size,
    stride=1,
    padding=0,
    dilation=1,
    groups=1,
    bias=True,
    padding_mode='zeros'
)  
           

參數說明:

in_channels

: 輸入通道數,RGB圖檔一般是3

out_channels

: 輸出通道,也可以了解為kernel的數量

kernel_size:kernel

的和寬設定

kernel 輸出尺寸計算:

⌊ ( n h − k h + p h ) / s h + 1 ⌋ ∗ ⌊ ( n w − k w + p w ) / s w + 1 ⌋ \lfloor(n_h -k_h+p_h)/s_h+1\rfloor *\lfloor(n_w -k_w+p_w)/s_w+1\rfloor ⌊(nh​−kh​+ph​)/sh​+1⌋∗⌊(nw​−kw​+pw​)/sw​+1⌋

stride

:kernel移動的步伐

padding

:在四周加入padding的數量,預設補0

dilation

:

空洞就是計算的時候,對輸入層進行挖空操作,如下圖所示(圖檔來源于網絡)

Pytorch系列:(五)CNN

group

分組計算,輸出的feature map數量還是一樣,隻不過,每一個輸出feature map 并不是用所有的輸入feature map 計算的,而是分組計算,這樣可以并行化并且減少計算成本。

假設輸入為12個feature map , 輸出為6個通道,正常卷積Conv參數 6 ∗ 12 ∗ k 2 6*12*k^2 6∗12∗k2,但是假設goup=3,那麼參數為 3個 2 ∗ 4 ∗ k 2 2*4*k^2 2∗4∗k2,這是因為計算的時候,輸入的feature map 和 計算的kernel 都要分成3組(如下圖所示,圖檔來源網絡)。

Pytorch系列:(五)CNN

bias

: 如果bias=True,添加偏置

Conv1d

一維卷積的特點是,卷積核有一個次元和特征的次元是保持一緻的,卷積核的另外一個次元是作用在sequenc length上面。

Conv1d(
    in_channels, 
    out_channels, 
    kernel_size, 
    stride=1, 
    padding=0, 
    dilation=1, 
    groups=1, 
    bias=True
)
           

in_channels

: – 輸入信号的通道。即為詞向量的次元。2維RGB圖像卷積中,為3, 一般用在序列模型中,例如一句話中的單詞表征為300,那麼輸入就設定為300

out_channels

: 輸出多少個channel

kernel_size

:設定卷積尺寸,其中一個次元為in_channels,是以實際上卷積大小為kernel_size*in_channels

stride

:卷積步長,作用在sequence len上面

padding

:在序列兩邊補0

dilation

:卷積核元素之間的間距,同上面conv2d

groups

: 同上面conv2d

bias

: 如果bias=True,添加偏置

尺寸計算方法

假設輸入尺寸為 (batch, sequence len, feature_len) 需要将次元轉換為( batch , feature_len, sequence len),卷積核的尺寸為(feature_len, kernel_size) , 輸出為( batch, kernel_size, Lout) ,其中Lout的計算方法如下:

L o u t = ⌊ ( f e a t u r e _ l e n − k h + p h ) / s h + 1 ⌋ L_{out} = \lfloor(feature\_len -k_h+p_h)/s_h+1\rfloor Lout​=⌊(feature_len−kh​+ph​)/sh​+1⌋

轉置卷積

反卷積(轉置卷積)和正常卷積相反,具有尺寸擴張作用,也可以了解為帶參數學習的上采樣功能,主要可以用到GAN中的。

轉置卷積的操作如下圖所示:

相當于将被卷積的2*2 feature map進行padding,之後再做卷積操作。

設卷積核大小為k*k,輸入為方形矩陣

  1. 對輸入進行四邊補零,單邊補零的數量為k-1
  2. 将卷積核旋轉180°,在新的輸入上進行直接卷積 (上下翻轉,左右翻轉)
    Pytorch系列:(五)CNN
Pytorch系列:(五)CNN

在pytorch中轉置卷積函數如下,其中參數和傳統卷積基本一緻

nn.ConvTranspose2d(
  in_channels,
  out_channels,
  kernel_size,
  stride=1,
  padding=0,
  output_padding=0,
  groups=1,
  bias=True,
  dilation=1,
  padding_mode='zeros'
) 
           

尺寸計算方法

簡化版

o u t = ( i n _ c h a n n e l − 1 ) ∗ s t r i d e + k e r n e l _ s i z e out = (in\_{channel}-1) * stride + kernel\_size out=(in_channel−1)∗stride+kernel_size

完整版

o u t = ( i n _ c h a n n e l − 1 ) ∗ s t r i d e − 2 ∗ p a d d i n g s i z e + d i l a t i o n ∗ ( k e r n e l _ s i z e − 1 ) + o u t p u t _ p a d d i n g + 1 out = (in\_{channel}-1) * stride -2*padding_size + dilation * (kernel\_size-1)+output\_padding +1 out=(in_channel−1)∗stride−2∗paddings​ize+dilation∗(kernel_size−1)+output_padding+1

推薦一個細緻講解轉置卷積的文章:https://blog.csdn.net/tsyccnh/article/details/87357447

池化函數

nn.MaxPool2d

nn.MaxPool2d(
  kernel_size,
  stride=None,
  padding=0,
  dilation=1,
  return_indices=False,
  ceil_mode=False
) 
           

其中,

return_indices: 可以傳回池化的位置,主要用于自編碼其中池化上采樣(最大池化)

ceil_mode: 表示尺寸向上取整,主要用于kernel_size無法被長寬整除的時候。

其他參數和上述卷積參數含義一樣。

主要功能是進行特征縮減,同時保留最大資訊,2*2的MaxPoold執行操作如下圖所示(來源于cs231n )

Pytorch系列:(五)CNN

pytorch中的pooling函數,預設kernel size和stride是一樣的

pool2d = nn.MaxPool2d(3)  # 這裡省略stride設定 pool2d(X)


# 也可以手動設定更詳細的:

pool2d = nn.MaxPool2d(3, padding=1, stride=2)
           

nn.AvgPool2d

nn.AvgPool2d(
  kernel_size,
  stride=None,
  padding=0,
  ceil_mode=False,
  count_include_pad=True,
  divisor_override=None
) 
           

其中:

count_include_pad:求平均值的時候,是否考慮将padding加入計算,divisor_override:可以設定分母,例如2*2均值就是除以4,但是我們可以設定其他值

其他參數和上述nn.MaxPool2d含義一樣

主要操作和nn.MaxPool2d一樣,不同的是,這裡做的是求平均操作。

nn.MaxUnpool2d

反池化操作,就是池化的反向操作,具體如下圖所示(圖檔來源網絡):

Pytorch系列:(五)CNN
nn.MaxUnpool2d(
  kernel_size,
  stride=None,
  padding=0
) 
           

一個例子,首先使用MaxPool2d采樣,然後保留采樣位置,最後使用采樣位置indices來進行反池化操作。

img = torch.randn((28,28))
max_pool_l = nn.MaxPool2d((2,2),stride=(2,2),return_indices=True) 
img_pool,indices = max_pool_l(img) 


maxUpPool_l = nn.MaxUnpooled((2,2),stride=(2,2))
img_Up = maxUpPool_l(input_i , indices)  
           

繼續閱讀