Keras
Keras
Keras是一個由Python編寫的開源人工神經網路庫,可以作為Tensorflow、Microsoft-CNTK和Theano的高階應用程序介面,進行深度學習模型的設計、調試、評估、應用和可視化。
Keras在代碼結構上由面向對象方法編寫,完全模塊化並具有可擴展性,其運行機制和說明文檔有將用戶體驗和使用難度納入考慮,並試圖簡化複雜演演算法的實現難度。Keras支持現代人工智慧領域的主流演演算法,包括前饋結構和遞歸結構的神經網路,也可以通過封裝參與構建統計學習模型。在硬體和開發環境方面,Keras支持多操作系統下的多GPU并行計算,可以根據後台設置轉化為Tensorflow、Microsoft-CNTK等系統下的組件。
Keras的主要開發者是谷歌工程師François Chollet,此外其GitHub項目頁面包含6名主要維護者和超過800名直接貢獻者。Keras在其正式版本公開后,除部分預編譯模型外,按MIT許可證開放源代碼。
Keras:基於Theano和TensorFlow的深度學習庫
Keras
Keras是一個高層神經網路API,Keras由純Python編寫而成並基Tensorflow、Theano以及CNTK後端。Keras 為支持快速實驗而生,能夠把你的idea迅速轉換為結果,如果你有如下需求,請選擇Keras:
• 簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性)
• 支持CNN和RNN,或二者的結合
• 無縫CPU和GPU切換
Keras適用的Python版本是:Python 2.7-3.6
Keras的設計原則是
• 用戶友好:Keras是為人類而不是天頂星人設計的API。用戶的使用體驗始終是我們考慮的首要和中心內容。Keras遵循減少認知困難的最佳實踐:Keras提供一致而簡潔的API,能夠極大減少一般應用下用戶的工作量,同時,Keras提供清晰和具有實踐意義的bug反饋。
• 模塊性:模型可理解為一個層的序列或數據的運算圖,完全可配置的模塊可以用最少的代價自由組合在一起。具體而言,網路層、損失函數、優化器、初始化策略、激活函數、正則化方法都是獨立的模塊,你可以使用它們來構建自己的模型。
• 易擴展性:添加新模塊超級容易,只需要仿照現有的模塊編寫新的類或函數即可。創建新模塊的便利性使得Keras更適合於先進的研究工作。
• 與Python協作:Keras沒有單獨的模型配置文件類型(作為對比,caffe有),模型由python代碼描述,使其更緊湊和更易debug,並提供了擴展的便利性。
Keras的前身是François Chollet為ONEIROS(Open-ended Neuro-Electronic Intelligent Robot Operating System)項目所的編寫的代碼,在2015年分離成為開源的人工神經網路工具。Keras的最初版本以Theano為後台,設計理念參考了Torch但完全由Python編寫 。2015年11月的Keras測試版本0.3.0,Tensorflow被加入了後台選項。2016年4月,Keras在PIPy上發布了第一個穩定版本1.0.0 。2017年5月,Keras版本2.0.0發布 。同年6月,Keras版本2.0.5測試性地將Microsoft-CNTK加入後台選項 。
自2017年起,Keras得到了Tensorflow團隊的支持,其大部分組件被整合至Tensorflow的Python API中。在2018年Tensorflow 2.0.0公開后,Keras被正式確立為Tensorflow高階API,即tf.keras 。此外自2017年7月開始,Keras也得到了CNTK 2.0的後台支持 。
在2019年9月17日Keras穩定版本2.3.0的更新文檔中,Keras團隊宣布了計劃調整:在該版本之後,Keras將集中於Tensoflow後台的有關內容,多後台Keras的開發優先度被降低,且更新將僅包含補丁(bug fix),不會有新的功能性內容移植/加入 。
Keras的命名來自古希臘語“κέρας (牛角)”或 “κραίνω(實現)”,意為將夢境化為現實的“牛角之門” 。由荷馬史詩《奧德賽》第19卷佩涅羅佩與奧德修斯的對話,無法挽留的夢幻擁有兩座門,一座門由牛角製成,一座門由象牙製成,象牙之門內光彩奪目,卻僅是無法實現的夢境;唯有走進牛角之門,才能由夢境看見真實 。
Keras支持Python 2.7-3.6版本,且安裝前要求預裝TensorFlow、Theano、Microsoft-CNTK中的至少一個 。其它可選的預裝模塊包括:h5py,用於將Keras模型的保存為HDF文件;cuDNN,用於GPU計算;PyDot,用於模型繪圖 。Keras可以通過PIPy、Anaconda安裝,也可從GitHub上下載源代碼安裝 :
1 2 | pip install keras conda install keras |
Keras的神經網路API是在封裝后與使用者直接進行交互的API組件,在使用時可以調用Keras的其它組件。除數據預處理外,使用者可以通過神經網路API實現機器學習任務中的常見操作,包括人工神經網路的構建、編譯、學習、評估、測試等 。
屬性與方法
Keras支持序列化模型和函數化模型,且二者具有一定數量的公有屬性(attribute)和方法(method)。其中的公有屬性包括layers、inputs、outputs,能夠以Python列表的形式返回模型信息 :
● model.layers返回一個列表,列表中包含該模型內所有已創建的層對象(參見“層API”),例如keras.layers.Dense
● model.inputs返回一個列表,列表包含該模型輸入端接收的數據類型,例如以Tensorflow為後台時返回tf.Tensor
● model.outputs與model.inputs相同但返回輸出端信息。
Keras模型的公有方法主要與模型權重和結構有關,這裡分別介紹如下:
● model.summary返回該模型的結構信息、總參數量、可學習參數量等信息。
● model.get_config返回一個字典,字典包含該模型所有對象的結構和編譯信息。Keras可以通過該信息建立新模型。
● model.get_weights返回一個列表,列表中每個成員都是NumPy數組形式的模型權重,列表的順序為輸入端到輸出端。
● model.set_weights(pre_trained_w)指定模型的所有權重,指定的權重必須與model.get_weights返回的權重大小一致。
● model.to_yaml將Keras模型的結構輸出為yaml文件,不包含模型權重。輸出完成後,Keras模型可以由yaml文件導入。
● model.save_weights(filepath)將Keras模型的權重保存為HDF5文件,運行時指定文件路徑filepath。
● model.load_weights(filepath, by_name=False)由HDF5文件導出權重到模型。model.load_weights通常只接受model.save_weights輸出的文件,在接收其他來源的文件時,需要指定by_name=True並要求HDF5的變數名與模型層對象的名字相同。
搭建模型
序列化模型(keras.models.Sequential)
Keras的序列化模型是由其API中層對象(參見“層API”)堆疊得到的神經網路模型 。序列化模型有兩種定義方式,一種是運行keras.models.Sequential時由列表指定所有的層對象,另一種是在運行時不指定層API,而是對Sequential類使用model.add添加層對象,這裡給出使用的例子:
1 2 3 4 5 6 7 8 | import keras # 定義一個8-16-2的感知器(方法一) model = keras.models.Sequential([keras.layers.Dense(16, activation='relu', input_shape=(8,)), keras.layers.Dense(2, activation='sigmoid')]) # (方法二) model = keras.models.Sequential() model.add(keras.layers.Dense(16, activation='relu', input_shape=(8,))) model.add(keras.layers.Dense(2, activation='sigmoid')) |
序列模型不顯式定義輸入層,因此其第一個層對象要求指定輸入數據的大小,例子中使用了參量input_shape,也可等價地使用參量input_dim 。
函數化模型(keras.models.Model)
Keras的函數化模型也被稱為functional API,其功能是將一個張量指定為輸入,另一個張量指定為輸出,並將與輸入、輸出張量之間存在連接的節點(層對象)組合成神經網路模型 。這裡提供一個函數化模型的使用例子。
1 2 3 4 5 6 | import keras # 定義一個8-16-2的感知器 IN = keras.layers.Input(shape=(8,)) HIDDEN = keras.layers.Dense(16, activation='relu')(IN) OUT = keras.layers.Dense(2, activation='sigmoid')(HIDDEN) model = keras.models.Model(inputs=IN, outputs=OUT) |
相比於序列化模型,函數化模型顯示定義了隱含層的張量,因此可以更容易地搭建非序列化的模型,具有更好的可擴展性。此外,Keras的函數化模型支持自定義的子類繼承 ,但在定義子類時,模型的拓撲結構由Keras的Python代碼而不是層對象的靜態圖指定,因此一部分基於模型靜態圖的方法在子類繼承后無法使用 。
使用模型
編譯(model.complie)
Keras模型的編譯由model.compile實現,運行時可將Keras代碼翻譯為後台代碼以執行學習、評估等後續操作。編譯可以指定學習組件(參見“學習與優化API”),其使用格式如下 :
1 2 | model.compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)· |
格式中各參量的含義和調用方法如下 :
● optimizer為優化器、loss為損失函數、metrics為評價函數,可以按列表使用多個評價。
● loss_weights為損失權重,可以在多輸出的模型中對不同輸出所對應的損失疊加不同的權重係數,要求提供與模型損失相對應的列表或張量。
● sample_weight_mode是進行樣本賦權的參量,默認為None,表示在model.fit中進行一維賦權;在編譯時間序列模型時,可選擇sample_weight_mode="temporal",此時模型對時間序列樣本(按時間步)進行二維賦權。
● weighted_metrics和metrics的用法相同,在不指定樣本賦權時等價於metrics,在指定了樣本賦權時會對賦權樣本的學習進行評價。
● target_tensor:較少使用的參量,Tensorflow後台的Keras默認為學習目標分配張量佔位符,但使用者可以調用該參量顯式指定學習目標的張量。
除上述參量外,根據後台的不同,model.compile也可以將其它參量和關鍵字傳遞至keras.backend.function或tf.Session.run。
學習(model.fit、model.fit_generator)
模型編譯完成後可以使用model.fit或model.fit_generator進行學習,其使用格式如下 :
1 2 3 4 5 6 7 8 9 | model.fit(x=None, y=None, verbose=1, callbacks=None, epochs=1, initial_epoch=0, class_weight=None steps_per_epoch=None, batch_size=None, validation_split=0.0, validation_data=None, validation_steps=None, validation_freq=1, shuffle=True, sample_weight=None) model.fit_generator(generator,..., max_queue_size=10, workers=1, use_multiprocessing=False) # ... 表示與model.fit相同的關鍵字 |
model.fit和model.fit_generator的使用格式包含一些共有的參量,其含義和調用方法如下 :
● verbose表示在學習時顯示進度條和當前評估結果,默認為開啟。
● callback是回饋器選項(參見“回饋器”)。
● epochs是學習的紀元數,即對所有學習樣本迭代的次數。
● initial_epoch表示開始學習時的紀元數,如果沒有載入先前的學習權重則默認為從0開始。
● class_weight是在分類問題中進行類別賦權的參量,即對不同分類的學習目標使用不同的權重。calss_weight的輸入為一個字典,變數名為類別名,內容為權重,例如對二元分類,類別名通常為“0”和“1”。
除上述共有參量外,對model.fit,其餘參量的含義和調用方法如下:
● x表示輸入特徵,y表示學習目標,batch_size表示分批學習時單個批次的樣本數。steps_per_epoch表示參與學習的批次數,默認值None表示總樣本數除以單個批次的樣本數,即可允許的最大批次數。
● validation_split表示樣本中用於模型驗證(validation)的比例,這部分數據會按比例隨機選取且不參與學習。
● validation_data接收一個包含或(x, y)或(x, y, sample_weight)的Python元組用於學習時的驗證。
● validation_freq僅在調用了validation_split或validation_data時使用,表示模型驗證的頻率,默認值為1,表示每個紀元都進行驗證。validation_freq也接收列表,列表中的元素表示進行模型驗證的紀元數,例如[1, 5, 10]表示在第1、5、10個紀元進行模型驗證。
● validation_steps僅在調用了steps_per_epoch后使用,表示參與模型驗證的批次數。
● shuffle是數據的洗牌選項,僅在調用了steps_per_epoch=None時使用,默認值為True,表示完全洗牌,此外也可選False和batch,後者表示僅在一個批次的樣本內洗牌。
● sample_weight是對樣本賦權的參量,通常不和類別賦權的參量calss_weight一起調用。在model.compile中定義sample_weight_mode=None時,sample_weight接收一個1維NumPy數組,大小與樣本總數相同;在定義sample_weight_mode=“temporal”時,calss_weight接收一個二維數組,按行表示每個樣本在不同時間步的權重,即數組大小為(sample, timestep)。
對model.fit_generator,其餘參量的含義和調用方法如下:
● generator表示生成器(參見“通用工具”),返回輸入特徵、學習目標和樣本權重,不返回樣本權重時默認均等賦權。
● steps_per_epoch的含義與model.fit相同,但默認值為生成器的內部方法__len__(self)的返回值。
● validation_data的含義與model.fit相同,接收相同的輸入,但也接收驗證數據的生成器。
● validation_step僅在validation_data接收生成器時使用,表示參與模型驗證的批次數。
● validation_freq僅在調用了validation_data時有效,表示進行模型驗證的頻率,使用方法與model.fit相同。
● max_queue_size接收一個整數,表示生成器的最大隊列數。
● use_multiprocessing默認為False,表示不使用基於線程的流程。在計算系統具有多線程能力且生成器支持Python的多線程處理框架,即支持pickle操作時,可以選擇True。
● workers表示工作的線程數,默認為0,表示僅在主線程運行,在use_multiprocessing=True時可選大於0的整數。
評估(model.evaluate、model.evaluate_generator)
在模型完成學習后,Keras提供model.evaluate和model.evaluate_generator進行模型評估,二者的使用格式如下 :
1 2 3 4 5 | model.evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None, callbacks=None) model.evaluate_generator(generator, ... max_queue_size=10, workers=1, use_multiprocessing=False) # ... 表示與model.evaluate相同的關鍵字 |
測試(model.predict、model.predict_generator、model.predict_on_batch)
Keras模型可以通過model.predict、model.predict_generator和model.predict_on_batch進行測試,其使用格式如下 :
1 2 3 4 | model.predict(x, batch_size=None, verbose=0, steps=None, callbacks=None) model.predict_generator(generator, ..., max_queue_size=10, workers=1, use_multiprocessing=False) model.predict_on_batch(x) |
這裡對Keras的層API(keras.layers)進行介紹。在Keras的神經網路API中,層API創建的層對象被用於搭建模型 。
屬性與方法
Keras的層API包含一些共有方法,這些方法與給定層對象的結構和權重更新有關 :
● layer.get_weights返回一個列表,列表中的元素為NumPy數組形式的,該層對象的權重矩陣。
● layer.set_weights(weights) 指定一個層對象的權重,指定的權重必須與layer.get_weights返回的權重大小一致。
● layer.get_config: 返回一個字典,字典包含該層對象的結構信息。Keras可以通過該信息對層進行重建。
● layer.get_input_at(node_index) 按節點的索引返回層對象的輸入張量
● layer.get_output_at(node_index) 按節點的索引返回層對象的輸出張量
● layer.get_input_shape_at(node_index) 按節點的索引返回層對象輸入張量的大小
● layer.get_output_shape_at(node_index) 按節點索引返回層對象輸出張量的大小
當一個層對象僅有一個節點,即沒有層對象的合併時,上述方法按屬性的形式使用 :
● layer.input
● layer.output
● layer.input_shape
● layer.output_shape
作為進一步說明,Keras中所有的層(子類),除輸入層外都繼承自keras.engine.base_layer.Layer類,在該類中,層的“節點”是輸入和輸出張量的連結。例如在順序連結的Keras模型中,每個層對象都只有一個節點,但包含共享輸入或輸出的層對象,例如keras.layers.concatenate按張量映射的順序,包含了多個節點 。
核心層
輸入層(keras.layers.Input)
Keras的輸入層繼承自keras.engine.input_layer,是一個後台張量,例如tf.Tensor的實現。由Keras的輸入層子類創建層對象的方式為 :
1 2 | keras.layers.Input(shape=None, batch_shape=None, name=None, dtype=None, sparse=False, tensor=None) |
格式中各參量的含義和調用方法如下 :
● shape和batch_shape表示張量的大小,接收Python元組,其中shape不指定數據批次的長度。
● name接收一個字元串,表示該輸入層的名稱
● dtype按字元形式接收張量的數據類型,例如‘float32’、'int32'等
● spare和tensor表示輸入層返回張量的類型,前者表示是否返回稀疏張量,後者取默認值時創建一個張量佔位符,接收了指定張量時返回數值到該指定張量。
全連接層(keras.layers.Dense)
Keras內部全連接層對象的創建方式為 :
1 2 3 4 | 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) |
格式中各參量的含義和調用方法如下 :
● activation表示該全連接層使用的激活函數,接收一個激活函數對象,例如keras.activations.sigmoid,也可接收關鍵字,例如'sigmoid',使用關鍵字時該激活函數類的參量取默認值。默認值None表示不使用激活函數。全連接層中激活函數的計算在權重計算完成後進行。
● use_bias接收一個邏輯變數,默認值為True,表示該全連接層的權重矩陣中包含一個偏差量,偏差量和其餘權重一起在學習時進行更新。
● kernel_initializer表示該全連接層權重的初始化方法,接收一個keras.initializers對象或其關鍵字,默認值為keras.initializers.glorot_normal(seed=None),從一個0均值的正態分佈中取隨機數進行權重初始化。
● bias_initializer在use_bias=True時可用,接收一個偏差量的初始化器對象或其關鍵字,默認值為keras.initializers.Zeros,表示按0值張量初始化。
● kernel_regularizer和bias_regularizer表示該全連接層中權重矩陣的正則化方法,接收一個正則化器對象,默認值None表示不使用正則化,使用正則化時可用的對象包括keras.regularizers.l1、keras.regularizers.l2和keras.regularizers.l1_l2。
● activity_regularizer表示該全連接層輸出的正則化,調用方法與kernel_regularizer和bias_regularizer相同。
● kernel_constraint和bias_constraint表示該全連接層中權重矩陣使用的參數限制方法,接收一個參數限制器,默認值為None,表示不限制參數,其它可用對象包括keras.constraints.NonNeg、keras.constraints.UnitNorm和keras.constraints.MinMaxNorm。
激活層(keras.layers.Activation)
Keras支持創建獨立的激活層對象,其創建方式為 :
1 | keras.layers.Activation(activation) |
格式中的activation表示一個Keras的激活函數對象、例如keras.activations.sigmoid。將激活層前置於全連接層時可以實現神經網路中的預激活(pre-activation)操作。激活層和全連接層中的activation參量不產生衝突,同時使用時會分別進行激活函數計算 。此外Keras也可以直接從層API創建激活層,參見“特殊激活層”。
隨機失活層
參見:隨機失活
Keras支持隨機連接失活和隨機空間失活,可用的子類包括Dropout、SpatialDropout1D、SpatialDropout2D和SpatialDropout3D,其創建方式為 :
1 2 | keras.layers.Dropout(rate, noise_shape=None, seed=None) keras.layers.SpatialDropout1D(rate) # same for 2D & 3D |
格式中rate接收一個0和1之間的浮點數,表示隨機失活的比率。Dropout中noise_shape表示隨機失活對張量各個維度的操作,例如對輸入張量(t,x,y),給定noise_shape=(1,x,y)時,輸入張量(x,y)維度的隨機失活在t維不變。默認值None表示完全的隨機連接失活 。
Keras中的隨機空間失活,例如SpatialDropout2D會隨機歸零整個通道,例如對4維張量(t,x,y,c),2維的隨機空間失活會隨機選擇某個c維和t維上所有的(x,y)元素歸零 。
輸出正則化層(keras.layers.ActivityRegularization)
Keras提供了獨立的輸出正則化層子類,並支持L1和L2正則化方法,其創建方式為 :
1 | keras.layers.ActivityRegularization(l1=0.0, l2=0.0) |
格式中的l1和l2接收對應的正則化係數。輸出正則化層和全連接層中的activity_regularizer參量不產生衝突,使用時會分別執行正則化操作 。
張量操作層
Keras在層API中提供了支持特定張量操作的層類。由於張量操作層所進行的操作均可以類比NumPy數組中的對應操作,因此這裡僅對張量操作層進行簡單介紹 :
● keras.layers.Flatten可以將多維張量展開成1維張量,可類比numpy.flatten
● keras.layers.Reshape和keras.layers.Permute可以調整張量的維度,可類比numpy.reshape和numpy.permute。
● keras.layers.RepeatVector可以在新的維度複製張量,可類比numpy.repeat。
● keras.layers.Lambda與Python中匿名函數類似,是一個通用的操作封裝器。
● keras.layers.Masking忽略張量中取值為給定值的元素,接近於numpy.ma.masked_where。
卷積層與池化層
參見:卷積神經網路
Keras內置了一系列1維至3維的卷積層和池化層子類用於搭建卷積神經網路,且作為特色地,加入了深度可分卷積、轉置卷積、擴張卷積等較為複雜的構築。另注意到,Keras中卷積層和池化層的“維度”是特徵圖的維度,即一個keras的2維卷積層對象的輸入和輸出都是4維張量,通常為(樣本/批次, 特徵圖第1維, 特徵圖第2維, 通道)。在指定data_format時也可以為(通道, 特徵圖第1維, 特徵圖第2維, 樣本/批次) 。
卷積層與深度可分卷積層
Keras包含1維至3維的卷積層,以及2維和3維的深度可分卷積層子類:Conv[1-3]D、SeparableConv[1,2]D。以2維情形為例,其對象的創建方式為 :
1 2 3 4 5 6 7 8 9 10 11 | keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', dilation_rate=(1, 1), activation=None, use_bias=True, data_format=None, bias_initializer='zeros', kernel_initializer='glorot_uniform', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None) keras.layers.SeparableConv2D(..., depth_multiplier=1, depthwise_initializer='glorot_uniform', pointwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, pointwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, pointwise_constraint=None, bias_constraint=None) # ... 表示Conv2D的共有參量 |
格式中共有參量的含義和調用方法如下 :
● filters接收一個整數,表示該卷積層的卷積核個數,也被稱為通道數。
● kernel_size接收一個Python元組,表示每個卷積核的尺寸,例如對3x3的二維卷積核,kernel_size=(2, 2)。
● strides接收一個Python元組,表示卷積步長。2維卷積核的默認值為(1, 1),表示單步卷積
● padding是卷積核的0值填充選項,默認值'valid'表示不進行填充(即等效填充),輸入'same'時使用相同填充。
● dilation_rate是卷積核的擴張比率,2維卷積核的默認值為(1, 1),表示線性卷積,當使用擴張卷積時,元組的值通常大於1。按擴張卷積的定義,當擴張比率大於1時,卷積步長必須等於1,即strides=(1, 1)。
● data_format是接收特徵度維度順序的參量,默認值None表示張量的第1維表示樣本,最後1維表示通道,等價於輸入"channels_last"。在張量的第1維表示通道時輸入“channels_first”。
● activation、use_bias、*_initializer、*_regularizer、*_constraint的調用方法參見keras.layers.Dense。
SeparableConv[1,2]D中參量的含義和調用方法如下 :
● depth_multiplier接收一個整數,表示沿通道方向的空間卷積的可分度,默認值1表示完全可分,即每個通道獨立進行空間卷積。
● depthwise_initializer、depthwise_regularizer、depthwise_constraint接收深度可分卷積中空間卷積部分的初始化器、正則化器和參數限制器。
● pointwise_initializer、pointwise_regularizer、pointwise_constraint接收深度可分卷積中單位卷積核的初始化器、正則化器和參數限制器。
極大池化、均值池化與全局池化層
Keras支持1維到3維的極大池化、均值池化和全局池化:MaxPooling[1-3]D、AveragePooling[1-3]D、GlobalMaxPooling[1-3]D、GlobalAveragePooling[1-3]D。以2維極大池化和全局極大池化為例,池化層對象的創建方式為 :
1 2 3 | keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None) keras.layers.GlobalMaxPooling2D(data_format=None) |
格式中pool_size接收一個Python元組,表示池化層感受野的大小,其餘參量的調用方法與keras.layers.Conv2D相同。
轉置卷積與反池化層
Keras包含2維和3維的轉置卷積子類:Conv[2,3]DTranspose,以及1維至3維的反池化層子類:UpSampling[2,3]D。以2維情形為例,其創建方式為 :
1 2 3 4 5 6 7 | keras.layers.Conv2DTranspose(filters, kernel_size, strides=(1, 1), padding='valid', output_padding=None, dilation_rate=(1, 1), activation=None, use_bias=True, data_format=None, kernel_initializer='glorot_uniform', bias_initializer='zeros', bias_regularizer=None, kernel_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None) keras.layers.UpSampling2D(size=(2, 2), data_format=None, interpolation='nearest') |
Conv2DTranspose的參量的含義和調用方法如下 :
● output_padding接收一個整數或整數元組,表示轉置卷積輸出端的0值填充層數,其中接收元組時,對特徵圖各維度分別使用元組中整數指定的層數進行填充。注意到output_padding指定的整數必須小於步長。原因是轉置卷積(或反卷積)可視為卷積的逆變換,因此output_padding在功能上是對卷積計算的“還原”。作為解釋性的例子,100x100的特徵圖在通過3x3、步長為10、無填充的卷積核后,會輸出為10x10的特徵圖,但由於步長取整的原因,95x95的特徵圖在通過該卷積核后也會得到10x10的特徵圖,因此使用轉置卷積“還原”上述過程時需要指定output_padding以確保能還原到100x100的特徵圖尺寸。
● 參量filters、kernel_size、strides、padding、dilation_rate、data_format的調用方法與keras.layers.Conv2D相同。activation、use_bias、*_initializer、*_regularizer、*_constraint的含義和調用方可法參見keras.layers.Dense。
UpSampling2D中參量size表示反池化的放大係數,例如一個100x100特徵圖在經過size=(2, 2)的反池化後會輸出200x200的特徵圖。keras.layers.UpSampling2D中的interpolation僅對Tensorflow後台有效,表示反池化的差值方法,默認值‘nearest’表示最接近原則插值,也可接收'bilinear'表示雙線性插值 。
裁剪和0值填充層
Keras支持創建2維和3維特徵圖的裁剪層對象:Cropping2D、Cropping3D;以及獨立的1維至3維0值填充層對象:ZeroPadding1D、ZeroPadding2D、ZeroPadding3D,以2維情形為例,其創建方式分別為 :
1 2 | keras.layers.Cropping2D(cropping=((0, 0), (0, 0)), data_format=None) # 裁剪 keras.layers.ZeroPadding2D(padding=(1, 1)) # 0值填充 |
參量cropping接收2維或3維元組,表示由特徵圖邊緣向中心裁剪去除的像素個數,對多維元組,其順序為((第1維左, 第1維右), (第2維左, 第2維右))以此類推。cropping也接收單個整數,表示對特徵圖的所有維度進行相同像素的裁剪 。參量中的padding表示特徵圖各維度上0值填充的層數。
循環層與循環單元
參見:循環神經網路
Keras提供循環層和循環單元用於構建循環神經網路,二者是keras.engine.base_layer.Layer類的子類,屬於層API的一部分,其中循環層是在功能上與其它層對象相當的構築,可以直接堆疊得到神經網路模型;循環單元是循環層內對序列數據的每個時間步進行(系統)狀態和輸出進行處理的模塊,一個循環層可以包含一個或多個循環單元 。
循環單元子類
Keras的循環單元子類包括簡單循環單元(SimpleRNNCell)、長短期記憶單元(LSTMCell)、門控循環單元(GRUCell),其對應的子類實現方式如下:
簡單循環單元的創建方式為 :
1 2 3 4 5 6 7 8 9 10 11 | keras.layers.SimpleRNNCell(units, activation='tanh', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0) keras.layers.LSTMCell(recurrent_activation='hard_sigmoid', unit_forget_bias=True, implementation=1, ...) keras.layers.GRUCell(recurrent_activation='hard_sigmoid', implementation=1, reset_after=False, ...) # ... 表示SimpleRNNCell的共有參量 |
格式中3類循環單元共有的參量的含義和調用方法如下 :
● units接收一個整數,表示輸入序列的維度或序列特徵的個數。
● use_bias、bias_initializer、bias_regularizer、bias_constraint的含義和調用方可法參見keras.layers.Dense。
● activation表示系統狀態的激活函數,默認值為關鍵字'tanh',表示keras.activations.tanh
● recurrent_initializer、recurrent_regularizer、recurrent_constrain是接收狀態-狀態權重的初始化器、正則化器和參數限制器的參量,使用方法可參見keras.layers.Dense,關鍵字'orthogonal'表示keras.initializers.Orthogonal。
● kernel_initializer、kernel_regularizer、kernel_constrain是接收狀態-輸入權重的初始化器、正則化器和參數限制器的參量,使用方法可參見keras.layers.Dense。
● droupout、recurrent_droupout接收0至1的小數,表示狀態-狀態權重和狀態-輸入權重的隨機失活比率。默認值0表示不進行隨機失活操作。
格式中LSTMCell和GRUCell共有的參量的含義和調用方法如下 :
● recurrent_activation表示LSTM或GPU門控的激活函數,默認值為關鍵字'hard_sigmoid',表示keras.activations.hard_sigmoid。
● implementation是調整LSTM或GRU單元內部計算方案的關鍵字,默認值1表示將內部計算拆分為大量的小型矩陣計算,implementation=2表示將內部計算拆分為少量的大型矩陣計算。兩種計算策略在不同的計算系統中有不同的執行效率。
對LSTMCell,unit_forget_bias是其控制遺忘門偏差量初始化的參量,默認值為True,表示將遺忘門偏差量的初始值設定為1.0。對GRUCell,reset_after=False表示在時序輸入與權重矩陣相乘后使用複位門 。此外LSTM單元有對應的循環卷積單元子類 。
循環層子類
Keras的循環層子類包括一個可接收任意循環單元的子類:keras.layers.RNN,和預設了特定循環單元的子類:SimpleRNN、GRU、LSTM、LSTM2D 。不是一般性這裡只對通用的子類進行介紹:
1 2 | keras.layers.RNN(cell, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False) |
格式中參量的含義和調用方法如下 :
● cell接收循環單元子類,可以是Keras預提供的循環單元,也可以是自定義的循環單元,對後者,該對象需包含call、state_size、out_size等3個方法。接收多個循環單元時,循環單元對象按列表組織先後順序。
● return_sequences和return_state分別表示輸出最後1個時間步的輸出或所有時間步的輸出,以及是否輸出最後1個時間步的系統狀態。
● go_backwards表示是否允許在學習時反向輸入序列。
● stateful表示是在當前批次數據的學習中否保留上對一批次序列學習得到的權重。
● unroll: 表示是否在學習中“展開”循環單元。“展開”表示循環單元會對所有時間步得到一個複製並按前饋結構進行學習。因為展開后的RNN不需要遞歸計算,因此以提高內存開銷為代價加快了學習速度。展開通常僅在短序列輸入時使用。
● input_dim和input_length表示輸入數據中單個時間步的維度和時間步的個數。
預設了特定循環單元的循環層子類包含了keras.layers.RNN的所有參量,以及對應循環單元的參量。
層間合併
Keras提供了8個層子類用於隱含層的合併,按對應的張量操作方式包括:加Add、減Subtract、乘Multiply、取均值Average、取極大值/極小值Maximum/Minimum、拼接Concatenate、點乘Dot。當上述子類的名稱為全小寫時,即add、multiply等,表示該子類的函數化介面 。
層間合併子類的輸入為一個列表,列表內按順序包含需要合併的張量,這裡對張量的拼接給出一個例子:
1 2 3 4 5 6 7 | IN1 = keras.layers.Input(shape=(16,)) # 分支1 H1 = keras.layers.Dense(8, activation='relu')(IN1) IN2 = keras.layers.Input(shape=(32,)) # 分支2 H2 = keras.layers.Dense(8, activation='relu')(IN2)# 使用函數化介面 M = keras.layers.concatenate([x1, x2])# 使用層間合併對象 M = keras.layers.Concatenate()([x1, x2]) model = keras.models.Model(inputs=[IN1, IN2], outputs=M) |
自定義層
Keras可以使用自定義的層對象搭建模型,具體地,一個自定義層子類必須包含3個特定方法,其含義介紹如下 :
● build(self, input_shape)是與隱含層權重有關的方法,包括權重張量的大小、初始化等。該方法的結尾要求指定self.built = True,實現方法之一是super(keras.layers.Layer, self).build(input_shape)
● call(input_tensor)是層內計算的方法,要求返回張量的計算結果
● compute_output_shape(input_shape)是返回張量計算后大小的方法。
其它子類
除上述子類外,keras的層API還包含一些其它子類,這裡將其列出並簡要介紹:
● keras.layers.BatchNormalization是對層對象的輸出張量進行分批歸一化的子類 。
● keras.layers.LeakyReLU、PReLU、ELU、ThresholdedReLU、ReLU和Softmax是可以從層API直接創建的激活層子類 。
● keras.layers.Bidirectional和keras.layers.TimeDistributed是層的封裝器子類,以層對象為輸入並為其賦予特定功能。其中Bidirectional僅接收循環層對象並賦予其雙向連接,TimeDistributed接收所有隱含層對象並將該層的操作在一個維度“複製” 。
● keras.GaussianNoise、GaussianDropout和AlphaDropout為層對象的輸出張量混入雜訊,其中GaussianNoise按加法混入雜訊,GaussianDropout和AlphaDropout按乘法混入雜訊 。
● keras.layers.Embedding可以實現張量的嵌入操作 。
優化器
Keras內置了7個可在反向傳播演演算法框架內使用的優化器(keras.optimizers),這些優化器按keras.optimizers.Optimizer的子類進行封裝,這裡對優化器的名稱和實現進行介紹 :
名稱 | 對象 |
---|---|
均方差傳播演演算法(RMSprop) | keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0) |
隨機梯度下降演演算法(SGD) | keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False) |
自適應梯度下降演演算法(Adagrad) | keras.optimizers.Adagrad(lr=0.01, epsilon=None, decay=0.0) |
自適應學習速率演演算法(Adadelta) | keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0) |
自適應動量估計(Adam) | keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False) |
自適應最大階動量估計(Adamax) | keras.optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0) |
Nesterov加速自適應動量估計(Nadam) | keras.optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, schedule_decay=0.004) |
優化器包含共用參數,其中lr表示學習速率,接收大於0的浮點數、decay表示學習速率隨紀元的遞減,默認值為0,表示學習速率無遞減、epsilon表示最小常數,默認值為keras.backend.epsilon。其餘參數為各優化器可選的超參數 。
表格中優化器可以按關鍵字調用,關鍵字為小寫的子類名稱,例如keras.optimizers.Adam的關鍵字為'adam'。按關鍵字調用優化器時,其超參數取默認值 。
初始化器
Keras的初始化器子類(keras.initializers)提供了在創建層對象(時需要指定的權重初始化方法 。所有的Keras初始化器都繼承自keras.initializers.Initializer,通過對Initializer進行子類繼承,也可以自定義初始化器。這裡列出Keras可用的所有初始化器:
● keras.initializers.Zeros、Ones、Constants按常量初始化權重。
● keras.initializers.RandomNormal、RandomUniform、TruncatedNormal、he_uniform、lecun_uniform、glorot_uniform、he_normal、lecun_normal、glorot_normal、VarianceScaling生成隨機數初始化權重
● keras.initializers.Orthogonal、Identity按正交矩陣和單位矩陣初始化權重。
正則化器
正則化器(keras.regularizers)類提供了神經網路學習的正則化操作,即在計算損失函數時考慮該層權重的范數。Keras的正則化器繼承自keras.regularizers.Regularizer類,包括L1正則化、L2正則化和兩者的線性疊加,共3個子類 :keras.regularizers.l1、l2、l1l2。注意到,正則化器中的正則化係數,是正則化項(而非經驗風險項)相乘的係數。
參數限制器
Keras中參數限制器(keras.constraints)類的功能是將神經網路權重的取值限定在一個範圍內,防止神經網路在學習過程中出現個別高權重節點控制整體輸出的情形出現;在特定問題下可使神經網路僅包含非負權重 。keras.constraints包含4個預設子類:MaxNorm、NonNeg、UnitNorm、MinMaxNorm,功能分別為限制權重極大值、限制負權重、權重(范數)歸一化、權重0-1標準化 。
回調函數
Keras的回調函數(keras.callbacks)是一個特殊的類,其功能是在模型的學習過程中按條件觸發給定的操作。Keras的回調函數預置了12個子類,也支持用戶自定義的子類繼承。一般地,回調函數對象在按列表的形式組織后可以在Keras神經網路API中進行調用:
1 2 3 | # 定義並編譯你的模型 callback_list = [callback1, callback2, callback3] # 定義回饋器 records = model.fit(..., callbacks=callback_list, ...) # 在模型學習時調用 |
記錄與監控工具
Keras的內置回調函數中包含了一系列可用於記錄和監控模型行為的子類:BaseLogger、CSVLogger、ProgbarLogger、History、RemoteMonitor、TensorBoard。其中BaseLogger和History在模型學習時會默認載入,其餘的回調函數為可選載入。
檢查點
ModelCheckpoint可以在模型學習的迭代過程中對模型進行備份,其對象的創建方式如下:
1 2 3 4 | keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1) |
動態調參和早停工具
Keras的內置回調函數包含了動態調整學習參數和進行學習終止判定的子類,包括LearningRateScheduler、ReduceLROnPlateau、TerminateOnNaN、EarlyStopping,其中前2個子類用於調節優化器的學習速率(參見“優化器”),后2個子類分別為異常值終止和早停法。上述對象的創建方式如下:
1 2 3 4 5 6 | keras.callbacks.LearningRateScheduler(schedule, verbose=0) keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', min_delta=0.0001, cooldown=0, min_lr=0) keras.callbacks.TerminateOnNaN() keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto', baseline=None, restore_best_weights=False) |
自定義回饋器
使用者可以通過在LambdaCallback中指定操作或對Callback進行子類繼承創建自定義的回調函數。對第1種選擇,LambdaCallback對象的創建方法為:
1 2 3 | keras.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None, on_batch_begin=None, on_batch_end=None, on_train_begin=None, on_train_end=None) |
這裡LambdaCallback的使用方法類似於Python中的匿名函數,格式中的6個參數表示在學習的不同階段可以進行的操作。
Keras作為一個高階應用程序介面,其底層計算不是獨立完成的,而是構架於支持張量計算的符號數學庫之上,截至穩定版本2.2.4,Keras支持的底層構架包括Tensorflow、Microsoft-CNTK和Theano。Keras的後台API(keras.backend)包含一系列與後台交互的組件,這些組件中的部分函數對所有後台通用,但也包含一部分限制於特定後台的函數和類 。
通用後台工具
Keras後台API的一些函數和類能夠不依賴於特定的後台類型直接操作張量,這些函數在Keras文檔中被稱為“抽象後台(abstract Keras backend)函數”。後台API的抽象函數超過50個,按功能包括定義張量,例如keras.backend.placeholder、查看與檢索張量,例如keras.backend.print_tensor、對張量進行計算,例如keras.backend.abs、內置函數/子類的計算,例如keras.backend.gradients、查看與修改後台設置,例如keras.backend.backend、keras.backend.set_epsilon以及通用的後台計算交互,例如keras.backend.ckear_session等 。
後台指令交互
Keras後台API的一部分類是面向特定後台設計的,在導入keras後台,例如"import keras.backend as K"后,按後台選項,可通過K.tf和K.th調出Tensorflow和Theano的後台。在K.tf和K.th可以直接接收對應的後台指令,這裡給出一個Tensorflow後台的例子 :
1 2 3 4 5 6 7 | import keras.backend as K # 使用K.tf對tf.ConfigProto進行操作 config = K.tf.ConfigProto() config.gpu_options.allow_growth = True # 使用K.tf對tf.Session進行操作 sess = K.tf.Session(config=config) K.set_session(sess) |
keras.json
Keras在導入後會生成一份json文件,通常位於用戶主目錄下的.keras/keras.json,該文件定義了Keras的全局選項,並顯式指定了後台。這裡給出一個後台文件的例子 :
1 2 3 4 5 6 | { "image_data_format": "channels_last", "epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow" } |
通過後台API可以查看keras.json的內容,例如對上述例子keras.backend.epsilon會返回1e-07。修改keras.json的“backend”可以切換Keras的後台 。
序列
Keras的序列數據預處理API可用於對時間序列和字元嵌入后的文本序列進行預處理。這裡簡要列出其功能 :
● keras.preprocessing.sequence.TimeseriesGenerator是時間序列的生成器類,可以將時間序列數據分割為多個批次。
● keras.preprocessing.sequence.pad_sequences是1個函數,將不同長度的序列填充為相同長度。
● keras.preprocessing.sequence.skipgrams是1個函數,可以由嵌入的字元序列或語句生成skipgram。
● keras.preprocessing.sequence.make_sampling_table是1個函數,可以由文本序列的樣本數和採樣係數生成概率採樣表。
文本
Keras提供了文本數據預處理的類和函數,這裡簡要列出其功能 :
● keras.preprocessing.text.Tokenizer是1個用於文本分割的類,按特定規則,例如空格將句子分割為單詞並返回Tokenizer對象,該對象可用於文本編碼等其它預處理操作。
● keras.preprocessing.text.text_to_word_sequence是1個函數,按特定規則將句子分割並按列表返回單詞序列。
● keras.preprocessing.text.hashing_trick是1個函數,在給定Python環境下的hash演演算法后可以將輸入的文本轉化為哈希值。
● keras.preprocessing.text.one_hot類似於hashing_trick,使用Python默認的hash演演算法進行文本的獨熱編碼。
圖像
Keras的圖像數據預處理API是1個圖像的生成器類:keras.preprocessing.image.ImageDataGenerator。在給定圖像樣本后,ImageDataGenerator可以進行數據強化(data augmentation)操作,包括旋轉、反轉、平移、白化等並輸出圖像 。
函數
損失函數(keras.losses)
Keras以函數的形式定義了可用於神經網路學習和評價的損失函數,這裡按表格的形式給出其內置損失函數的名稱,代碼和說明 :
名稱 | 函數使用格式 | 用途說明 |
---|---|---|
均方誤差 | keras.losses.mean_squared_error(y_true, y) | 用於回歸問題。 |
均方對數誤差 | keras.losses.mean_squared_logarithmic_error(y_true, y) | 取對數的均方誤差。 |
平均絕對誤差 | keras.losses.mean_absolute_error(y_true, y) | 用於回歸問題,具有稀疏性。 |
百分比平均絕對誤差 | keras.losses.mean_absolute_percentage_error(y_true, y) | 按百分比計算的平均絕對誤差。 |
鉸鏈損失 | keras.losses.hinge(y_true, y) | 用於二元分類問題,具有稀疏性。 |
平方鉸鏈損失 | keras.losses.squared_hinge(y_true, y) | 鉸鏈損失的平方。 |
類別鉸鏈損失 | keras.losses.categorical_hinge(y_true, y) | 用於多元分類問題,具有稀疏性。 |
對數雙曲餘弦函數 | keras.losses.logcosh(y_true, y) | 用於回歸問題,介於均方誤差和平均絕對誤差之間,具有一定的稀疏性。 |
類別交叉熵 | keras.losses.categorical_crossentropy(y_true, y) | 用於多元分類問題。 |
稀疏類型交叉熵 | keras.losses.sparse_categorical_crossentropy(y_true, y) | 用於分類問題,具有稀疏性。 |
二元分類交叉熵 | keras.losses.binary_crossentropy(y_true, y) | 用於二元分類問題。 |
相對熵 | keras.losses.kullback_leibler_divergence(y_true, y) | 用於包含概率分佈的回歸或分類問題,例如變分自編碼器的學習。 |
泊松分佈損失 | keras.losses.poisson(y_true, y) | 用於包含極大似然估計的回歸問題,例如泊松回歸。 |
餘弦相似性損失 | keras.losses.cosine_proximity(y_true, y) | 用於矢量化數據的回歸或分類問題。 |
Keras的所有損失函數都接收2個輸入,按順序為代表真實值和代表預測值的張量,以Tensorflow為後台時,是tf.Tensor類,接收張量的大小必須匹配 。
表格中的損失函數可以按關鍵字調用,關鍵字與函數名相同,例如keras.losses.categorical_crossentropy的關鍵字為‘categorical_crossentropy’。一些損失函數的關鍵字有別名,例如keras.losses.mean_squared_error的關鍵字為可以為'mean_squared_error'或'mse' 。
激活函數(keras.activations)
Keras按兩類方式提供神經網路模型的激活函數:一部分作為keras.engine.base_layer.Layer的子類被封裝至層API中,另一部分則按函數的形式定義 。這裡給出按函數形式定義的激活函數 :
名稱 | 函數使用格式 | 說明 |
---|---|---|
Sigmoid函數 | keras.activations.sigmoid(x) | 二元分類的輸出層、 RNN門控 |
硬限幅Sigmoid函數 | keras.activations.hard_sigmoid(x) | 二元分類的輸出層、 RNN門控 |
歸一化指數函數 | keras.activations.softmax(x, axis=-1) | 多元分類的輸出層 |
雙曲正切函數 | keras.activations.tanh(x) | (淺層結構的)隱含層、RNN單元 |
Softsign函數 | keras.activations.softsign(x) | (淺層結構的)隱含層 |
指數函數 | keras.activations.exponential(x) | - |
線性函數 | keras.activations.linear(x) | - |
線性整流函數 | keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0.0) | (深度結構的)隱含層 |
指數線性函數 | keras.activations.elu(x, alpha=1.0) | (深度結構的)隱含層 |
尺度指數線性函數 | keras.activations.selu(x) | (深度結構的)隱含層 |
Softplus函數 | keras.activations.softplus(x) | (深度結構的)隱含層 |
激活函數接收一個張量並返回一個相同大小的張量,keras.activations.softmax的參數axis表示歸一化的維度,默認為張量的最後1維,keras.activations.relu和keras.activations.elu的參數為其超參數 。
表格中激活函數可以按關鍵字調用,關鍵字與函數名相同。按關鍵字調用激活函數時,激活函數的超參數取默認值 。
評價函數(keras.metrics)
在應用方面,keras.losses中定義的所有函數均可作為評價函數使用,此外,keras.metrics額外定義了5個評價函數 :
● keras.metrics.binary_accuracy可用於二元分類的評價。
● keras.metrics.categorical_accuracy、sparse_categorical_accuracy可用於多元分類的評價。
● keras.metrics.top_k_categorical_accuracy、sparse_top_k_categorical_accuracy可用於前k項分類的評價。
上述評價函數接收2個輸入,按順序為代表真實值和代表預測值的張量,張量大小必須匹配。評價函數可以按關鍵字調用,例如keras.metrics.binary_accuracy的關鍵字為'binary_accuracy'或'acc' 。
通用工具
Keras提供了神經網路學習中可用的其它通用工具(keras.utils),這裡將其列出 :
● keras.utils.CustomObjectScope可以為用戶自定義的對象設立關鍵字,並可以在keras代碼中按關鍵字調用該對象。
● keras.utils.HDF5Matrix是keras與HDF5文件交互的類,要求Python環境預裝h5Py。
● keras.utils.Sequence是序列生成器類,其主要作用是創建能夠循環讀取文件並生成數據的分批導入對象,該對象在神經網路模型的學習、評估和測試中可以使用 。
● keras.utils.to_categorical是進行標記-類別轉換的函數,將標記轉換為類別,其中類別為0-1元素的Numpy矩陣,列數等於輸入數據的不同標記數。
● keras.utils.normalize是1個函數,功能是數據標準化。
● keras.utils.get_file是1個函數,功能是通過url下載指定數據到本地路徑。
● keras.utils.plot_model是將編譯的keras模型繪製為圖像的函數,要求Python環境預裝PyDot。
● keras.utils.print_summary是將編譯的keras模型總結為表格的函數,表格包括keras模型的結構和參數信息。
● keras.utils.multi_gpu_model是僅在Tensorflow後台時使用的函數,可以將keras模型複製到多塊GPU上進行并行計算。
Scikit-Learn封裝器
完成編譯(和學習)的keras模型可以通過Scikit-Learn封裝器輸出1個Scikit-Learn對象並加入到其環境下的機器學習和統計學習流程中 。具體地,keras分類器使用keras.wrappers.scikit_learn.KerasClassifier進行封裝,keras回歸器使用keras.wrappers.scikit_learn.KerasRegressor進行封裝,封裝時可以使用Scikit-Learn對象的共有屬性和方法,包括fit、predict、predict_proba、score等 。該API要求Python環境預裝Scikit-Learn 。
預編譯模型
這裡按表格的形式給出keras包含的預編譯模型 :
名稱 | 提出者(按引用) | 許可協議 |
---|---|---|
Xception | Chollet (2017) | MIT許可證 |
VGG16 | Simonyan and Zisserman (2014) | Creative Commons Attribution License |
VGG19 | Simonyan and Zisserman (2014) | Creative Commons Attribution License |
ResNet50、101、152 | He et al. (2015) | MIT許可證 |
ResNet50V2、101V2、152V2 | He et al. (2016) | BSD協議(Facebook) |
ResNetXt50、101 | Xie et al. (2017) | BSD協議(Facebook) |
InceptionV3 | Szegedy et al. (2016) | 阿帕奇授權協議(2.0版) |
InceptionResNetV2 | Szegedy et al. (2017) | 阿帕奇授權協議(2.0版) |
MobileNet | Howard et al. (2017) | 阿帕奇授權協議(2.0版) |
DenseNet121、169、201 | Huang et al. (2017) | BSD協議(第三版) |
NASNet | Zoph et al. (2018) | 阿帕奇授權協議(2.0版) |
MobileNetV2 | Sandler et al. (2018) | 阿帕奇授權協議(2.0版) |
自帶數據
Keras包含6份自帶數據集,這裡按表格形式給出其元數據 :
名稱 | 樣本數 | 說明 |
---|---|---|
CIFRA10圖像數據 | 50000,單樣本為32x32 RGB圖像 | 包含10個類別,用於圖像分類問題 |
IMDB電影評價數據 | 25000,單樣本為矢量化字元編碼 | 按評價的正/負分類,用於二元情感分析 |
路透社新聞數據 | 11228,單樣本為矢量化字元編碼 | 按新聞主題分為46類,用於主題模型 |
MINST手寫數字圖像數據 | 60000,單樣本為28x28灰度圖像 | 包含10個類別,用於圖像分類問題 |
MINST時尚物件圖像數據 | 60000,單樣本為28x28灰度圖像 | 包含10個類別,用於圖像分類問題 |
波士頓房價數據 | 約400個樣本,單樣本包含13個特徵 | 用於回歸問題 |
Keras在Google Group和Slack上有用戶交流區,細節有在其官方文檔的主頁列出 。錯誤報告和新功能請求可以通過Keras在Github的開發者頁面進行反饋 。在Keras的Github項目頁面上,有列出開發計劃,用戶可以申請加入並貢獻內容 。此外,Keras官方文檔有介紹反饋錯誤和參與開發的準則 。
Keras包含一些與神經網路的微調和結構優化有關的子項目,包括AutoKeras 和Keras-Tuner ,截至Keras主分支版本2.2.4,二者均處於開發階段,未提供穩定版本。
根據其官方文檔,Keras在開發時的關注點包括:用戶友好、模塊化、可擴展性和完全的Python支持。Keras同時也提供了由代碼-產品間轉化的途徑,例如支持在iOS的Apple's CoreML 、Android的TensorFlow運行以及網頁的JavaScript運行 。
Keras被認為是深度學習開發端受到關注的工具之一,例如在2018年的一份測評中,Keras的普及率僅次於TensorFlow,超過了PyTorch、Microsoft-CNTK和Theano 。