今年 1 月 12 日,Keras 作者 François Chollet 在推特上表示因為中文讀者的廣泛關注,他已經在 GitHub 上展開了一個 Keras 中文文件專案。而昨日,François Chollet 再一次在推特上表示 Keras 官方文件已經基本完成!他非常感謝翻譯和校對人員兩個多月的不懈努力,也希望 Keras 中文使用者能繼續幫助提升文件質量。
這一次釋出的是 Keras 官方中文文件,它得到了嚴謹的校對而提升了整體質量。但該專案還在進行中,雖然目前已經上線了很多 API 文件和使用教程,但仍然有一部分內容沒有完成。其實早在官方中文文件出現以前,就有開發者構建了 Keras 的中文文件,而且很多讀者都在使用 MoyanZitto 等人構建的中文文件。
- Keras 官方文件:https://keras.io/zh/
- Keras 第三方文件:http://keras-cn.readthedocs.io/en/latest/
以下我們將簡要介紹這次官方釋出的 Keras 文件。
Keras 是一個用 Python 編寫的高階神經網路 API,它能夠以 TensorFlow、CNTK、或者 Theano 作為後端執行。Keras 的開發重點是支援快速的實驗。能夠以最小的時延把你的想法轉換為實驗結果,是做好研究的關鍵。
如果你有如下需求,請選擇 Keras:
- 允許簡單而快速的原型設計(使用者友好,高度模組化,可擴充套件性)。
- 同時支援卷積神經網路和迴圈神經網路,以及兩者的組合。
- 在 CPU 和 GPU 上無縫執行與切換。
Keras 相容的 Python 版本: Python 2.7-3.6。
Keras 相對於其它深度學習庫非常容易構建:首先它提供一致和簡單的 API;其次,它提供獨立的、完全可配置的模組構成序列或圖表以完成模型;最後,作為新的類和函式,新的模組很容易擴充套件。這樣說可能比較抽象,但正如文件中所描述的,我們甚至在 30 秒就能快速上手 Keras。所以在坑外徘徊或準備入坑 Keras 的小夥伴可以開心地開始你們的 30 秒。
快速開始:30 秒上手 Keras
Keras 的核心資料結構是 model,一種組織網路層的方式。最簡單的模型是 Sequential 模型,它是由多網路層線性堆疊的棧。對於更復雜的結構,你應該使用 Keras 函式式 API,它允許構建任意的神經網路圖。
Sequential 模型如下所示:
from keras.models import Sequential
model = Sequential()複製程式碼
可以簡單地使用 .add() 來堆疊模型:
from keras.layers import Dense
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))複製程式碼
在完成了模型的構建後, 可以使用 .compile() 來配置學習過程:
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])複製程式碼
如果需要,你還可以進一步地配置優化器。Keras 的一個核心原則是使事情變得相當簡單,同時又允許使用者在需要的時候能夠進行完全的控制(終極的控制是原始碼的易擴充套件性)。
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))複製程式碼
現在,你可以批量地在訓練資料上進行迭代了:
# x_train and y_train are Numpy arrays --just like in the Scikit-Learn API.
model.fit(x_train, y_train, epochs=5, batch_size=32)複製程式碼
或者,你可以手動地將批次的資料提供給模型:
model.train_on_batch(x_batch, y_batch)複製程式碼
只需一行程式碼就能評估模型效能:
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)複製程式碼
或者對新的資料生成預測:
classes = model.predict(x_test, batch_size=128)複製程式碼
構建一個問答系統,一個影象分類模型,一個神經圖靈機,或者其他的任何模型,就是這麼的快。深度學習背後的思想很簡單,那麼它們的實現又何必要那麼痛苦呢?
使用簡介
Keras 模型的使用一般可以分為順序模型(Sequential)和 Keras 函式式 API,順序模型是多個網路層的線性堆疊,而 Keras 函式式 API 是定義複雜模型(如多輸出模型、有向無環圖,或具有共享層的模型)的方法。以下將簡要介紹兩種模型的使用方法:
1.Keras 順序模型
你可以通過將層的列表傳遞給 Sequential 的建構函式,來建立一個 Sequential 模型:
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])複製程式碼
也可以使用 .add() 方法將各層新增到模型中:
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))複製程式碼
如下展示了一個完整的模型,即基於多層感知器 (MLP) 的 softmax 多分類:
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
# 生成虛擬資料
import numpy as np
x_train = np.random.random((1000, 20))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
model = Sequential()
# Dense(64) 是一個具有 64 個隱藏神經元的全連線層。
# 在第一層必須指定所期望的輸入資料尺寸,在這裡是一個 20 維的向量。
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
score = model.evaluate(x_test, y_test, batch_size=128)複製程式碼
2. Keras 函式式 API
利用函式式 API,可以輕易地重用訓練好的模型:可以將任何模型看作是一個層,然後通過傳遞一個張量來呼叫它。注意,在呼叫模型時,您不僅重用模型的結構,還重用了它的權重。
以下是函式式 API 的一個很好的例子:具有多個輸入和輸出的模型。函式式 API 使處理大量交織的資料流變得容易。
來考慮下面的模型。我們試圖預測 Twitter 上的一條新聞標題有多少轉發和點贊數。模型的主要輸入將是新聞標題本身,即一系列詞語,但是為了增添趣味,我們的模型還新增了其他的輔助輸入來接收額外的資料,例如新聞標題的釋出的時間等。該模型也將通過兩個損失函式進行監督學習。較早地在模型中使用主損失函式,是深度學習模型的一個良好正則方法。
模型結構如下圖所示:
讓我們用函式式 API 來實現它(詳細解釋請檢視中文文件):
from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model
# 標題輸入:接收一個含有 100 個整數的序列,每個整數在 1 到 10000 之間。
# 注意我們可以通過傳遞一個 `name` 引數來命名任何層。
main_input = Input(shape=(100,), dtype='int32', name='main_input')
# Embedding 層將輸入序列編碼為一個稠密向量的序列,每個向量維度為 512。
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
# LSTM 層把向量序列轉換成單個向量,它包含整個序列的上下文資訊
lstm_out = LSTM(32)(x)
auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])
# 堆疊多個全連線網路層
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
# 最後新增主要的邏輯迴歸層
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])
model.compile(optimizer='rmsprop', loss='binary_crossentropy',
loss_weights=[1., 0.2])
model.fit([headline_data, additional_data], [labels, labels],
epochs=50, batch_size=32)
model.compile(optimizer='rmsprop',
loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
loss_weights={'main_output': 1., 'aux_output': 0.2})
# 然後使用以下方式訓練:
model.fit({'main_input': headline_data, 'aux_input': additional_data},
{'main_output': labels, 'aux_output': labels},
epochs=50, batch_size=32)複製程式碼
以上只是一個簡單的案例,Keras 函式式 API 還有非常多的應用案例,包括層級共享、有向無環圖和殘差網路等頂尖視覺模型,讀者可以繼續閱讀中文文件瞭解更多。
文件的後一部分更多是描述 Keras 中常用的函式與 API,包括 Keras 模型、層級函式、預處理過程、損失函式、最優化方法、資料集和視覺化等。這些 API 和對應實現的功能其實很多時候可以在實際使用的時候再查詢,當然最基本的 API 我們還是需要了解的。以下將簡要介紹 Keras 模型和層級 API,其它的模組請查閱原中文文件。
Keras 模型
在 Keras 中有兩類模型,順序模型 和 使用函式式 API 的 Model 類模型。這些模型有許多共同的方法:
- model.summary(): 列印出模型概述資訊。它是 utils.print_summary 的簡捷呼叫。
- model.get_config(): 返回包含模型配置資訊的字典。通過以下程式碼,就可以根據這些配置資訊重新例項化模型:
config = model.get_config()
model = Model.from_config(config)
# or, for Sequential:
model = Sequential.from_config(config)複製程式碼
- model.get_weights(): 返回模型權重的張量列表,型別為 Numpy array。
- model.set_weights(weights): 從 Nympy array 中為模型設定權重。列表中的陣列必須與 get_weights() 返回的權重具有相同的尺寸。
- model.to_json(): 以 JSON 字串的形式返回模型的表示。請注意,該表示不包括權重,只包含結構。你可以通過以下程式碼,從 JSON 字串中重新例項化相同的模型(帶有重新初始化的權重):
from keras.models import model_from_json
json_string = model.to_json()
model = model_from_json(json_string)複製程式碼
- model.to_yaml(): 以 YAML 字串的形式返回模型的表示。請注意,該表示不包括權重,只包含結構。你可以通過以下程式碼,從 YAML 字串中重新例項化相同的模型(帶有重新初始化的權重):
from keras.models import model_from_yaml
yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)複製程式碼
- model.save_weights(filepath): 將模型權重儲存為 HDF5 檔案。
- model.load_weights(filepath, by_name=False): 從 HDF5 檔案(由 save_weights 建立)中載入權重。預設情況下,模型的結構應該是不變的。如果想將權過載入不同的模型(部分層相同),設定 by_name=True 來載入那些名字相同的層的權重。
Keras 層級
所有 Keras 層都有很多共同的函式:
- layer.get_weights(): 以 Numpy 矩陣的形式返回層的權重。
- layer.set_weights(weights): 從 Numpy 矩陣中設定層的權重(與 get_weights 的輸出形狀相同)。
- layer.get_config(): 返回包含層配置的字典。此圖層可以通過以下方式重置:
layer = Dense(32)
config = layer.get_config()
reconstructed_layer = Dense.from_config(config)複製程式碼
如果一個層具有單個節點 (i.e. 如果它不是共享層), 你可以得到它的輸入張量,輸出張量,輸入尺寸和輸出尺寸:
- layer.input
- layer.output
- layer.input_shape
- layer.output_shape
如果層有多個節點,您可以使用以下函式:
- 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)
這些是 Keras 模型與層級基本的函式,文件的中心內容也是這一部分和下面描述的 API 用途與引數,它包括完整模型所需要的各個模組,包括資料、預處理、網路架構、訓練、評估和視覺化等。但這一部分我們並不會介紹,因為很多時候我們只有在遇到未知的函式時才會詳細查閱。
Keras 官方中文文件,歡迎各位徘徊者入坑。