擴展之Tensorflow2.0 | 21 Keras的API詳解(下)池化、Normalization層

  • 2020 年 12 月 14 日
  • AI
<<小白學PyTorch>>

擴展之Tensorflow2.0 | 21 Keras的API詳解(上)卷積、激活、初始化、正則

擴展之Tensorflow2.0 | 20 TF2的eager模式與求導

擴展之Tensorflow2.0 | 19 TF2模型的存儲與載入

擴展之Tensorflow2.0 | 18 TF2構建自定義模型

擴展之Tensorflow2.0 | 17 TFrec文件的創建與讀取

擴展之Tensorflow2.0 | 16 TF2讀取圖片的方法

擴展之Tensorflow2.0 | 15 TF2實現一個簡單的服裝分類任務

小白學PyTorch | 14 tensorboardX可視化教程

小白學PyTorch | 13 EfficientNet詳解及PyTorch實現

小白學PyTorch | 12 SENet詳解及PyTorch實現

小白學PyTorch | 11 MobileNet詳解及PyTorch實現

小白學PyTorch | 10 pytorch常見運算詳解

小白學PyTorch | 9 tensor數據結構與存儲結構

小白學PyTorch | 8 實戰之MNIST小試牛刀

小白學PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解

小白學PyTorch | 6 模型的構建訪問遍歷存儲(附程式碼)

小白學PyTorch | 5 torchvision預訓練模型與數據集全覽

小白學PyTorch | 4 構建模型三要素與權重初始化

小白學PyTorch | 3 淺談Dataset和Dataloader

小白學PyTorch | 2 淺談訓練集驗證集和測試集

小白學PyTorch | 1 搭建一個超簡單的網路

小白學PyTorch | 動態圖與靜態圖的淺顯理解

參考目錄:

  • 1 池化層

    • 1.1 最大池化層

    • 1.2 平均池化層

    • 1.3 全局最大池化層

    • 1.4 全局平均池化層

  • 2 Normalization

    • 2.1 BN

    • 2.2 LN

1 池化層

和卷積層相對應,每一種池化層都有1D,2D,3D三種類型,這裡主要介紹2D處理影像的一個操作。1D和3D可以合理的類推。

1.1 最大池化層

tf.keras.layers.MaxPooling2D(
    pool_size=(22), strides=None, padding="valid", data_format=None, **kwargs
)

這個strides在默認的情況下就是步長為2 下面看個例子:

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)
>>> (414143)

如果你把strides改成1:

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)
>>> (427273)

如果再把padding改成『same』:

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)
>>> (428283)

這個padding默認是'valid',一般strides為2,padding是valid就行了。

1.2 平均池化層

和上面的最大池化層同理,這裡就展示一個API就不再多說了。

tf.keras.layers.AveragePooling2D(
    pool_size=(22), strides=None, padding="valid", data_format=None, **kwargs
)

1.3 全局最大池化層

tf.keras.layers.GlobalMaxPooling2D(data_format=None, **kwargs)

這個其實相當於pool_size等於特徵圖尺寸的一個最大池化層。看一個例子:

import tensorflow as tf
x = tf.random.normal((4,28,28,3))
y = tf.keras.layers.GlobalMaxPooling2D()
print(y(x).shape)
>>> (43)

可以看到,一個通道只會輸出一個值,因為我們的輸入特徵圖的尺寸是,所以這裡的全局最大池化層等價於pool_size=28的最大池化層。

1.4 全局平均池化層

與上面的全局最大池化層等價。

tf.keras.layers.GlobalAveragePooling2D(data_format=None, **kwargs)

2 Normalization

Keras官方只提供了兩種Normalization的方法,一個是BatchNormalization,一個是LayerNormalization。雖然沒有提供InstanceNormalization和GroupNormalization的方法,我們可以通過修改BN層的參數來構建。

2.1 BN

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過程中計算出來的滑動均值和滑動方差的。具體的計算過程是:
  • 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

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的參數基本一致。直接看一個例子:

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))

運行結果為:

tf.Tensor(
[[ 0. 10.]
 [20. 30.]
 [40. 50.]
 [60. 70.]
 [80. 90.]], shape=(52), 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=(52), dtype=float32)

我在之前的文章中已經介紹過了LN,BN,GN,IN這幾個歸一化層的詳細原理,不了解的可以看本文最後的相關鏈接中找一找。

– END –

<<小白學影像>>

小白學論文 | EfficientNet強在哪裡

小白學論文 | 神經網路初始化Xavier

小白學論文 | 端側神經網路GhostNet(2019)

小白學目標檢測 | RCNN, SPPNet, Fast, Faster

小白學影像 | BatchNormalization詳解與比較

小白學影像 | Group Normalization詳解+PyTorch程式碼

小白學影像 | 八篇經典CNN論文串講

影像增強 | CLAHE 限制對比度自適應直方圖均衡化

小白學卷積 | 深入淺出卷積網路的平移不變性

小白學卷積 | (反)卷積輸出尺寸計算

損失函數 | 焦點損失函數 FocalLoss 與 GHM

<<小白學機器學習>>

小白學ML | 隨機森林 全解 (全網最全)

小白學SVM | SVM優化推導 + 拉格朗日 + hingeLoss

小白學LGB | LightGBM = GOSS + histogram + EFB

小白學LGB | LightGBM的調參與並行

小白學XGB | XGBoost推導與牛頓法

評價指標 | 詳解F1-score與多分類F1

小白學ML | Adaboost及手推演算法案例

小白學ML | GBDT梯度提升樹

小白學優化 | 最小二乘法與嶺回歸&Lasso回歸

小白學排序 | 十大經典排序演算法(動圖)

雜談 | 正態分布為什麼如此常見

Adam優化器為什麼被人吐槽?

機器學習不得不知道的提升技巧:SWA與pseudo-label

<<小白面經>>

秋招總結 | 一個非Top學校的跨專業的演算法應屆研究生的幾十場面試

【小白面經】快手 AI演算法崗 附答案解析

【小白面經】 拼多多 AI演算法崗 附帶解析

【小白面經】八種應對樣本不均衡的策略

【小白面經】之防止過擬合的所有方法

【小白面經】梯度消失爆炸及其解決方法

【小白面經】 判別模型&生成模型