當前位置:
首頁 > 新聞 > 一文看懂Keras和TensorFlow到底哪家強

一文看懂Keras和TensorFlow到底哪家強

新智元推薦

來源:AI前線(ID:ai-front)

編輯:Debra

【新智元導讀】本文的作者經常在電子郵箱中、社交媒體上,甚至在與深度學習研究人員、從業者和工程師面對面交談時,會被問到這些問題:我應該在項目中使用 Keras 還是 TensorFlow?TensorFlow 和 Keras 哪個更好?我應該花時間研究TensorFlow 還是 Keras?你是不是也有相同的疑問?如果有,相信這篇文章會給你答案。

實際上,到 2017 年中,Keras 已經被大規模採用,並與 TensorFlow 集成在一起。這種 TensorFlow + Keras 的組合讓你可以:

使用 Keras 的介面定義模型;

如果你需要特定的 TensorFlow 功能或者需要實現 Keras 不支持但 TensorFlow 支持的自定義功能,可以回到 TensorFlow。

簡單地說,你可以將 TensorFlow 代碼直接插入到 Keras 的模型或訓練管道中!

但請別誤會,我並不是說你就不需要了解 TensorFlow 了。我的意思是,如果你:

剛開始接觸深度學習……

在為下一個項目選型……

想知道 Keras 或 TensorFlow 哪個「更好」……

我的建議是先從 Keras 著手,然後深入 TensorFlow,這樣可以獲得你需要的某些特定功能。

在這篇文章中,我將向你展示如何使用 Keras 訓練神經網路,以及如何使用直接構建在 TensorFlow 庫中的 Keras + TensorFlow 組合來訓練模型。

Keras 與 TF 我該學哪個?

在文章的其餘部分,我將繼續討論有關 Keras 與 TensorFlow 的爭論以及為什麼說這個問題其實是個錯誤的問題。

我們將使用標準的 keras 模塊以及 TensorFlow 的 tf.keras 模塊實現一個卷積神經網路(CNN)。

我們將在一個樣本數據集上訓練 CNN,然後檢查結果——你會發現,Keras 和 TensorFlow 可以很融洽地合作。

最重要的是,你將會了解為什麼 Keras 與 TensorFlow 之間的爭論其實是沒有意義的。

儘管從 TensorFlow 宣布將 Keras 集成到官方 TensorFlow 版本中已經一年多時間了,但很多深度學習從業者仍然不知道他們可以通過 tf.keras 子模塊訪問 Keras,為此我感到很驚訝。

更重要的是,Keras + TensorFlow 的集成是無縫的,你可以直接將 TensorFlow 代碼放到 Keras 模型中。

在 TensorFlow 中使用 Keras 將為你帶來兩全其美的好處:

你可以使用 Keras 提供的簡單直觀的 API 來創建模型;

Keras API 與 scikit-learn(被認為是機器學習 API 的「黃金標準」)很像;

Keras API 採用了模塊化,易於使用;

當你需要自定義實現或者更複雜的損失函數時,可以直接進入 TensorFlow,並讓代碼自動與 Keras 模型集成。

在過去幾年中,深度學習研究人員、從業人員和工程師通常需要做出以下選擇:

我是選擇易用但難以定製的 Keras 庫?

還是選擇難用的 TensorFlow API,並編寫更多的代碼?

所幸的是,我們不必再糾結了。

如果你發現自己還在問這樣的問題,那麼請退後一步——你問的是錯誤的問題——你可以同時擁有這兩個框架。

如圖所示,導入 TensorFlow(tf),然後調用 tf.keras,可見 Keras 實際上已經成為 TensorFlow 的一部分。

在 tf.keras 中包含 Keras 讓你可以使用標準的 Keras 包實現簡單的前饋神經網路:

然後使用 tf.keras 子模塊實現相同的網路:

這是否意味著你必須使用 tf.keras?標準的 Keras 包是不是已經過時?當然不是。

作為一個庫,Keras 仍然可以單獨使用,因此未來兩者可能會分道揚鑣。不過,因為谷歌官方支持 Keras 和 TensorFlow,所以似乎不太可能出現這種情況。

關鍵是:

如果你習慣使用 Keras 編寫代碼,那麼請繼續這樣做。

但如果你主要使用的是 TensorFlow,那麼應該開始考慮一下 Keras API:

它內置於 TensorFlow 中;

它更容易使用;

當你需要使用 TensorFlow 來實現特定功能時,可以直接將其集成到 Keras 模型中。

我們的樣本數據集

CIFAR-10 數據集包含了 10 個分類,我們將它用在我們的演示中。

為簡單起見,我們將使用以下方法在 CIFAR-10 數據集上訓練兩個單獨的卷積神經網路:

TensorFlow + Keras;

tf.keras 的 Keras 子模塊。

我還將展示如何將自定義的 TensorFlow 代碼包含在 Keras 模型中。

我們的項目結構

可以使用 tree 命令在終端中查看我們的項目結構:

minivggnetkeras.py:MiniVGGNet(一個機遇 VGGNet 的深度學習模型)的 Keras 實現。

minivggnettf.py:MiniVGGNet 的 TensorFlow + Keras(即 tf.keras)實現。

項目根目錄包含兩個 Python 文件:

train_network_keras.py:Keras 版本的訓練腳本。

train_network_tf.py:TensorFlow + Keras 版本的訓練腳本,幾乎與前一個一模一樣。

每個腳本都將生成相應的訓練準確率和損失:

plot_keras.png

plot_tf.png

使用 Keras 訓練網路

