Keras調研

Keras調研

關於Keras

Keras基於Python編寫,是一個高層神經網絡API,基於TensorFlow、Theano及CNTK後端。Keras爲支持快速實驗而生,能把idea迅速轉換爲結果。

Keras的特性

  • 簡單和快速的原型設計(keras具有高度模塊化,極簡,和擴充特性)

  • 支持CNN和RNN,或二者的結合

  • 無縫CPU和GPU切換

Keras的設計原則

  • 用戶友好:用戶使用體驗極佳,簡單的幾行代碼就可輕鬆搭建各種神經網絡模型

  • 模塊性:Keras的模塊化程度很高,其中網絡層、損失函數、優化器、初始化策略、激活函數、正則化方法等都是獨立的模塊,可以像搭積木一樣的方式來輕鬆構建自己想要的模型。

  • 易拓展性:只需要仿照現有的模塊就可以編寫新的類或函數,從而創建自己的新模塊。

  • 與Python協作:Keras沒有單獨的模型配置文件類型(作爲對比,caffe有),模型由python代碼描述,使其更緊湊和更易debug,並提供了拓展的便利性。

Keras框架組織

在Keras中,主要被組織爲modelslayerspreprocessinglossesoptimizersmetricsinitializersregularizersconstraintscallbacksdatasetsapplicationsutilsbackend等。

其中:

  • models定義了Keras的模型,包括函數式模型(Model)和序貫模型(Sequential);
  • layers中定義了神經網絡中使用的各種網絡層,如Dense全連接層,RNN循環神經網絡層,Convolutional卷積層、Activation激活層等; preprocessing模塊是數據預處理層,包含序列預處理、文本預處理和圖片預處理等;
  • losses模塊包含了一些常用的損失函數,如mse、mae、categorical_crossentropy等,和優化函數一起在編譯模型時使用;
  • optimizers模塊定義了一些常用的優化目標函數,如SGD、RMSprop、Adagrad等,和損失函數一起在編譯模型時使用;
  • metrics模塊中包含一些常用的性能評估函數,如mae、acc、categorical_accuracy等,性能評估函數類似於目標函數,不過該性能的評估結果不會用於訓練;
  • initializers模塊負責對layer設置初始權重,如全零Zeros、Ones全一、RandomNormal正態分佈初始化等;
  • regularizers模塊定義了一些常用的正則項,正則項在優化過程中對層的參數或激活值添加懲罰項,這些懲罰項將與損失函數一起作爲網絡的最終優化目標,正則項可以選擇添加在權重、偏置向量或輸出上;
  • constraints模塊的功能有些類似於regularizers,它的功能是在優化過程中爲網絡的參數施加約束,如非負、絕對值小於2等,可以選擇對主權重矩陣或偏置向量進行約束;
  • callbacks模塊預定義了一些訓練特定階段調用的函數集,可以用來觀察訓練過程中的網絡內部的狀態和統計信息,預定義的回調函數如BaseLogger、History、EarlyStopping、TensorBoard等;
  • datasets模塊包含了一些常用的數據集合,如IMDB影評傾向分類、MNIST手寫數字識別等,可以用來驗證訓練模型;
  • applications包含了一些帶預訓練權重的模型,主要是應用於圖像分類的模型,在數據量較小或任務相似、數據分佈類似的場景下比較有用;
  • utils模塊中定義了一些常用的工具函數,如to_cagegorical、plot_model等;
  • backend模塊中定義了一些常見的後端函數,由於Keras並不負責處理張量乘法、卷積等底層操作,這些依賴後端的庫,而Keras定義了通用的後端函數,避免了直接調用這些庫,常用的後端函數如backend、dot、mean、any、sin等;

除此之外,keras的wrappers包裝器提供瞭如Scikit-Learn的接口,可以將Sequential模型傳入Scikit-Learn包裝器中的分類器或迴歸器接口完成訓練;

序貫模型與函數式模型

在Keras中,模型包括Sequential序貫模型和Model函數式模型,其中函數式模型的應用更加廣泛,序貫模型是函數式模型的一種特殊情況。

序貫模型的API在大多數情況下非常適合開發深度學習模型,但也有一些限制。它適合處理一般的單輸入、單輸出、層次堆疊鮮明的神經網絡模型,而並不適合處理多對一、一對多、以及在網絡中共享輸入層、共享特徵提取層等相對複雜、靈活的情況。

模型保存

keras的model模塊提供了save(filepath)方法用於保存Keras模型和權重到HDF5文件中

文件包含的內容包括:模型的結構,以便重構改模型、模型的權重訓練配置(損失函數,優化器等)、優化器的狀態,以便於從上次訓練中斷的地方開始 model模塊提供了:

  • load_model(filepath)重新實例化模型
  • 使用to_json()函數保存模型的結構爲json文件,不包含其權重或配置信息。
  • 使用to_yaml()函數保存模型的結構爲yaml文件,不包含其權重或配置信息。
  • 使用model_from_json()函數從json文件中載入模型
  • 使用model_from_yaml()函數從yaml文件中載入模型
  • 使用save_weights()函數保存模型權重到HDF5文件
  • 使用load_weights()函數從HDF5文件中加載模型權重

