python 人脸识别:从入门到精通 (5.4)常用的神经网络层
第5章 深度學習與Keras工程實踐
5.4 常用的神經網絡層
5.4.1 全連接層
keras.layers.Dense(units,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)units:正整數,輸出空間的維數。 activation: 激活函數,如果未指定任何內容,則不會應用任何激活函數,即“線性”激活:a(x)= x use_bias:Boolean,該層是否使用偏向量。 kernel_initializer:權重矩陣的初始化方法。 bias_initializer:偏向量的初始化方法。 kernel_regularizer:權重矩陣的正則化方法。 bias_regularizer:偏向量的正則化方法。 activity_regularizer:輸出層正則化方法。 kernel_constraint:權重矩陣約束函數。 bias_constraint:偏向量約束函數。5.4.2 二維卷積層
一維卷積主要用于時序數據處理,二維卷積用于對圖像的空間卷積,三維卷積主要用于對立體空間卷積。
keras.layers.Conv2D(filters,kernel_size,strides=(1, 1),padding='valid',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 ) inputs: 把上一層的輸出作為輸入(直接將上一層作為參數輸入即可) input_shape: 當作為模型的第一層時,需要指出輸入的形狀(samples,rows,cols,channels),只指出后三維即可,第一維度按batch_size自動指定 filters: 卷積過濾器的數量,對應輸出的維數 kernel_size: 整數,過濾器的大小,如果為一個整數則寬和高相同 strides: 橫向和縱向的步長,如果為一個整數則橫向和縱向相同 padding valid: 表示不夠卷積核大小的塊,則丟棄;same表示不夠卷積核大小的塊就補0,所以輸出和輸入形狀相同 data_format: channels_last為(batch,height,width,channels),channels_first為(batch,channels,height,width) dilation_rate: 一個整數,或者包含了兩個整數的元組/隊列,表示使用擴張卷積時的擴張率。如果是一個整數,則所有方向的擴張率相等。另外, strides 不等于1 和 dilation_rate 不等于1 這兩種情況不能同時存在。 activation 激活函數,None是線性函數 use_bias 是否使用偏差量 kernel_initializer 卷積核的初始化。 bias_initializer 偏差向量的初始化。如果是None,則使用默認的初始值。 kernel_regularizer 卷積核的正則項 bias_regularizer 偏差向量的正則項 activity_regularizer 輸出的正則函數 bias_constraint 映射函數,當偏差向量被Optimizer更新后應用到偏差向量上。 trainable Boolean類型。 name 字符串,層的名字。 reuse Boolean類型,表示是否可以重復使用具有相同名字的前一層的權重。5.4.3 池化層
池化層也稱為抽樣層,是一種在圖像的特定范圍內聚合不同位置特征的操作。這是因為卷積之后的圖像具有局部特征,并且圖像的每個像素區域通常具有很高的相似性。圖像區域中的特征平均值或者最大值可以用來表示該區域的整體特征。這樣不僅可以壓縮數據,還會改善結果,使得神經網絡不會發生過擬合。
一般放在卷積層之后,減少數據量,起到降采樣作用,可以進一步進行特征提取和壓縮作用。
均值池化
隨機池化
最大池化
池化層和卷積層配合使用的另一個好處是具有更好的平移不變性,因為圖像平移前后的數據經過池化處理后的差距可能已經很小了。
keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)pool_size: 整數,或者2個整數表示的元組,沿(垂直,水平)方向縮小比例的因數。 (2,2)會把輸入張量的兩個維度都縮小一半。 如果只使用一個整數,那么兩個維度都會使用同樣的窗口長度。strides: 整數,2 個整數表示的元組,或者是 None。 表示步長值。 如果是 None,那么默認值是 pool_size。padding: "valid" 或者 "same" (區分大小寫)。data_format: 字符串,channels_last (默認)或 channels_first 之一。 表示輸入各維度的順序。 channels_last 代表尺寸是 (batch, height, width, channels) 的輸入張量, 而 channels_first 代表尺寸是 (batch, channels, height, width) 的輸入張量。 默認值根據 Keras 配置文件 ~/.keras/keras.json 中的 image_data_format 值來設置。 如果還沒有設置過,那么默認值就是 "channels_last"。全連接網絡的一個最大缺點是參數大,而全局平均池化恰好可以代替卷積神經網絡中的全連接層,可以減少參數量
全局平均池化:
keras.layers.GlobalAveragePooling2D(data_format=None)全局最大池化:
keras.layers.GlobalMaxPooling2D(data_format=None)5.4.4 BN層
批量標準化層
在訓練時,對輸入數據進行標準化,可以提高網絡的訓練速度
針對隱藏層,往往存在著Internal Covariate Shift現象,BN層解決這個問題
針對每一批次,每一層的激活值進行處理
IID獨立同分布假設就是假設訓練數據與測試數據是滿足相同分布的,那么通過訓練數據獲得的模型能夠在測試集上獲得較好的結果
BN使得每一層的神經網絡輸入保持相同的分布,實踐中獲得好的結果。
該層在每個batch上將前一層的激活值重新規范化,即使得其輸出數據的均值接近0,其標準差接近1
- axis: 整數,指定要規范化的軸,通常為特征軸。例如在進行- data_format="channels_first的2D卷積后,一般會設axis=1。
- momentum: 動態均值的動量
- epsilon:大于0的小浮點數,用于防止除0錯誤
- center: 若設為True,將會將beta作為偏置加上去,否則忽略參數beta
- scale: 若設為True,則會乘以gamma,否則不使用gamma。當下一層是線性的時,可以設False,因為scaling的操作將被下一層執行。
- beta_initializer:beta權重的初始方法
- gamma_initializer: gamma的初始化方法
- moving_mean_initializer: 動態均值的初始化方法
- moving_variance_initializer: 動態方差的初始化方法
- beta_regularizer: 可選的beta正則
- gamma_regularizer: 可選的gamma正則
- beta_constraint: 可選的beta約束
- gamma_constraint: 可選的gamma約束
5.4.5 Drouput層
對于全連接層,參數量過大,容易造成過擬合。Dropout層,在訓練中,對于每一個神經元,有一定的概率剔除,暫時丟棄,故而每個批次都在訓練不同的網絡,增加了健壯性,減少過擬合。
keras.layers.Dropout(rate,noise_shape=None,seed=None )- rate:0-1,指定需要斷開的比例
- noise_shape:表示將與輸入數據相乘的二進制dropout掩層的形狀,一般默認即可。
- seed:隨機數種子
5.4.6 Flatten層
將輸入數據展平,不影響批量的大小。
我們將flatten層放置在卷積層和全連接層中間,起到轉換作用,因為卷積層輸出多個二維特征圖,需要轉換為向量序列的形式,才和全連接層一一對應。
示例
from tensorflow import keras from keras.models import Sequential from keras.layers import Conv2D, Flatten model = Sequential() model.add(Conv2D(64, (3,3), input_shape=(3,32,32), padding='same')) # model.output_shape===(None, 64, 32, 32) model.add(Flatten()) # model.output_shape===(None, 65536)總結
以上是生活随笔為你收集整理的python 人脸识别:从入门到精通 (5.4)常用的神经网络层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO R9tm 刷机/root/救砖
- 下一篇: Winrunner经验总结