訓練的第一步是使用 Keras 實現網路架構。

打開 minivggnetkeras.py 文件,並插入以下代碼:

我們先導入構建模型需要的一系列 Keras 包。

然後定義我們的 MiniVGGNetKeras 類:

我們定義了 build 方法、inputShape 和 input。

然後定義卷積神經網路的主要部分:

你會發現我們在應用池化層之前堆疊了一系列卷積、ReLU 激活和批量規範化層,以便減少卷的空間維度。還使用了 Dropout 來減少過擬合。

現在將全連接層添加到網路中:

我們已經使用 Keras 實現了 CNN,現在創建將用於訓練的驅動腳本。

打開 train_network_keras.py 並插入以下代碼:

我們先導入需要的包。

matplotlib 設置為「Agg」,這樣就可以將訓練結果保存為圖像文件。

然後導入 MiniVGGNetKeras 類。

我們使用 scikit-learn 的 LabelBinarizer 進行「獨熱」編碼,並使用 classification_report 列印分類精度。

然後導入數據集。

我們通過 --plot 傳入命令行參數,也就是圖像的保存路徑。

現在讓我們載入 CIFAR-10 數據集,並對標籤進行編碼:

我們先載入和提取訓練和測試分割,並將它們轉換為浮點數和進行數據縮放。

然後我們對標籤進行編碼,並初始化 labelNames。

接下來,讓我們開始訓練模型:

我們先設置訓練參數和優化方法。

然後我們使用 MiniVGGNetKeras.build 方法初始化和編譯模型。

隨後,我們啟動了訓練程序。

現在讓我們來評估網路並生成結果圖:

我們基於數據的測試分割來評估網路,並生成 classification_report,最後再導出結果。

注意:通常我會序列化並導出模型,以便可以將其用在圖像或視頻的處理腳本中,但這裡不打算這樣做,因為這超出了本文的範圍。

打開一個終端並執行以下命令:

我的 CPU 完成一個 epoch 需要 5 分多鐘。

我們獲得了 75%的準確率——當然不是最先進的,不過它比隨機猜測(1/10)要好得多。

對於小型網路來說,我們的準確率算是非常好的了,而且沒有發生過擬合。

使用 TensorFlow 和 tf.keras 訓練網路

使用 tf.keras 構建的 MiniVGGNet CNN 與我們直接使用 Keras 構建的模型是一樣的,除了為演示目的而修改的激活函數。

現在我們已經使用 Keras 庫實現並訓練了一個簡單的 CNN,接下來我們要:

使用 TensorFlow 的 tf.keras 實現相同的網路;

在 Keras 模型中包含一個 TensorFlow 激活函數,這個函數不是使用 Keras 實現的。

首先,打開 minivggnettf.py 文件,我們將實現 TensorFlow 版本的 MiniVGGNet:

請注意,導入部分只有一行。tf.keras 子模塊包含了我們可以直接調用的所有 Keras 函數。

我想強調一下 Lambda 層——它們用來插入自定義激活函數 CRELU(Concatenated ReLU)。

Keras 並沒有實現 CRELU,但 TensorFlow 實現了——通過使用 TensorFlow 和 tf.keras,我們可以使用一行代碼將 CRELU 添加到 Keras 模型中。

下一步是編寫 TensorFlow + Keras 驅動腳本來訓練 MiniVGGNetTF。

打開 train_network_tf.py 並插入以下代碼:

然後是解析命令行參數。

接著像之前一樣載入數據集。

其餘的行都一樣——提取訓練 / 測試分割和編碼標籤。

現在讓我們開始訓練模型:

訓練過程幾乎是一樣的。我們已經實現了完全相同的訓練流程,只是這次使用的是 tf.keras。

打開一個終端並執行以下命令:

訓練完成後,你將獲得類似於下面這樣的結果:

通過使用 CRELU 替換 RELU 激活函數,我們獲得了 76%的準確率。不過,這 1%的提升可能是因為網路權重的隨機初始化,需要通過進一步的交叉驗證實驗來證明這種準確率的提升確實是因為 CRELU。

不管怎樣,原始準確率並不是本節的重點。我們需要關注的是如何在 Keras 模型內部使用 TensorFlow 激活函數替換標準的 Keras 激活函數!

你也可以使用自己的自定義激活函數、損失 / 成本函數或層。

總結

在這篇文章中,我們討論了 Keras 和 TensorFlow 相關的問題,包括:

我應該在項目中使用 Keras 還是 TensorFlow?

TensorFlow 和 Keras 哪個更好?

我應該花時間研究 TensorFlow 還是 Keras?

最後我們發現,在 Keras 和 TensorFlow 之間做出選擇變得不那麼重要。

因為 Keras 庫已經通過 tf.keras 模塊直接集成到 TensorFlow 中了。

相關代碼下載:

https://app.monstercampaigns.com/c/hvovin011avqlrtdtz0j/

英文原文:

https://www.pyimagesearch.com/2018/10/08/keras-vs-tensorflow-which-one-is-better-and-which-one-should-i-learn/

(本文經授權轉載自「AI前線」,ID:ai-front)

【加入社群】

新智元 AI 技術 + 產業社群招募中,歡迎對 AI 技術 + 產業落地感興趣的同學,加小助手微信號:aiera2015_3入群;通過審核後我們將邀請進群,加入社群後務必修改群備註(姓名 - 公司 - 職位;專業群審核較嚴,敬請諒解)。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

手把手教你如何用Julia做GPU編程(附代碼)
NIPS數據告訴你中美AI差距有多大

TAG:新智元 |