keras入門簡介
一、keras介紹
Keras (κ?ρα?) 在希臘語中意為 號角 。它來自古希臘和拉丁文學中的一個文學形象,首先出現于 《奧德賽》 中, 夢神 (Oneiroi, singular Oneiros) 從這兩類人中分離出來:那些用虛幻的景象欺騙人類,通過象牙之門抵達地球之人,以及那些宣告未來即將到來,通過號角之門抵達之人。
Keras是一個高層神經網絡API,Keras由純Python編寫而成并基Tensorflow、Theano以及CNTK后端。Keras 為支持快速實驗而生,能夠把你的idea迅速轉換為結果,如果你有如下需求,請選擇Keras:
- 簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性)
- 支持CNN和RNN,或二者的結合
- 無縫CPU和GPU切換
Keras的設計原則是
- 用戶友好:Keras是為人類而不是天頂星人設計的API。用戶的使用體驗始終是我們考慮的首要和中心內容。Keras遵循減少認知困難的最佳實踐:Keras提供一致而簡潔的API, 能夠極大減少一般應用下用戶的工作量,同時,Keras提供清晰和具有實踐意義的bug反饋。
- 模塊性:模型可理解為一個層的序列或數據的運算圖,完全可配置的模塊可以用最少的代價自由組合在一起。具體而言,網絡層、損失函數、優化器、初始化策略、激活函數、正則化方法都是獨立的模塊,你可以使用它們來構建自己的模型。
- 易擴展性:添加新模塊超級容易,只需要仿照現有的模塊編寫新的類或函數即可。創建新模塊的便利性使得Keras更適合于先進的研究工作。
- 與Python協作:Keras沒有單獨的模型配置文件類型(作為對比,caffe有),模型由python代碼描述,使其更緊湊和更易debug,并提供了擴展的便利性。
二、序貫模型
Keras中主要的模型是Sequential模型,Sequential是一系列網絡層按順序構成的棧,也就是“一條路走到黑”。
from keras.models import Sequential from keras.layers import Dense, Activation #定義模型 model = Sequential() #添加第一層神經網絡,第一層需要明確輸入的維度,這里是100,64表示輸入層后面的隱藏層節點數 model.add(Dense(units=64, input_dim=100)) model.add(Activation("relu")) #添加第二層神經網絡,第二層就不需要明確輸入層,上面的64個節點的隱藏層就是該輸入層,該層的節點數是10 model.add(Dense(units=10)) model.add(Activation("softmax")) #深度模型框架搭建好后,需要編譯模型;編譯模型時必須指明損失函數和優化器 model.compile(loss=\'categorical_crossentropy\', optimizer=\'sgd\', metrics=[\'accuracy\']) #也可以自己定制損失函數 from keras.optimizers import SGD model.compile(loss=\'categorical_crossentropy\', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True)) #完成模型編譯后,我們在訓練數據上按batch進行一定次數的迭代來訓練網絡 model.fit(x_train, y_train, epochs=5, batch_size=32) #當然,我們也可以手動將一個個batch的數據送入網絡中訓練,這時候需要使用: 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)
序貫模型細節參考:https://keras-cn.readthedocs.io/en/latest/getting_started/sequential_model/
三、函數式(Functional)模型
函數式模型的輸入是張量,輸出也是張量。
from keras.layers import Input, Dense from keras.models import Model # 輸入層 inputs = Input(shape=(784,)) #Dense的輸入是張量,輸出也是張量 x = Dense(64, activation=\'relu\')(inputs) #第一個隱藏層 x = Dense(64, activation=\'relu\')(x) #第二個隱藏層 predictions = Dense(10, activation=\'softmax\')(x) #輸出層 model = Model(inputs=inputs, outputs=predictions) model.compile(optimizer=\'rmsprop\', loss=\'categorical_crossentropy\', metrics=[\'accuracy\']) model.fit(data, labels) # 開始訓練
利用函數式模型的接口,我們可以很容易的重用已經訓練好的模型:你可以把模型當作一個層一樣,通過提供一個tensor來調用它。注意當你調用一個模型時,你不僅僅重用了它的結構,也重用了它的權重。
x = Input(shape=(784,)) # This works, and returns the 10-way softmax we defined above. y = model(x)
四、例子
1)回歸模型
# Regressor example # Code: https://github.com/keloli/KerasPractise/edit/master/Regressor.py import numpy as np np.random.seed(1337) from keras.models import Sequential from keras.layers import Dense import matplotlib.pyplot as plt # 創建數據集 X = np.linspace(-1, 1, 200) np.random.shuffle(X) # 將數據集隨機化 Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200, )) # 假設我們真實模型為:Y=0.5X+2 # 繪制數據集plt.scatter(X, Y) plt.show() X_train, Y_train = X[:160], Y[:160] # 把前160個數據放到訓練集 X_test, Y_test = X[160:], Y[160:] # 把后40個點放到測試集 # 定義一個model, model = Sequential () # Keras有兩種類型的模型,序貫模型(Sequential)和函數式模型 # 比較常用的是Sequential,它是單輸入單輸出的 model.add(Dense(output_dim=1, input_dim=1)) # 通過add()方法一層層添加模型 # Dense是全連接層,第一層需要定義輸入, # 第二層無需指定輸入,一般第二層把第一層的輸出作為輸入 # 定義完模型就需要訓練了,不過訓練之前我們需要指定一些訓練參數 # 通過compile()方法選擇損失函數和優化器 # 這里我們用均方誤差作為損失函數,隨機梯度下降作為優化方法 model.compile(loss=\'mse\', optimizer=\'sgd\') # 開始訓練 print(\'Training -----------\') for step in range(301): cost = model.train_on_batch(X_train, Y_train) # Keras有很多開始訓練的函數,這里用train_on_batch() if step % 100 == 0: print(\'train cost: \', cost) # 測試訓練好的模型 print(\'\nTesting ------------\') cost = model.evaluate(X_test, Y_test, batch_size=40) print(\'test cost:\', cost) W, b = model.layers[0].get_weights() # 查看訓練出的網絡參數 # 由于我們網絡只有一層,且每次訓練的輸入只有一個,輸出只有一個 # 因此第一層訓練出Y=WX+B這個模型,其中W,b為訓練出的參數 print(\'Weights=\', W, \'\nbiases=\', b) # plotting the prediction Y_pred = model.predict(X_test) plt.scatter(X_test, Y_test) plt.plot(X_test, Y_pred) plt.show()
2) 手寫數字識別
# _*_ coding: utf-8 _*_ # Classifier mnist import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import RMSprop # 下載數據集 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 數據預處處理 X_train = X_train.reshape(X_train.shape[0], -1) / 255. X_test = X_test.reshape(X_test.shape[0], -1) / 255. y_train = np_utils.to_categorical(y_train, num_classes=10) y_test = np_utils.to_categorical(y_test, num_classes=10) # 不使用model.add(),用以下方式也可以構建網絡 model = Sequential([ Dense(400, input_dim=784), Activation(\'relu\'), Dense(10), Activation(\'softmax\'), ]) # 定義優化器 rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) model.compile(optimizer=rmsprop, loss=\'categorical_crossentropy\', metrics=[\'accuracy\']) # metrics賦值為\'accuracy\',會在訓練過程中輸出正確率 # 這次我們用fit()來訓練網路 print(\'Training ------------\') model.fit(X_train, y_train, epochs=4, batch_size=32) print(\'\nTesting ------------\') # 評價訓練出的網絡 loss, accuracy = model.evaluate(X_test, y_test) print(\'test loss: \', loss) print(\'test accuracy: \', accuracy)
參考鏈接:
https://www.jianshu.com/p/e9c1e68a615e