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)
參數:
- units:大於0的整數,代表該層的輸出維度。例如units=4,表示該層的輸出是4個類別
- activation:激活函數,為預定義的激活函數名(參考激活函數),或逐元素(element-wise)的Theano函數,例如activation='softmax'。如果不指定該參數,將不會使用任何激活函數(即使用線性激活函數:a(x)=x),默認不使用
- use_bias: 布爾值,是否使用偏置項,默認為True
- kernel_initializer:權值初始化方法,為預定義初始化方法名的字符串,或用於初始化權重的初始化器。默認使用均勻分布初始化方法初始化,參數從[-limit, limit]的均勻分布產生。
- bias_initializer:偏置向量初始化方法,為預定義初始化方法名的字符串,或用於初始化偏置向量的初始化器。默認初始化為0
- kernel_regularizer:施加在權重上的正則項,為Regularizer對象,默認不使用
- bias_regularizer:施加在偏置向量上的正則項,為Regularizer對象,默認不使用
- activity_regularizer:施加在輸出上的正則項,為Regularizer對象,默認不使用
- kernel_constraints:施加在權重上的約束項,為Constraints對象,默認不使用
- bias_constraints:施加在偏置上的約束項,為Constraints對象,默認不使用
SGD優化器
優化器按照一定規則不斷調整優化參數,是模型必須設定的參數之一。常用的SGD優化器:
keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
隨機梯度下降法,支持動量參數,支持學習衰減率,支持Nesterov動量。
參數
- lr:大或等於0的浮點數,學習率
- momentum:大或等於0的浮點數,動量參數
- decay:大或等於0的浮點數,每次更新后的學習率衰減值
- 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)
- optimizer:優化器,為預定義優化器名或優化器對象,如SGD
- loss:損失函數,為預定義損失函數名或一個目標函數,如loss='categorical_crossentropy'
- metrics:列表,包含評估模型在訓練和測試時的性能的指標,典型用法是metrics=['accuracy']如果要在多輸出模型中為不同的輸出指定不同的指標,可向該參數傳遞一個字典,例如metrics={'ouput_a': 'accuracy'}
- sample_weight_mode:如果你需要按時間步為樣本賦權(2D權矩陣),將該值設為“temporal”。默認為“None”,代表按樣本賦權(1D權)。如果模型有多個輸出,可以向該參數傳入指定sample_weight_mode的字典或列表。在下面fit函數的解釋中有相關的參考內容。
- weighted_metrics: metrics列表,在訓練和測試過程中,這些metrics將由sample_weight或clss_weight計算並賦權
- target_tensors: 默認情況下,Keras將為模型的目標創建一個占位符,該占位符在訓練過程中將被目標數據代替。如果你想使用自己的目標張量(相應的,Keras將不會在訓練時期望為這些目標張量載入外部的numpy數據),你可以通過該參數手動指定。目標張量可以是一個單獨的張量(對應於單輸出模型),也可以是一個張量列表,或者一個name->tensor的張量字典。
- kwargs:使用TensorFlow作為后端請忽略該參數,若使用Theano/CNTK作為后端,kwargs的值將會傳遞給 K.function。如果使用TensorFlow為后端,這里的值會被傳給tf.Session.run,當為參數傳入非法值時會拋出異常