Keras 簡(jiǎn)介
Keras 是一個(gè)用 Python 編寫(xiě)的高級(jí)神經(jīng)網(wǎng)絡(luò) API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為后端運(yùn)行。Keras 的開(kāi)發(fā)重點(diǎn)是支持快速的實(shí)驗(yàn)。能夠以最小的時(shí)延把你的想法轉(zhuǎn)換為實(shí)驗(yàn)結(jié)果,是做好研究的關(guān)鍵。 ————Keras官方定義
簡(jiǎn)單來(lái)說(shuō),Keras 是一個(gè)獨(dú)立的、機(jī)器學(xué)習(xí)的高級(jí) API ;而且在 TensorFlow2.0 發(fā)布之時(shí)被包含進(jìn)了 TensorFlow ,因此我們可以在 TensorFlow2.0 及其以后的版本中直接使用 Keras 。
1. Keras 是什么以及它的由來(lái)
Keras 的前身是 Fran?ois Chollet 為 ONEIROS 項(xiàng)目所的編寫(xiě)的代碼,在 2015 年開(kāi)源成為神經(jīng)網(wǎng)絡(luò)的開(kāi)發(fā)工具。Keras 最初參考了 Torch 的風(fēng)格并且完全由 Python 編寫(xiě)。
Keras 從創(chuàng)建之初到后來(lái)被 TensorFlow 所支持,經(jīng)歷了很多的變化,具體變化如下:
- Keras 最初在 2015 年被開(kāi)源發(fā)布,從誕生之初就被設(shè)計(jì)成為一個(gè)機(jī)器學(xué)習(xí)的高級(jí) API;
- Keras 在 2016 年發(fā)布了第一個(gè)正式版本 1.0.0,意味著進(jìn)入穩(wěn)定版本階段;
- 2017 年 Keras 發(fā)布了 2.0.0 版本并被整合進(jìn) TensorFlow;
- 2018 年在 TensorFlow2.0 公開(kāi)后便被正式確立為 tf.keras 高階 API;
- 直到如今,使用 tf.keras 依然是使用 TensorFlow 構(gòu)建模型的最快捷方式。
也就是說(shuō) Keras 并不是一個(gè)單獨(dú)的框架,他只是一個(gè)高級(jí)的 API 庫(kù);利用它簡(jiǎn)易和快速的原型設(shè)計(jì),我們可以根據(jù)其 API 實(shí)現(xiàn)高級(jí)網(wǎng)絡(luò)的構(gòu)建。進(jìn)而使用 TensorFlow 進(jìn)行訓(xùn)練等進(jìn)一步的工作。
而在本課程之中我們所提到的 Keras 都是指的是 TensorFlow 中的 Keras 模塊。
2. tf.Keras 與 TesnorFlow 結(jié)合的優(yōu)勢(shì)
說(shuō)到 Keras 與 TensorFlow1.x 的結(jié)合,就不得不說(shuō)一下 Keras 的特點(diǎn):
- Keras 基于 Python 發(fā)展而來(lái),因此它的使用符合 Python 開(kāi)發(fā)者的使用習(xí)慣
- Keras 提供的 API 較為高階,我們可以不用關(guān)心底層的實(shí)現(xiàn)的一些細(xì)節(jié)
- Keras 擁有友好、全面的文檔,我們可以輕松地進(jìn)行學(xué)習(xí)
- 便于使用,得益于高階 API ,我們可以輕松地實(shí)現(xiàn)模型的構(gòu)建與訓(xùn)練
- 擴(kuò)展性好,我們可以使用 TensorFlow 來(lái)擴(kuò)展 Keras ,從而實(shí)現(xiàn)更加定制化的需求
而 TensorFlow 最大的特點(diǎn)就在于快速、快捷,我們能夠以很高的性能實(shí)現(xiàn)一些模型的訓(xùn)練工作。
自 2017 年開(kāi)始,Keras 的大部分組件被整合至 Tensorflow 的 Python API中,但是卻沒(méi)有作為高階 API(tf.keras)整合進(jìn) TensorFlow 之中。因此大多數(shù)工作人員依然采用的是獨(dú)立安裝的 Kears 進(jìn)行高層模型的構(gòu)建,而使用 TensorFlow 作為底層框架進(jìn)行訓(xùn)練。
在 TensorFlow2.x 之中,我們便可以在 TensorFlow 之中使用 Keras ,從而將兩者的優(yōu)勢(shì)互相結(jié)合,一方面我們可以快速的構(gòu)建模型,另外一方面我們也可以進(jìn)行模型的快速訓(xùn)練。
3. 函數(shù)式 API 編程
說(shuō)到 Keras,就不得不說(shuō)一下 TensorFlow2.0 引入的函數(shù)式 API 編程。也就是 Eager Execution。
所謂函數(shù)式 API 編程,通俗來(lái)講就是我們每一個(gè)語(yǔ)句都是通過(guò)函數(shù)的調(diào)用來(lái)實(shí)現(xiàn)的,而這也意味著我們可以摒棄掉某一條語(yǔ)句的下文而單獨(dú)執(zhí)行。
這似乎很符合我們的編程的習(xí)慣,但是在 TensorFlow1.x 之中,并不默認(rèn)支持 Eager Execution 。通常來(lái)講我們?cè)?TensorFlow1.x 之中我們需要首先創(chuàng)建一個(gè) Session,然后才能運(yùn)行程序。
而隨著 Keras 的引入,TesnorFlow 開(kāi)始支持 Eager Execution,也就是說(shuō)我們可以完全采用函數(shù)調(diào)用的方式來(lái)進(jìn)行機(jī)器學(xué)習(xí)的開(kāi)發(fā)。這無(wú)疑大大降低了開(kāi)發(fā)的門(mén)檻,也可以幫助我們更加快捷、方便地進(jìn)行模型的相應(yīng)的工作。
我們可以來(lái)看一下具體代碼的區(qū)別,在 TensorFlow1.x 之中,我們?cè)谟?xùn)練的過(guò)程之中一般采用如下的方式進(jìn)行訓(xùn)練:
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
model.fit(X_train, y_train, validation_data=(X_valid, y_valid), epochs=10, batch_size=64)
可以看到,我們首先需要?jiǎng)?chuàng)建一個(gè)會(huì)話(tf.session),然后才能在其中進(jìn)行模型的訓(xùn)練操作。
而在 TensorFlow2.x 之中,我們只需要如下代碼就可以實(shí)現(xiàn)模型的訓(xùn)練:
model.fit(X_train, y_train, validation_data=(X_valid, y_valid), epochs=10, batch_size=64)
相信通過(guò)代碼的比對(duì)大家就可以輕松地看出 Eager Execution 的優(yōu)勢(shì):
- 程序流程明了,符合大多數(shù)Python工作者的編碼習(xí)慣;
- 代碼簡(jiǎn)單,方便運(yùn)行時(shí)調(diào)試;
- Eager Execution 提供了更加簡(jiǎn)潔明了的接口,而避免了 session 復(fù)雜易錯(cuò)的接口。
而在以后的學(xué)習(xí)與開(kāi)發(fā)之中,我們都會(huì)通過(guò) Eager Execution 模式來(lái)進(jìn)行。
4. 小結(jié)
TensorFlow 中的 Keras 模塊為一個(gè)新的、易用、快捷的模塊,我們可以依靠 Keras 模塊來(lái)快速地構(gòu)建網(wǎng)絡(luò)。同時(shí)它也擁有著高度的可擴(kuò)展性,我們可以使用 TensorFlow 對(duì)其進(jìn)行輕松的擴(kuò)展;從而大大提升我們的開(kāi)發(fā)效率。