1. 程式人生 > >【小白學PyTorch】21 Keras的API詳解(下)池化、Normalization層

【小白學PyTorch】21 Keras的API詳解(下)池化、Normalization層

文章來自微信公眾號:【機器學習煉丹術】。作者WX:cyx645016617. 參考目錄: [toc] 下篇的內容中,主要講解這些內容: - 四個的池化層; - 兩個Normalization層; ## 1 池化層 和卷積層相對應,每一種池化層都有```1D,2D,3D```三種類型,這裡主要介紹2D處理影象的一個操作。1D和3D可以合理的類推。 ### 1.1 最大池化層 ```python tf.keras.layers.MaxPooling2D( pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs ) ``` **這個strides在預設的情況下就是步長為2** 下面看個例子: ```python import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.MaxPooling2D( pool_size=(2,2)) print(y(x).shape) >>> (4, 14, 14, 3) ``` 如果你把strides改成1: ```python import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.MaxPooling2D( pool_size=(2,2), strides = 1) print(y(x).shape) >>> (4, 27, 27, 3) ``` 如果再把padding改成```‘same’```: ```python import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.MaxPooling2D( pool_size=(2,2), strides = 1, padding='same') print(y(x).shape) >>> (4, 28, 28, 3) ``` 這個padding預設是```'valid'```,一般strides為2,padding是valid就行了。 ### 1.2 平均池化層 和上面的最大池化層同理,這裡就展示一個API就不再多說了。 ```python tf.keras.layers.AveragePooling2D( pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs ) ``` ### 1.3 全域性最大池化層 ```python tf.keras.layers.GlobalMaxPooling2D(data_format=None, **kwargs) ``` 這個其實相當於```pool_size```等於特徵圖尺寸的一個最大池化層。看一個例子: ```python import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.GlobalMaxPooling2D() print(y(x).shape) >>> (4, 3) ``` 可以看到,一個通道只會輸出一個值,因為我們的輸入特徵圖的尺寸是$28\times 28$,所以這裡的全域性最大池化層等價於```pool_size=28```的最大池化層。 ### 1.4 全域性平均池化層 與上面的全域性最大池化層等價。 ```python tf.keras.layers.GlobalAveragePooling2D(data_format=None, **kwargs) ``` ## 2 Normalization Keras官方只提供了兩種Normalization的方法,一個是BatchNormalization,一個是LayerNormalization。雖然沒有提供InstanceNormalization和GroupNormalization的方法,我們可以通過修改BN層的引數來構建。 ### 2.1 BN ```python tf.keras.layers.BatchNormalization( axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer="zeros", gamma_initializer="ones", moving_mean_initializer="zeros", moving_variance_initializer="ones", beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None, renorm=False, renorm_clipping=None, renorm_momentum=0.99, fused=None, trainable=True, virtual_batch_size=None, adjustment=None, name=None, **kwargs ) ``` 我們來詳細講解一下引數: - **axis**:整數。表示哪一個維度是通道數維度,預設是-1,表示是最後一個維度。如果之前設定了```channels_first```,那麼需要設定axis=1. - **momentum**:當training過程中,Batch的均值方差會根據batch計算出來,在預測或者驗證的時候,這個均值方差是採用training過程中計算出來的滑動均值和滑動方差的。具體的計算過程是: ![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6c24c63c680b4b8595953a883dd5a0db~tplv-k3u1fbpfcp-watermark.webp) - **epsilon**:一個防止運算除法除以0的一個極小數,一般不做修改; - **center**:True的話,則會有一個可訓練引數beta,也就是beta均值的這個offset;如果是False的話,這個BN層則退化成以0為均值,gamma為標準差的Normalization。預設是True,一般不做修改。 - **scale**:與center類似,預設是True。如果是False的話,則不使用gamma引數,BN層退化成以beta為均值,1為標準差的Normalization層。 - 其他都是初始化的方法和正則化的方法,一般不加以限制,使用的方法在上節課也已經講解了,在此不加贅述。 **這裡需要注意的一點是,keras的API中並沒有像PyTorch的API中的這個引數group,這樣的話,就無法衍生成GN和InstanceN層了,在之後的內容,會在Tensorflow_Addons庫中介紹** ### 2.2 LN ```python tf.keras.layers.LayerNormalization( axis=-1, epsilon=0.001, center=True, scale=True, beta_initializer="zeros", gamma_initializer="ones", beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None, trainable=True, name=None, **kwargs ) ``` 引數和BN的引數基本一致。直接看一個例子: ```python import tensorflow as tf import numpy as np x = tf.constant(np.arange(10).reshape(5,2)*10, dtype=tf.float32) print(x) y = tf.keras.layers.LayerNormalization(axis=1) print(y(x)) ``` 執行結果為: ```python tf.Tensor( [[ 0. 10.] [20. 30.] [40. 50.] [60. 70.] [80. 90.]], shape=(5, 2), dtype=float32) tf.Tensor( [[-0.99998 0.99998] [-0.99998 0.99998] [-0.99998 0.99998] [-0.99998 0.99998] [-0.99998 0.99998]], shape=(5, 2), dtype=float32) ``` 我在之前的文章中已經介紹過了LN,BN,GN,IN這幾個歸一化層的詳細原理,不瞭解的可以看本文最後的相關連結中找