keras channels_last、preprocess_input、全連接層Dense、SGD優化器、模型及編譯


channels_last 和 channels_first

keras中 channels_last 和 channels_first 用來設定數據的維度順序(image_data_format)。

對2D數據來說,"channels_last"假定維度順序為 (rows,cols,channels), 而"channels_first"假定維度順序為(channels, rows, cols)。

對3D數據而言,"channels_last"假定(conv_dim1, conv_dim2, conv_dim3, channels),"channels_first"則是(channels, conv_dim1, conv_dim2, conv_dim3)。

可通過 keras.backend.image_data_format() 來獲取當前的維度順序,一般默認順序是 channels_last。


preprocess_input(img)

keras中 preprocess_input() 函數完成數據預處理的工作,數據預處理能夠提高算法的運行效果。常用的預處理包括數據歸一化和白化(whitening)。

深度學習中數據歸一化的常用方法:

1. 簡單縮放Simple Rescaling)

簡單縮放方法是通過對數據各個維度上的值進行重新調節,使得數據整體上分布在[0,1]或[-1,1]區間。

2. 逐樣本均值消減(Per-example mean subtraction)

逐樣本均值消減,也稱為移除直流分量(remove DC),具體操作是把每個樣本都減去所有樣本的統計平均值,這種歸一化方法在圖像領域常見。

3. 特征標准化(Feature Standardization)

特征標准化指的是(獨立地)使得數據的每一個維度具有零均值和單位方差,具體操作是首先計算每一個維度上數據的均值(使用全體數據計算),之后在每一個維度上都減去該均值。下一步便是在數據的每一維度上除以該維度上數據的標准差。 

白化,又稱漂白或者球化;是對原始數據執行變換,使得轉換后的數據的協方差矩陣為單位陣。

圖像中相鄰像素之間具有很強的相關性,因此輸入是冗余的。白化的目的就是降低輸入的冗余性。

經白化處理后的數據集滿足兩個條件:一是特征相關性較低;二是特征具有相同的方差。

白化算法的實現過程:第一步操作是PCA,求出新特征空間中的新坐標,第二步是對新的坐標進行方差歸一化操作。

keras中preprocess_input()函數的作用是對樣本執行 逐樣本均值消減 的歸一化,即在每個維度上減去樣本的均值,對於維度順序是channels_last的數據,keras中每個維度上的操作如下:

x[..., 0] -= 103.939
x[..., 1] -= 116.779
x[..., 2] -= 123.68

全連接層Dense類

keras在core模塊中定義了一系列常用的網絡層,包括全連接,激活層等。Dense層是全連接層。

keras.layers.core.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)
參數:
  1.     units:大於0的整數,代表該層的輸出維度。例如units=4,表示該層的輸出是4個類別
  2.     activation:激活函數,為預定義的激活函數名(參考激活函數),或逐元素(element-wise)的Theano函數,例如activation='softmax'。如果不指定該參數,將不會使用任何激活函數(即使用線性激活函數:a(x)=x),默認不使用
  3.     use_bias: 布爾值,是否使用偏置項,默認為True
  4.     kernel_initializer:權值初始化方法,為預定義初始化方法名的字符串,或用於初始化權重的初始化器。默認使用均勻分布初始化方法初始化,參數從[-limit, limit]的均勻分布產生。
  5.     bias_initializer:偏置向量初始化方法,為預定義初始化方法名的字符串,或用於初始化偏置向量的初始化器。默認初始化為0
  6.     kernel_regularizer:施加在權重上的正則項,為Regularizer對象,默認不使用
  7.     bias_regularizer:施加在偏置向量上的正則項,為Regularizer對象,默認不使用
  8.     activity_regularizer:施加在輸出上的正則項,為Regularizer對象,默認不使用
  9.     kernel_constraints:施加在權重上的約束項,為Constraints對象,默認不使用
  10.     bias_constraints:施加在偏置上的約束項,為Constraints對象,默認不使用

SGD優化器

優化器按照一定規則不斷調整優化參數,是模型必須設定的參數之一。

常用的SGD優化器:

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

隨機梯度下降法,支持動量參數,支持學習衰減率,支持Nesterov動量。

參數

  1.     lr:大或等於0的浮點數,學習率
  2.     momentum:大或等於0的浮點數,動量參數
  3.     decay:大或等於0的浮點數,每次更新后的學習率衰減值
  4.     nesterov:布爾值,確定是否使用Nesterov動量

Model模型

Model是keras定義的一個類,用來生成模型,又被稱為函數式(Funcitional)模型,Keras函數式模型接口是用戶定義多輸出模型、非循環有向模型或具有共享層的模型等復雜模型的途徑,是最廣泛的一類模型。

Model典型使用:

# This returns a tensor
inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)


模型編譯

定義完模型之后需要進一步編譯模型,使用model.compile()函數。

compile(self, optimizer, loss, metrics=None, loss_weights=None,
                sample_weight_mode=None, weighted_metrics=None,
                target_tensors=None, **kwargs)
  1. optimizer:優化器,為預定義優化器名或優化器對象,如SGD
  2. loss:損失函數,為預定義損失函數名或一個目標函數,如loss='categorical_crossentropy'
  3. metrics:列表,包含評估模型在訓練和測試時的性能的指標,典型用法是metrics=['accuracy']如果要在多輸出模型中為不同的輸出指定不同的指標,可向該參數傳遞一個字典,例如metrics={'ouput_a': 'accuracy'}
  4. sample_weight_mode:如果你需要按時間步為樣本賦權(2D權矩陣),將該值設為“temporal”。默認為“None”,代表按樣本賦權(1D權)。如果模型有多個輸出,可以向該參數傳入指定sample_weight_mode的字典或列表。在下面fit函數的解釋中有相關的參考內容。
  5. weighted_metrics: metrics列表,在訓練和測試過程中,這些metrics將由sample_weight或clss_weight計算並賦權
  6. target_tensors: 默認情況下,Keras將為模型的目標創建一個占位符,該占位符在訓練過程中將被目標數據代替。如果你想使用自己的目標張量(相應的,Keras將不會在訓練時期望為這些目標張量載入外部的numpy數據),你可以通過該參數手動指定。目標張量可以是一個單獨的張量(對應於單輸出模型),也可以是一個張量列表,或者一個name->tensor的張量字典。
  7. kwargs:使用TensorFlow作為后端請忽略該參數,若使用Theano/CNTK作為后端,kwargs的值將會傳遞給 K.function。如果使用TensorFlow為后端,這里的值會被傳給tf.Session.run,當為參數傳入非法值時會拋出異常
【Tips】 如果只是載入模型並利用其predict,可以不用進行compile。在Keras中,compile主要完成損失函數和優化器的一些配置,是為訓練服務的。predict會在內部進行符號函數的編譯工作(通過調用_make_predict_function生成函數)。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM