【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则...
【機器學習煉丹術】的學習筆記分享
<<小白學PyTorch>>
擴展之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 Keras卷積層
1.1 Conv2D
1.2 SeparableConv2D
1.3 Conv2DTranspose
2 Keras參數初始化
2.1 正態分布
2.2 均勻分布
2.3 截尾正態分布
2.4 常數
2.5 Xavier/Glorot
2.6 自定義初始化
3 Keras激活函數
3.1 relu
3.2 sigmoid
3.3 softmax
3.4 softplus
3.5 softsign
3.6 tanh
3.7 selu
4 Keras的L1/L2正則
4.1 L1/L2正則
4.2 自定義正則化
我們對Keras應該已經有了一個直觀、宏觀的認識了。現在,我們來系統的學習一下Keras的一些關于網絡層的API,本文的主要內容是圍繞卷積展開的,包含以下的內容:
不同類型的卷積層;
不同的參數初始化方式;
不同的激活函數;
增加L1/L2正則;
不同的池化層;
多個Normalization層;
其他的常用層。
本文內容較多,對于API的學習了解即可。
1 Keras卷積層
Keras的卷積層和PyTorch的卷積層,都包括1D、2D和3D的版本,1D就是一維的,2D是圖像,3D是立體圖像。這里就用最常見的2D圖像來做講解,1D和3D和2D基本相同,不多贅述。
1.1 Conv2D
先看Conv2D的所有參數:
tf.keras.layers.Conv2D(filters,kernel_size,strides=(1,?1),padding="valid",data_format=None,dilation_rate=(1,?1),groups=1,activation=None,use_bias=True,kernel_initializer="glorot_uniform",bias_initializer="zeros",kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,**kwargs )先看一個簡單的例子:
import tensorflow as tf input_shape = (4, 28, 28, 3) x = tf.random.normal(input_shape) y = tf.keras.layers.Conv2D(filters=2,kernel_size=3,activation='relu',padding='same' ) print(y(x).shape) >>> (4, 28, 28, 2)現在來看參數含義:
filter: 一個int整數,輸出特征圖的通道數;
kernel_size:一個int整數,卷積核大小;
strides:一個整數或者是(a,b)這樣的list,表示卷積核是否跳步;
padding:'valid'表示沒有padding,'same'表示輸出和輸入特征圖的尺寸相同;只有這兩種選擇
data_format:'channels_last'或者是'channels_first'。默認是'channels_last',表示特征圖的最后一個維度是通道,(batch_size, height, width, channels) ;如果選擇了'channels_first'表示每一個樣本的第一個維度是通道,所以特征圖的格式和PyTorch的格式相同,(batch_size, channels, height, width)。
dilation_rate:碰撞卷積的設置,默認是1,1就是一般的卷積。需要注意的是dilation_rate和stride目前不支持同時不為1,換句話說,如果要膨脹卷積的話,那么stride必須是1;
groups;分組卷積;
activation:這個表示,可以直接在卷積層后面設置一個激活層,比方說'relu',這個在后面的章節會詳細講解目前Keras支持的所有激活層,如果什么都不填入,則不使用激活層
use_bias:一個bool參數,True表示使用bias,默認是True;
kernel_initializer:卷積核的初始化的方法,這個會在后面的章節詳細講解;
bias_initializer:偏置的初始化的方法,這個會在后面的章節詳細講解;
kernel_regularizer:卷積核的正則化的方法,在后面的章節會詳細講解;
bias_regularizer:偏置的正則化的方法,在后面的章節會詳細講解;
1.2 SeparableConv2D
Keras直接提供了深度可分離卷積層,這個層其實包含兩個卷積層(了解深度可分離卷積的應該都知道這個吧),一層是depthwise,一層是pointwise。
這個SeparableConv2D的參數也很多,與Conv2D有很多重復的參數,就不多加贅述了:
tf.keras.layers.SeparableConv2D(filters,kernel_size,strides=(1,?1),padding="valid",data_format=None,dilation_rate=(1,?1),depth_multiplier=1,activation=None,use_bias=True,depthwise_initializer="glorot_uniform",pointwise_initializer="glorot_uniform",bias_initializer="zeros",depthwise_regularizer=None,pointwise_regularizer=None,bias_regularizer=None,activity_regularizer=None,depthwise_constraint=None,pointwise_constraint=None,bias_constraint=None,**kwargs )參數詳解:
depth_multiplier:depthwise卷積之后,一般會增多通道數。比方說輸入通道是16個,那么輸出通道數64個,然后再輸入到pointwise卷積層。這個depth_multiplier就是depthwise卷積層的通道數的擴增系數,在上面的例子中這個擴增系數是4;
depthwise_initializer和pointwise_initializer不用多說,就是兩個卷積層的卷積核的初始化的方法。
但是這個深度可分離卷積完全可以用一般的Conv2D來構建,所以其實在用到深度可分離卷積的時候,自己會重新構建一個這樣的網絡層
1.3 Conv2DTranspose
對于上采樣,這種方法應該并不陌生。Transposed convolution有的時候也被稱為Deconvolution去卷積
tf.keras.layers.Conv2DTranspose(filters,kernel_size,strides=(1,?1),padding="valid",output_padding=None,data_format=None,dilation_rate=(1,?1),activation=None,use_bias=True,kernel_initializer="glorot_uniform",bias_initializer="zeros",kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,**kwargs )參數詳解:
output_padding:一個整數或者list,用來給輸出的特征圖增加一個padding的效果,默認是None,不添加padding;
對于去卷積,可能會比較生疏,這里多講幾個例子
1.3.1 去卷積的例子1
import?tensorflow?as?tf from?tensorflow?import?kerasinput_shape?=?(4,?28,?28,?3) x?=?tf.random.normal(input_shape) y?=?keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=1,padding='same') print(y(x).shape) >>>?(4,?28,?28,?10)但是假如我們去掉了padding=‘same’
input_shape?=?(4,?28,?28,?3) x?=?tf.random.normal(input_shape) y?=?keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=1) print(y(x).shape) >>>?(4,?30,?30,?10)這是因為去卷積的卷積核的中心是從原特征圖的邊界之外開始計算的。一個3乘3的卷積核,那么當卷積核的右下角與原特征圖的左上角重合的時候,去卷積的就已經進行了一次運算,而一般的卷積是只有當卷積核的全部都與原特征圖重合的時候,才進行計算的。(這里的講解不太細致,因為之前在其他的文章中已經講過去卷積的詳細過程了)。
1.3.2 去卷積的例子2
現在把stride改成2
input_shape?=?(4,?28,?28,?3) x?=?tf.random.normal(input_shape) y?=?keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=2) print(y(x).shape) >>>?(4,?57,?57,?10)假如加上padding='same'
input_shape?=?(4,?28,?28,?3) x?=?tf.random.normal(input_shape) y?=?keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=2,padding='same') print(y(x).shape) >>>?(4,?56,?56,?10)所以一般情況下,使用的參數是strides=2,padding='same',這樣特征圖的尺寸就剛好放大一倍。
2 Keras參數初始化
把之前提到的簡單的例子,增加卷積核和偏置的初始化:
import?tensorflow?as?tf input_shape?=?(4,?28,?28,?3) initializer?=?tf.keras.initializers.RandomNormal(mean=0.,?stddev=1.) x?=?tf.random.normal(input_shape) y?=?tf.keras.layers.Conv2D(filters=2,kernel_size=3,activation='relu',padding='same',kernel_initializer=initializer,bias_initializer=initializer ) print(y(x).shape) >>>?(4,?28,?28,?2)簡單的說,就是先定義一個初始化器initializer,然后把這個初始化器作為參數傳給Keras.Layers就行了。
2.1 正態分布
tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
2.2 均勻分布
tf.keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)
2.3 截尾正態分布
tf.keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None)
基本和正態分布一樣,但是如果隨機的取值是在距離均值兩個標準差的這個范圍之外的,那么會重新取值。
換句話說,初始化的數值會被限制在均值正負兩個標準差的范圍內
2.4 常數
tf.keras.initializers.Zeros() tf.keras.initializers.Ones()2.5 Xavier/Glorot
tf.keras.initializers.GlorotNormal(seed=None)
這個本質是一個截尾正態分布,但是GlorotNormal(又稱Xavier),是一個以0為均值,標準差計算公式是:
是in和out表示輸入和輸出神經元數目的數目。如果是之前已經學習過或者看過我寫的關于Xavier初始化的論文筆記的朋友,可能會發現論文中使用的是一個均勻分布而不是正態分布。
均勻分布的初始化如下:tf.keras.initializers.GlorotUniform(seed=None)
這個均勻分布是我們講的:
這個Xavier方法,也是Keras默認的初始化的方法
2.6 自定義初始化
當然,Keras也是支持自定義初始化的方法的。
import?tensorflow?as?tfclass?ExampleRandomNormal(tf.keras.initializers.Initializer):def?__init__(self,?mean,?stddev):self.mean?=?meanself.stddev?=?stddevdef?__call__(self,?shape,?dtype=None)`:return?tf.random.normal(shape,?mean=self.mean,?stddev=self.stddev,?dtype=dtype)def?get_config(self):??#?To?support?serializationreturn?{'mean':?self.mean,?'stddev':?self.stddev}關鍵就是在__call__中返回一個和輸入參數shape大小相同的一個tf張量就行了。
3 Keras激活函數
基本支持了所有的常見激活函數。在卷積層的參數activation中,可以輸入relu,sigmoid,softmax等下面的字符串的形式,全部小寫。
3.1 relu
tf.keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0)
alpha就是斜率,如果是0.1,則變成leakyReLU;
max_value是ReLU的上界,如果是None則沒有上界;
threshold是ReLU的下界,小于下界的都會被置0,一般默認是0.
3.2 sigmoid
tf.keras.activations.sigmoid(x)
函數方程:
3.3 softmax
tf.keras.activations.softmax(x, axis=-1)
3.4 softplus
tf.keras.activations.softplus(x)
計算公式:
3.5 softsign
tf.keras.activations.softsign(x)
計算公式:
3.6 tanh
tf.keras.activations.tanh(x)
計算公式:
3.7 selu
tf.keras.activations.selu(x)
如果,返回;
如果,返回;
scale和是事先設置的數值,alpha=1.67216214,scale=1.05070098
與elu激活函數類似,但是多了有個scale系數,
2017年的一篇論文提出selu,elu是2016年提出的
4 Keras的L1/L2正則
正則化就比較簡單,不是L1就是L2,再或者兩者都有。
4.1 L1/L2正則
from?tensorflow.keras?import?layers from?tensorflow.keras?import?regularizerslayer?=?layers.Dense(units=64,kernel_regularizer=regularizers.l1_l2(l1=1e-5,?l2=1e-4), )這里的正則化,可以使用:
tf.keras.regularizers.l1_l2(l1=1e-5, l2=1e-4)
tf.keras.regularizers.l2(1e-4)
tf.keras.regularizers.l1(1e-5)
關于L1和L2的計算細節:
L1:L1正則就是
L2:L1正則就是
4.2 自定義正則化
class?MyRegularizer(tf.keras.regularizers.Regularizer):def?__init__(self,?strength):self.strength?=?strengthdef?__call__(self,?x):return?self.strength?*?tf.reduce_sum(tf.square(x))def?get_config(self):return?{'strength':?self.strength}這個實現的是L2正則的。其中的get_config是用來保存模型數據的,不要的話也沒事,只是不能序列化的保存模型(不用使用config或者json來存儲模型)。
- END -往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯總結
以上是生活随笔為你收集整理的【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试招聘】社招如何拿到心仪公司的off
- 下一篇: (赞助5本)谷歌官方推荐的 Tensor