簡單案例說明

Sequential模型

# For a single-input model with 2 classes (binary classification):

model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# Generate dummy data
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))

# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)

上例是一個簡單的二分類模型,構建的是一個Sequential序貫模型:

  • 首先使用add方法添加了一個全連接層,其輸入參數的維度是(,100),輸出的維度是(,32),激活函數爲relu,

  • 然後又添加了一個全連接層,其輸入維度可由model自動確定,即上一個層的輸出維度(,32),輸出維度爲(,1)

  • 隨後compile方法將模型編譯,採用的優化目標函數爲RMSprop、損失函數爲binary_crossentropy,評估指標是準確率accuracy

  • 然後生成了一些訓練數據,data和對應的labels,然後調用模型的fit方法即可完成訓練。

Model模型

# Shared Input Layer
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.layers.merge import concatenate
# input layer
visible = Input(shape=(64,64,1))
# first feature extractor
conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
flat1 = Flatten()(pool1)
# second feature extractor
conv2 = Conv2D(16, kernel_size=8, activation='relu')(visible)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
flat2 = Flatten()(pool2)
# merge feature extractors
merge = concatenate([flat1, flat2])
# interpretation layer
hidden1 = Dense(10, activation='relu')(merge)
# prediction output
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs=visible, outputs=output)

該神經網絡的模型如下圖:

這裏使用了Model函數式模型構建的神經網絡模型,輸入的維度爲64641有兩個CNN特徵提取子模型共享該輸入,第一個內核大小爲4,第二個內核大小爲8,在分別卷積池化後,特徵會被平坦化爲向量並連接成一個長向量,並連接到完全連接的層,最終使用sigmoid激活函數完成分類問題。

調用GPU的方式

如果採用TensorFlow作爲後端,當機器上有可用的GPU時,代碼會自動調用GPU進行並行計算。如果採用Theano作爲後端,可通過使用Theano標記、設置.theano文件、代碼開頭手動設置等三種方式來指定。

和其他框架對比

  • 易用性和靈活性:對比TensorFlow、Pytorch等其他深度學習框架而言,Keras的抽象層次更高,將常用的深度學習層和運算封裝進乾淨、樂高大小的構造塊,使用者不用考慮深度學習的複雜度,而Pytorch和TensorFlow則提供較低級別的實驗環境,用戶可以自由的編寫自定義層、查看數值優化任務,訪問使用函數的核心,在開發複雜架構時更加直接,但這是以冗長和重複造輪子爲代價的;

  • 流行度和可獲取學習資源:Keras可以獲得大量的教程和可重用代碼,而TensorFlow和PyTorch則有卓越的社區支持和活躍的開發;

  • Debug和內省:由於Keras封裝了大量的計算模塊,這使得確定導致問題的代碼較爲困難,相比而言TensorFlow和PyTorch則更加詳細;Keras用戶創建的標準網絡要比PyTorch用戶創建的標準網絡出錯的機率要小一個數量級,但一旦出錯,則損害巨大,且通常很難定位出錯的代碼行;

  • 導出模型和跨平臺可移植性:在模型導出方面,PyTorch將模型保存在Pickles中,Pickles基於Python,且不可移植,而Keras利用JSON和H5的文件格式,十分方便;在模型部署方面,Keras運行在TensorFlow之上,這使得Keras可以基於TensorFlow將其部署到移動平臺和網頁上;

  • 性能:相對而言,PyTorch和TensorFlow一樣快,在循環神經網絡方面可能PyTorch更快,而Keras通常速度較慢,但在大多數情況下,高性能框架(PyTorch和TensorFlow)的計算效率優勢不敵快速開發環境以及Keras提供的實驗易用性。

總結

Keras是一個非常容易上手的深度學習框架,使用起來比較簡單,創建神經網絡模型就像搭積木一樣,可以快速搭建模型和驗證想法,同時不用去關心CPU和GPU切換的問題,CNN和RNN及其變體都支持,十分適合新手和需要快速驗證更迭模型的人羣使用;

同時由於Keras是高層的API,在使用時一般不會直接涉及神經網絡與深度學習一些基礎性的知識和原理,屏蔽了許多細節,使用起來就像黑盒子,不如TensorFlow等需要自己去設計和配置較低層的東西,從而更加理解和掌握相關原理;

性能方面,Keras非常適合在學術界或研究領域,但可能並不太適用於在性能要求很高、要求實時計算的領域,如移動端或嵌入式設備等。

參考

https://keras-cn.readthedocs.io/en/latest/

https://keras-cn.readthedocs.io/en/latest/for_beginners/FAQ/

https://blog.csdn.net/ice_actor/article/details/78290830

https://www.jiqizhixin.com/articles/keras-or-pytorch

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