評測| CNTK在Keras上表現如何?能實現比TensorFlow更好的深度學習嗎?

2021-01-08 機器之心Pro

作者:Max Woolf機器之心編譯參與:Jane W、吳攀

Keras 是由 Franois Chollet 維護的深度學習高級開源框架,它的底層基於構建生產級質量的深度學習模型所需的大量設置和矩陣代數。Keras API 的底層基於像 Theano 或谷歌的 TensorFlow 的較低級的深度學習框架。Keras 可以通過設置 flag 自由切換後端(backend)引擎 Theano/TensorFlow;而不需要更改前端代碼。

雖然谷歌的 TensorFlow 已廣受關注,但微軟也一直在默默地發布自己的機器學習開源框架。例如 LightGBM 框架,可以作為著名的 xgboost 庫的替代品。例如幾周前發布的 CNTK v2.0(Microsoft Cognitive Toolkit),它與 TensorFlow 相比,顯示出在準確性和速度方面的強勁性能。參閱機器之心報導《開源 | 微軟發行 Cognitive Toolkit 2.0 完整版:從性能更新到應用案例》。

CNTK v2.0 還有一個關鍵特性:兼容 Keras。就在上周,對 CNTK 後端的支持被合併到官方的 Keras 資源庫(repository)中。

Hacker News 論壇對於 CNTK v2.0 也有評論(https://news.ycombinator.com/item?id=14470967),微軟員工聲稱,將 Keras 的後端由 TensorFlow 改為 CNTK 可以顯著提升性能。那麼讓我們來檢驗這句話的真偽吧。

在雲端進行深度學習

在雲端設置基於 GPU 的深度學習實例令人驚訝地被忽視了。大多數人建議使用亞馬遜 AWS 服務,它包含所有可用的 GPU 驅動,只需參照固定流程(https://blog.keras.io/running-jupyter-notebooks-on-gpu-on-aws-a-starter-guide.html)設置遠程操作。然而,對於 NVIDIA Tesla K80 GPU,亞馬遜 EC2 收費 $0.90/小時(不按時長比例收費);對於相同的 GPU,谷歌 Compute Engine(GCE)收費 $0.75/小時(按分鐘比例收費),這對於需要訓練許多小時的深度學習模型是非常顯著的弱點。

要使用 GCE,你必須從一個空白的 Linux 實例中設置深度學習的驅動和框架。我使用 Keras 進行了第一次嘗試(http://minimaxir.com/2017/04/char-embeddings/),但這並不有趣。不過,我最近受到 Durgesh Mankekar 文章(https://medium.com/google-cloud/containerized-jupyter-notebooks-on-gpu-on-google-cloud-8e86ef7f31e9)的啟發,該文章採用了 Docker 容器這種更現代的方法來管理依賴關係,該文章還介紹了名為 Dockerfile 的安裝腳本和容器與 Keras 必需的深度學習驅動/框架。Docker 容器可以使用 nvidia-docker 進行加載,這可以讓 Docker 容器訪問主機上的 GPU。在容器中運行深度學習腳本只需運行 Docker 命令行。當腳本運行完後,會自動退出容器。這種方法恰巧保證了每次執行是獨立的;這為基準評估/重複執行提供了理想的環境。

我稍微調整了 Docker 容器(GitHub 網址 https://github.com/minimaxir/keras-cntk-docker),容器安裝了 CNTK、與 CNTK 兼容的 Keras 版本,並設置 CNTK 為 Keras 的默認後端。

基準方法

Keras 的官方案例(https://github.com/fchollet/keras/tree/master/examples)非常全面,涉及多種現實中的深度學習問題,並能完美地模擬 Keras 在不同模型的性能。我選取了強調不同神經網絡架構的幾個例子(https://github.com/minimaxir/keras-cntk-benchmark/tree/master/test_files),並添加了一個自定義 logger,它能夠輸出含有模型性能和訓練時間進程的 CSV 文件。

如前所述,只需要設置一個 flag 就能方便地切換後端引擎。即使 Docker 容器中 Keras 的默認後端是 CNTK,一個簡單的 -e KERAS_BACKEND ='tensorflow' 命令語句就可以切換到 TensorFlow。

我寫了一個 Python 基準腳本(https://github.com/minimaxir/keras-cntk-benchmark/blob/master/keras_cntk_benchmark.py)(在主機上運行)來管理並運行 Docker 容器中的所有例子,它同時支持 CNTK 和 TensorFlow 後端,並用 logger 收集生成的日誌。

下面是不同數據集的結果。

IMDb 評論數據集

IMDb 評論數據集(http://ai.stanford.edu/~amaas/data/sentiment/)是用於情感分析的著名的自然語言處理(NLP)基準數據集。數據集中的 25000 條評論被標記為「積極」或「消極」。在深度學習成為主流之前,優秀的機器學習模型在測試集上達到大約 88% 的分類準確率。

第一個模型方法(imdb_bidirectional_lstm.py)使用了雙向 LSTM(Bidirectional LSTM),它通過詞序列對模型進行加權,同時採用向前(forward)傳播和向後(backward)傳播的方法。

首先,我們來看一下在訓練模型時的不同時間點測試集的分類準確率:

通常,準確率隨著訓練的進行而增加;雙向 LSTM 需要很長時間來訓練才能得到改進的結果,但至少這兩個框架都是同樣有效的。

為了評估算法的速度,我們可以計算訓練一個 epoch 所需的平均時間。每個 epoch 的時間大致相同;測量結果真實平均值用 95%的置信區間表示,這是通過非參數統計的 bootstrapping 方法得到的。雙向 LSTM 的計算速度:

哇,CNTK 比 TensorFlow 快很多!雖然沒有比 LSTM 的基準測試(https://arxiv.org/abs/1608.07249)快 5-10 倍,但是僅通過設置後端 flag 就幾乎將運行時間減半就已經夠令人震驚了。

接下來,我們用同樣的數據集測試 fasttext 方法(imdb_fasttext.py)。fasttext 是一種較新的算法,可以計算詞向量嵌入(word vector Embedding)的平均值(不論順序),但是即使在使用 CPU 時也能得到令人難以置信的速度和效果,如同 Facebook 官方對 fasttext 的實現(https://github.com/facebookresearch/fastText)一樣。(對於此基準,我傾向於使用二元語法模型/bigram)

由於模型簡單,這兩種框架的準確率幾乎相同,但在使用詞嵌入的情況下,TensorFlow 速度更快。(不管怎樣,fasttext 明顯比雙向 LSTM 方法快得多!)此外,fasttext 打破了 88%的基準,這可能值得考慮在其它機器學習項目中推廣。

MNIST 數據集

MNIST 數據集(http://yann.lecun.com/exdb/mnist/)是另一個著名的手寫數字數據集,經常用於測試計算機視覺模型(60000 個訓練圖像,10000 個測試圖像)。一般來說,良好的模型在測試集上可達到 99%以上的分類準確率。

多層感知器(multilayer perceptron/MLP)方法(mnist_mlp.py)僅使用一個大型全連接網絡,就達到深度學習魔術(Deep Learning Magic)的效果。有時候這樣就夠了。

這兩個框架都能極速地訓練模型,每個 epoch 只需幾秒鐘;在準確性方面沒有明確的贏家(儘管沒有打破 99%),但是 CNTK 速度更快。

另一種方法(mnist_cnn.py)是卷積神經網絡(CNN),它利用相鄰像素之間的固有關係建模,是一種邏輯上更貼近圖像數據的架構。

在這種情況下,TensorFlow 在準確率和速度方面都表現更好(同時也打破 99%的準確率)。

CIFAR-10

現在來研究更複雜的實際模型,CIFAR-10 數據集(https://www.cs.toronto.edu/~kriz/cifar.html)是用於 10 個不同對象的圖像分類的數據集。基準腳本的架構(cifar10_cnn.py)是很多層的 Deep CNN + MLP,其架構類似於著名的 VGG-16(https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3)模型,但更簡單,由於大多數人沒有用來訓練的超級計算機集群。

在這種情況下,兩個後端的在準確率和速度上的性能均相等。也許 CNTK 更利於 MLP,而 TensorFlow 更利於 CNN,兩者的優勢互相抵消。

尼採文本生成

基於 char-rnn(https://github.com/karpathy/char-rnn)的文本生成(lstm_text_generation.py)很受歡迎。具體來說,它使用 LSTM 來「學習」文本並對新文本進行抽樣。在使用隨機的尼採文集(https://s3.amazonaws.com/text-datasets/nietzsche.txt)作為源數據集的 Keras 例子中,該模型嘗試使用前 40 個字符預測下一個字符,並儘量減少訓練的損失函數值。理想情況的是損失函數值低於 1.00,並且生成的文本語法一致。

兩者的損失函數值隨時間都有相似的變化(不幸的是,1.40 的損失函數值下,仍有亂碼文本生成),由於 LSTM 架構,CTNK 的速度更快。

對於下一個基準測試,我將不使用官方的 Keras 示例腳本,而是使用我自己的文本生成器架構(text_generator_keras.py),詳見之前關於 Keras 的文章(http://minimaxir.com/2017/04/char-embeddings)。

我的網絡避免了過早收斂,對於 TensorFlow,只需損失很小的訓練速度;不幸的是,CNTK 的速度比簡單模型慢了許多,但在高級模型中仍然比 TensorFlow 快得多。

以下是用 TensorFlow 訓練的我的架構模型生成的文本輸出:

hinks the rich man must be wholly perverity and connection of the english sin of the philosophers of the basis of the same profound of his placed and evil and exception of fear to plants to me such as the case of the will seems to the will to be every such a remark as a primates of a strong of [...]

這是用 CNTK 訓練的模型輸出:

(_x2js1hevjg4z_?z_a?q_gpmj:sn![?(f3_ch=lhw4y n6)gkh kujau momu,?!lj7g)k,!?[45 0as9[d.68éhhptvsx jd_ni,_z!cwkr"_f6-mu_(epp [...]

等等,什麼?顯然,我的模型架構導致 CNTK 在預測時遇到錯誤,而「CNTK+簡單的 LSTM」架構並沒有發生這種錯誤。通過質量評估,我發現批歸一化(batch normalization)是錯誤的原因,並及時提出了這個問題(https://github.com/Microsoft/CNTK/issues/1994)。

結論

綜上,評價 Keras 框架是否比 TensorFlow 更好,這個判斷並沒有設想中的那麼界限分明。兩個框架的準確性大致相同。CNTK 在 LSTM/MLP 上更快,TensorFlow 在 CNN/詞嵌入(Embedding)上更快,但是當網絡同時實現兩者時,它們會打個平手。

撇開隨機錯誤,有可能 CNTK 在 Keras 上的運行還沒有完全優化(實際上,1bit-SGD 的設置不起作用(https://github.com/Microsoft/CNTK/issues/1975)),所以未來還是有改進的空間的。儘管如此,簡單地設置 flag 的效果是非常顯著的,在將它們部署到生產之前,值得在 CNTK 和 TensorFlow 後端上測試 Keras 模型,以比較兩者哪個更好。

原文連結:http://minimaxir.com/2017/06/keras-cntk/

相關焦點

  • Keras和TensorFlow究竟哪個會更好?
    Keras 和 TensorFlow 究竟哪個會更好?我應該把時間花在研究 TensorFlow 還是 Keras 上?」 在與深度學習的研究人員、從業者包括工程師在內的交談中,「Deep Learning for Computer Vision with Python 」一書作者 Adrian Rosebrock 聽到了他們的困惑。
  • TensorFlow 2.0正式版官宣!深度集成Keras
    為了提高易用性,TensorFlow 2.0進行了許多修改,如取消了一些被認為是多餘的API,並緊密集成和依賴tf.keras作為中央高級API。TensorFlow與Keras深度學習庫的集成化最初始於2017年2月發布的TensorFlow1.0,本次更新讓二者的集成程度進一步提高。
  • 深度解讀TensorFlow,了解它的最新發展!
    在前段時間的TensorFlow峰會上,TensorFlow 發布了面向 JavaScript 開發者的全新機器學習框架 TensorFlow.js。  TensorFlow.js 是一個開源的用於開發機器學習項目的 WebGL-accelerated JavaScript 庫。
  • 深度學習生態圈——CNTK、Keras、Tensorflow
    隨著Python在機器學習方面的廣泛應用,在深度學習領域,Python的應用也越來越廣泛,我們主要來介紹Python在深度學習領域的三個主要類庫:CNTKTensorflowKeras1 CNTKCNTK是微軟出品的一個開源的深度學習工具包,可以運行在CPU上,也可以運行在
  • TensorFlow 2.X,會是它走下神壇的開始嗎?|tensorflow|深度學習|...
    真正要利用上 TF 2.0 的 Eager Exexution,還是得手動重寫。  API 接口,難以明了  Tensorflow 1.X 時代,靜態圖雖說上手稍微難了那麼一丟丟,但是這並不是什麼問題。既然入了機器學習的坑,這當然是能掌握的。
  • 基於RTX2060構建TensorFlow-gpu(keras)學習平臺
    開始菜單運行anaconda navigator檢查是否安裝了notebook(默認有安裝)三、安裝tensorflow/keras在激活的環境中安裝:1. 如果機器上有gpu,則安裝gpu版本,沒有GPU就安裝cpu版。版本問題,現在TensorFlow到了最新的2.0.0版本,但是很多函數不兼容1.**版本。
  • TensorFlow(Keras)中的正則化技術及其實現(附代碼)
    了解用於緩解深度神經網絡內過度擬合問題的常規技術。正則化深度神經網絡(DNN)在體系結構內部具有大量的權重參數,可以學習一系列值。這些值的範圍是使神經網絡能夠解決龐大的複雜功能的關鍵。現在,我們對正則化有了一些基本的了解(可以隨意探索這兩種方法的數學方法)和一些示例,讓我們看看它們是如何實現的。實施正則化第一步是導入用於實現或支持神經網絡實現的工具和庫。
  • ...一鳴|models|杜偉|gpu|tensorflow|keras|tf.keras|generator
    同時,本次更新的重點是增加了對 TPU 的多項支持,而 tf.keras 和 tf.data 這兩個常用的 API 也得到了很多新的更新。據悉,TensorFlow 2.1 的 CUDA 版本為 10.1,cuDNN 版本為 7.6。在對作業系統的支持上,Windows 和 Linux 系統的 TensorFlow pip 版本默認支持 GPU。
  • 機器學習:在TensorFlow(Keras)中了解和實現Dropout
    表示能力的提高意味著神經網絡可以擬合更複雜的函數,並可以更好地泛化到訓練數據。過度擬合是一個常見問題,它的定義是:模型在訓練數據上表現良好,但經過訓練的機器學習模型無法很好地泛化到不看見的數據。Dropout的主要目的是使網絡中過度擬合的影響最小化。Dropout技術是通過隨機減少神經網絡中相互連接的神經元的數量來實現的。在每一個訓練步驟中,每個神經元都有可能被排除在外(從連接的神經元中被剔除)。
  • 使用tensorflow和Keras的初級教程
    深層神經網絡當一個ANN包含一個很深的隱藏層時,它被稱為深度神經網絡(DNN)。DNN具有多個權重和偏差項,每一個都需要訓練。反向傳播可以確定如何調整所有神經元的每個權重和每個偏差項,以減少誤差。除非網絡收斂到最小誤差,否則該過程將重複。
  • 圖像分類任務中,Tensorflow 與 Keras 到底哪個更厲害?
    有人說TensorFlow更好,有人說Keras更好。讓我們看看這個問題在圖像分類的實際應用中的答案。 在此之前,先介紹Keras和Tensorflow這兩個術語,幫助你在10分鐘內構建強大的圖像分類器。   Tensorflow: Tensorflow是開發深度學習模型最常用的庫。
  • Fast-SCNN的解釋以及使用Tensorflow 2.0的實現
    同時利用從低解析度數據中提取的深度特徵和從高解析度數據中提取的空間細節,確保更好、更快的分割。現在讓我們開始 Fast-SCNN的探索和實現。Fast-SCNN由4個主要構件組成。學習下採樣到目前為止,我們知道深度卷積神經網絡的前幾層提取圖像的邊緣和角點等底層特徵。因此,為了充分利用這一特徵並使其可用於進一步的層次,需要學習向下採樣。它是一種粗糙的全局特徵提取器,可以被網絡中的其他模塊重用和共享。學習下採樣模塊使用3層來提取這些全局特徵。分別是:Conv2D層,然後是2個深度可分離的卷積層。
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    她在 Insight 工作的時候,在安卓系統上用 TensorFlow 部署了一個 WaveNet 模型。本文詳細介紹了部署和實現過程。對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    Keras模式import numpy as npimport tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2Dfrom tensorflow.keras
  • tensorflow2.0學習筆記(一)
    tensorflow2.0學習筆記(一)>這是本人自學tensorflow的筆記,用於記錄。機器學習從本質上而言是一種猜謎遊戲,比比誰能在知道開頭和結尾的前提下猜到過程。從數學的角度而言就是如何在已知y,x的前提下猜到 y=w*x+b 這個表達式(一維角度)。如何解決這個問題就是機器學習的兩大分類之一:回歸問題問題已知關係式為: y = 3*x + 0.8 ,隨機給出100個x和y,如何建立這個關係式?
  • 詳解深度強化學習展現TensorFlow 2.0新特性(代碼)
    因此博主Roman Ring寫了一篇概述性的文章,通過實現深度強化學習算法來具體的展示了TensorFlow 2.0的特性。正所謂實踐出真知。TensorFlow 2.0的特性公布已經有一段時間了,但很多人對此應當還是一頭霧水。
  • Tensorflow.keras筆記-識別Sci-hub驗證碼
    Tensorflow.keras筆記卷積神經網絡識別Sci-hub驗證碼使用requests庫和selenium
  • 在Windows中安裝Tensorflow和Kears深度學習框架
    在命令提示符窗口輸入下列命令: 啟動Anaconda虛擬環境 activate tensorflow 圖 3-11命令提示符中出現tensorflow時,表名已經啟動tensorflow虛擬環境。
  • 用TensorFlow和Keras構建卷積神經網絡
    全文共9940字,預計學習時長20分鐘或更長不同神經網絡結構各有所長。本文主要介紹如何在Python中使用TensorFlow和Keras構建卷積神經網絡。 卷積神經網絡是過去十年中深度學習成為一大熱點的部分原因。今天將使用TensorFlow的eager API來訓練圖像分類器,以辨別圖像內容是狗還是貓。
  • 基於Tensorflow\keras銀行卡識別
    :機器學習算法與Python精研 ,ID:AITop100】,經微信公眾號授權轉載,如需轉載原文作者聯繫來自:GitHub測試環境Ubuntu 18.04python 3.6.7numpy 1.16.4tensorflow-gpu