Keras卷積神經網絡補充

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

  • dilation_rate,空洞卷積或膨脹卷積的控制參數。

(1)參數初始化

參數初始化的目的是爲了讓神經網絡在訓練過程中學習到有用的信息,這意味着參數梯度不應該爲0。則初始化的必要條件是:各層激活層不出現飽和現象;各層激活值不爲0。

Xavier 初始化方法(又稱作 Glorot 正態分佈初始化),優秀的初始化應該使得各層的激活值和狀態梯度的方差在傳播過程中的方差保持一致。通過使用這種初始化方法,我們能夠保證輸入變量的變化尺度不變,從而避免變化尺度在最後一層網絡中爆炸或者彌散。

2. 池化層

keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

keras.layers.GlobalMaxPooling2D(data_format=None)

keras.layers.GlobalAveragePooling2D(data_format=None)

Global 系列的池化操作大多用於最後一層卷積層,可將每一個 feature_map 池化爲一個特徵,避免了全連接的參數增加,例如輸入爲 8*8*10 輸出爲 1*1*10

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

keras.layers.Flatten(data_format=None),將輸入除了 batch 維展平爲一維。

keras.layers.Dropout(rate, noise_shape=None, seed=None)

  • rate,表示需要丟棄的比例。

keras.layers.SpatialDropout2D(rate, data_format=None),丟棄整個特徵圖。

4. 激活函數(大多兩種表示方法,參數形式和層的形式),keras.layers.Activation(activation)

linear、Softmax、tanh、Sigmoid、hard_sigmoid、ReLU、ELU、SeLU、LeakyReLU、PReLU。

keras.layers.ReLU(max_value=None)

keras.layers.LeakyReLU(alpha=0.3)

keras.layers.PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None)

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

(1)Internal Covariate Shift 問題,指的是訓練過程中隱層的輸入分佈不斷變化問題。

(2)BatchNorm 就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相同分佈的。

BN就是通過一定的規範化手段,把每層神經網絡任意神經元這個輸入值的分佈強行拉回到均值爲0方差爲1的標準正態分佈,其實就是把越來越偏的分佈強制拉回比較標準的分佈。這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,避免梯度消失問題產生,而且梯度變大意味着學習收斂速度快,能大大加快訓練速度。

BN是針對一個 Batch 進行的操作。

 

(3)BN層的作用,加速訓練過程;控制過擬合(可移除 dropout和L2正則項);使得網絡對初始化權重不敏感;允許使用較大的學習率。

(4)關於BN層的位置,論文中是 weights - batchnorm - activation 的順序,認爲這樣可以利用好激活函數的有效區間。在激活層之前添加BN層,BN層可以將前一層的輸出變換到更接近高斯分佈,使得輸入到激活層的值分佈更加穩定。

對於將BN放置於激活函數之前還是之後,應當取決於不同的激活函數,對於上面討論的,像 Sigmoid 和 tanh,BN放置於之前可以緩解梯度衰減。但對於 ReLU,傾向於將BN置於其後。若BN在ReLU之前,ReLU會截斷BN輸出後的數據。

6. ImageDataGenerator https://keras.io/zh/preprocessing/image/

用以生成一個batch的圖像數據,支持實時數據提升。訓練時該函數會無限生成數據,直到達到規定的epoch次數爲止。

(1)使用 .flow(x,y) 的例子

datagen = ImageDataGenerator()

datagen.fit(x_train) # 計算特徵歸一化所需的數量,如果應用 ZCA 白化,將計算標準差均值主成分

# 使用實時數據增益的批數據對模型進行擬合

model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),

steps_per_epoch=len(x_train) / 32, epochs=epochs)

(2)使用 .flow_from_directory(directory) 的例子

7. keras.applications https://keras.io/zh/applications/#applications

Keras 的應用模塊(keras.applications)提供了帶有預訓練權值的深度學習模型,這些模型可以用來進行預測、特徵提取和微調(fine-tuning)。

均可通過參數 include_top 控制是否需要全連接層,進而可直接輸出 Bottleneck Features;亦可通過截取原始模型中的任意層來獲取中間層特徵輸出,如:

base_model = VGG19(weights='imagenet')

model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章