基本概念
· Keras的核心數據結構是模型,也就是一種組織網絡層的方式,最主要的是序貫模型(Sequential).創建好一個模型後就可以用add()向裡面添加層.模型搭建完畢後需要使用complie()來編譯模型,之後就可以開始訓練和預測了(類似於sklearn).
· Sequential其實是模型的一種特殊情況,單輸入單輸出,層與層之間只有相鄰關係.而通用的模型被稱為函數式模型(function model API),支持多輸入多輸出,層與層之間可以任意相連.
· Keras的底層庫是Theano或TensorFlow,它們是符號式的庫,也就是首先定義各種變量,然後建立一個規定各個變量之間計算關係的計算圖,最後再把運算的輸入放進去形成數據流從而輸出.
· 張量(tensor)是向量或矩陣的自然推廣,也就是數字的多階排列.張量的階數也稱為維度或者軸(axis).
· 深度學習的優化算法一般是梯度下降,一般採用的是小批量梯度下降(mini-batch gradient decent),需要把數據分為若干批,按批來更新參數.Keras中的batch指的就是這個批,每個batch對應網絡的一次更新.
· epochs指的就是所有批次的單次訓練迭代,也就是總數據的訓練次數.每個epoch對應網絡的一輪更新.
· model.save(filepath)可以保存模型及權重,配置信息在一個HDF5文件中,models.load_model(filepath)可以重新實例化模型.
序貫(Sequential)模型
· 可以通過向Sequential傳遞一個layer的list來構造模型,也可以通過add將layer一個個加入模型.
· Sequential的第一層需要接受一個關於輸入數據shape的參數,後面的各個層可以自動推導出中間數據的shape.這個參數可以由input_shape(),input_dim(),input_length()等方法傳遞,還可以通過傳遞batch_size參數來指定一個固定大小的batch.注意,input_dim=x意味著傳入一個x維向量,也就等同於一個一階張量,即input_shape=(x,).
· compile()用於編譯模型,它接收三個參數:
1. 優化器(optimizer):已預定義的優化器名或一個Optimizer類對象,模型採用的優化方式
2.
損失函數(loss):已預定義的損失函數名或一個損失函數,模型試圖最小化的目標函數3. 指標列表(metrics):已預定義指標的名字或用戶定製的函數,用於評估模型性能
· fit()用於訓練模型,需要傳入Numpy數組形式的輸入數據和標籤,可以指定epochs和batch_size等參數.
· 處理多分類問題時使用keras.utils.to_categorical()進行獨熱編碼.
·
函數式(Functional)模型
· 只要模型不是一條路走到底的模型,或者模型需要多於一個的輸出,那麼都應該選擇函數式模型.這是最廣泛的一類模型.
· 層對象接受張量為參數,返回一個張量.輸入和輸出都是張量的一個框架就是一個模型,可以像Sequential一樣被訓練.
· 使用Model來初始化一個函數式模型,它需要一個或多個Input層作為輸入,一個或多個層作為輸出.常用的Model屬性有layers,inputs,outpus.
· 所有的模型都是可調用的,就像層一樣用一個張量來調用它.當調用一個模型時,它的結構和權重同時被重用了.
· 函數式模型的典型場景是多輸入,多輸出的模型:
1. 根據層之間的關係建立不同的層
2. 用layers.concatenate將不同層串聯起來
3. 用Model()中的inputs和outpus參數確定模型的輸入與輸出,這兩個參數都是layer的list
4. 用compile()編譯模型
5. 用fit()進行訓練,x和y是對應輸入和輸出大小的數據的list
6. 如果輸入和輸出是用name參數命名過的話,可以用名字與參數對應的字典來進行編譯和訓練.
· 函數式模型還可以用在使用共享層.當我們處理具有對稱性的問題時需要對不同輸入重複使用某一個模型,就可以讓它們共享同一層.此時這個層擁有多個計算節點,所以需要使用layer.get_output_at(node_index)來得到對應節點的輸出.
·
常用層Core
· Dense(全連接層):輸入和輸出都是n維張量.實現的運算是output=activation(dot(input,kernel)+bias).作為第一層時需要指定
輸出維度units和輸入維度input_shape,後續層只用指定units即可.主要參數有激活函數activation以及對權值,偏置向量和輸出的各種設置.· Activation(激活層):對一個層的輸出施加激活函數,參數只有activation,作為第一層時要指定input_shape.
· Dropout:在訓練過程中每次更新參數時按一定概率隨機斷開輸入神經元,用於防止過擬合.主要參數有斷開比例rate.
· Flatten:把多維的輸入一維化,常用在從卷積層到全連接層的過渡,不會影響batch的大小.
· Reshape:把輸入shape轉換為特定的shape,參數只有target_shape.當shape的其餘維度確定後,可以用-1來指代剩下一個未確定的值.
· Permute:將輸入的維度按照規定模式進行
重排,例如將RNN和CNN網絡連接時.參數只有dims,用整數tupel指定了重排的模式.· RepeatVector:將輸入重複n次,參數只有n.
· Lambda:對上一層的輸入施加任何Theano/TensorFlow表達式.主要參數有函數function和output_shape
· AvtivityRegularizer:不會改變數據,但是會基於激活值更新損失函數值.參數有l1正則因子l1和l2正則因子l2
· Masking:根據給定的值對輸入的序列信號進行屏蔽.如果輸入張量在某個時間步上都等於給定值,則該時間步將在模型接下來所有支持masking的層被屏蔽.參數只有mask_value.
卷積層Convolutional
·
1D一般指時域序列,2D一般指圖像,3D一般指連續的圖像序列.· Conv1D:一維卷積層(時域卷積),用於在一維輸入信號上進行鄰域濾波.
· Conv2D:二維卷積層(圖像的空域卷積),對二維輸入進行滑動窗卷積.
· SeparableConv2D:深度可分離卷積層.
· Conv2DTranspose:進行轉置的卷積操作(反捲積).
· Conv3D:對三維輸入進行滑動窗卷積,例如連續幀圖像.
· Cropping1D(2D/3D):在時間軸上對1D(2D/3D)輸入進行裁剪,需要指定首尾裁掉多少個元素.
· UpSampling1D(2D/3D):在時間軸(行和列/三個維度)上將每個時間步重複size次.
· ZeroPadding1D(2D/3D):對1D(2D/3D)輸入的首尾端填充0,以控制卷積以後向量的長度/特徵圖的大小.
池化層Pooling
· MaxPooling1D(2D/3D):對時域1D(空域/3D)信號進行最大值池化.
· AveragePoling1D(2D/3D):對時域1D(空域/3D)信號進行平均值池化.
· GlobalMaxPooling1D/2D:對於時間/空域信號的全局最大池化.
· GlobalAveragePooling1D/2D:為時域/空域信號施加全局平均值池化.
局部連接層LocallyConnceted
· LocallyConnected1D/2D:與Conv1D/2D類似,區別是不進行權值共享.
循環層Recurrent
· Recurrent:循環層的抽象類 ,所有的循環層(LSTM,GRU,SimpleRNN)都繼承本層.
· SimpleRNN:全連接RNN,輸出會被回饋到輸入.
· GRU:門控循環單元.
· LSTM:長短期記憶模型.
· ConvLSTM2D:輸入變換和循環變換通過卷積實現的LSTM網絡.
· SimpleRNNCell:SimpleRNN的Cell類.
· GRUCell:GRU的Cell類.
· LSTMCell:LSTM的Cell類
· StackedRNNCells:用於將多個recurrent cell包裝起來,實現高效的stacked RNN.
· CuDNNGRU:基於CuDNN的快速GRU實現,只能在GPU上運行.
· CuDNNLSTM:基於CuDNN的快速LSTM實現,只能在GPU上運行.
嵌入層Embedding
· Embedding:將正整數轉換為具有固定大小的向量,只能作為第一個隱藏層,與詞向量有關.
融合層Merge
· 提供了一系列用於融合兩個層或張量的層對象和方法.
· Add:接收一個列表張量並返回它們的和
· SubStract:將兩個輸入的層相減
· Multiply/Average/Maximum/Concatenate:接收一個列表的同shape張量並返回它們的逐元素積/逐元素均值/逐元素最大值/按照給定軸相接構成的張量,shape不變
· Dot:計算兩個張量中樣本的張量成績.
· add/substract/multiply/average/maximum/concatenate/dot:上述層的函數式包裝
高級激活層Advanced Activation
· LeakyReLU:是ReLU的特殊版本,當不可激活時仍會有非零輸出值,從而獲得一個小梯度.
· PReLU:參數化的ReLU,f(x) = alpha * x for x < 0, f(x) = x for x>=0
· ELU:指數線性單元,f(x) = alpha * (exp(x) - 1.) for x < 0, f(x) = x for x>=0
· ThresholdedReLU:帶有門限的ReLU,f(x) = x for x > theta,f(x) = 0 for x <= theta
規範層BatchNormalization
· BatchNormalization:在每個batch上將前一層的激活值重新規範化,使得其輸出數據的均值接近0,標準差接近1.
· BN層的作用:
1. 加速收斂
2. 控制過擬合
3. 降低網絡對初始化權重不敏感
4. 允許使用較大學習率
噪聲層Noise:
· GaussianNoise:為數據施加均值為0,標準差為參數的加性高斯噪聲.在克服過擬合時比較有用,起正則化作用,只在訓練時有效.
· GaussianDropout:為數據施加均值為1,標準差為sqrt(rate/(1-rate))的乘性高斯噪聲,同樣起正則化作用,只在訓練時有效.
· AlphaDropout:為輸入施加一種保持輸入均值和方差不變的Dropout,與selu激活函數配合較好.
包裝器Wrapper:
· TimeDistributed包裝器:把一個層應用到輸入的每一個時間步上
·
Bidirectional包裝器:雙向RNN包裝器編寫自己的層:
· 如果需要一個具有可訓練權重的定製層,可以自己實現.一個定製層需要實現三個方法:
1. build(input_shape):定義權重的方法
2. call(x):定義層功能的方法
3. compute_output_shape(input_shape):指定shape變化的方法
序列預處理:
· pad_sequences:填充序列,將標量序列轉化為2D的numpy array.
· skipgrams:跳字,將一個詞向量下標的序列轉化為一對tuple:對於正樣本,轉化為同一窗口中的序列,對於負樣本,轉化為隨機的單詞.
· make_sampling_table:獲取採樣表,採樣的結果為數據集中詞的常見概率.
文本預處理:
· text_to_word_sequence:句子分割,將一個句子拆分成單詞構成的列表
· one_hot:獨熱編碼
· hashing_trick:特徵哈希,將文本轉換為固定大小的哈希空間中的索引序列
· Tokenizer:分詞器,用於向量化文本或將文本轉換為序列.
圖片預處理:
· ImageDataGenerator:圖片生成器,用以生成一個batch的圖像數據
損失函數Loss:
· 目標函數是編譯模型必要的兩個參數之一,可通過傳遞預定義目標函數名字指定目標函數,也可以傳遞一個符號函數作為目標函數.
· 可用的目標函數:
1. mean_squared_error(mse):均方誤差
2. mean_absolute_error(mae):平均絕對誤差
3. mean_absolute_percentage_error(mape):平均絕對百分誤差
4. mean_squared_logarithmic_error(msle):平均對數平方誤差
5. squared_hinge:平方鉸鏈誤差,主要用於SVM.
6. hinge:鉸鏈誤差,主要用於SVM.
7. categorical_hinge
8. binary_crossentropy(ogloss):對數損失函數
9. logcosh:預測誤差的雙曲餘弦函數的對數
10. categorical_crossentropy:多類的對數損失
11. sparse_categorical_crossentrop:接受稀疏標籤的多類對數損失
12. kullback_leibler_divergence:相對熵,KL散度
13. poisson:(predictions - targets * log(predictions))的均值
14. cosine_proximity:預測誤差的餘弦距離平均值的相反數
優化器Optimizer
· 優化器是編譯模型必要的兩個參數之一,可以初始化一個優化器對象傳入,也可以傳遞一個預定義優化器名(參數將使用默認值).
· 可用的優化器:
1. SGD:隨機梯度下降法
2. RMSprop:root mean square prop(均方根傳播?),適用於遞歸神經網絡.
3. Adagrad
4. Adadelta
5. Adam
6. Adamax
7. Nadam
8. TFOptimizer
激活函數Activation
· 激活函數可以通過設置單獨的激活層實現,也可以在構造層對象時通過傳遞activation參數實現.
· 預定義激活函數:
1. softmax
2. elu
3. selu
4. softplus
5. softsign
6. relu
7. tanh
8. sigmoid
9. hard_sigmoid
10. linear
性能評估Metrices
· 性能評估類似於目標函數,只不過該性能的評估結果不會用於訓練.在模型編譯時由metrics設置.可以用預定義的函數,也可以自己定製.
· 預定義張量(參數均為y_ture,y_pred):
1. binary_accuracy:二分類問題的平均正確率
2. categorical_accuracy:多分類問題的平均正確率
3. sparese_categorical_accuracy:同上,適用於稀疏情況
4. top_k_categorical_accracy:top-k正確率
5. sparese_top_k_categorical_accuracy:同上,適用於稀疏情況
初始化方法Initializers
· 初始化方法定義了對keras層設置初始化權重的方法,一般由kernel_initializer和bias_initializer來指定.可以用預定義初始化器也可以自定義函數.
· 預定義初始化方法:
1. Zeros:全零初始化
2. Ones:全1初始化
3. Constant:初始化為一個固定值
4. RandomNormal:正態分佈初始化
5. RandomUniform:均勻分佈初始化
6. TruncatedNormal:截尾高斯分佈初始化,是神經網絡權重和濾波器的推薦初始化方法
7. VarianceScaling:可以根據參數distribution決定不同的初始化方式
8. Orthogonal:隨機正交矩陣初始化
9. Identiy:單位矩陣初始化
10. lecun_uniform:LeCun均勻分佈初始化
11. lecun_normal:LeCun正態分佈初始化
12. glorot_normal:Glorot正態分佈初始化
13. glorot_uniform:Glorot均勻分佈初始化
14. he_normal:He正態分佈初始化
15. he_uniform:He均勻分佈初始化
正則化Regularizer
· 正則化為優化過程中層的參數或激活值添加懲罰項.
· 預定義正則項:
1. l1
2. l2
3. l1_l2
約束項Constraint
· 約束項在優化過程中為網絡的參數施加約束
· 預定義約束項:
1. max_norm:最大模約束
2. non_neg:非負性約束
3. unit_norm:單位範數約束
4. min_max_norm:最小/最大範數約束
回調函數Callback
· 回調函數用於在訓練的特定階段來觀察訓練過程中網絡內部的狀態和統計信息.
· BaseLogger:對每個epoch累加metrics指定的監視指標的epoch平均值
· ProgbarLogger:將metrics指定的監視指標輸出到標準輸出上
· History:會自動調用,即fit方法的返回值
· ModelCheckpoing:將在每個epoch後保存到filepath
· EarlyStopping:用於早停
· RemoteMonitor:用於向服務器發送事件流
· LearningRateScheduler:學習率調度器
· TensorBoard:可視化展示器
· ReduceLROnPlateau:當評價指標不再提升時減少學習率
· CSVLogger:將epoch的訓練結果保存在csv中
· LambdaCallback:用於創建簡單的callback類
預訓練模型Application
· Keras提供了帶有預訓練權重的Keras模型.
1. Xception
2. VGG16
3. VGG19
4. ResNet50
5. InceptionV3
6. InceptionResNetV2
7. MobileNet
常用數據庫
1. CIFAR10小圖片分類數據集
2. CIFAR100小圖片分類數據庫
3. IMDB影評傾向分類
4. 路透社新聞主題分類
5. MNIST手寫數字識別
6. Fashion-MNIST數據集
7. Boston房屋價格迴歸數據集
模型可視化
· keras的utils庫中的plot_model提供了模型可視化的方法
工具utils
· CustomObjectScope:提供定製類的作用域
· HDF5Matrix:使用HDF5數據集代替Numpy數組
· Sequence:序列數據的基類
· to_categorical:將類別向量映射為二值類別矩陣
· normalize:對numpy數組規範化
· custom_object_scope:提供定製類的作用域
· get_custom_objets:檢索全局定製類
· convert_all_kernels_in_model:將模型中全部卷積核在theano和tensorflow中切換
· plot_model:繪製模型結構圖
· serialize_keras_object:將keras對象序列化
· deserialize_keras_object:從序列中恢復keras對象
· get_file:從給定的URL中下載文件
· multi_gpu_model:將模型在多個GPU上覆制
閱讀更多 風信子編程 的文章