1.關於Keraspython
1)簡介 後端
Keras是由純python編寫的基於theano/tensorflow的深度學習框架。網絡
Keras是一個高層神經網絡API,支持快速實驗,可以把你的idea迅速轉換爲結果,若是有以下需求,能夠優先選擇Keras:框架
a)簡易和快速的原型設計(keras具備高度模塊化,極簡,和可擴充特性)ide
b)支持CNN和RNN,或兩者的結合模塊化
c)無縫CPU和GPU切換函數
2)設計原則工具
a)用戶友好:Keras是爲人類而不是天頂星人設計的API。用戶的使用體驗始終是咱們考慮的首要和中心內容。Keras遵循減小認知困難的最佳實踐:Keras提供一致而簡潔的API, 可以極大減小通常應用下用戶的工做量,同時,Keras提供清晰和具備實踐意義的bug反饋。學習
b)模塊性:模型可理解爲一個層的序列或數據的運算圖,徹底可配置的模塊能夠用最少的代價自由組合在一塊兒。具體而言,網絡層、損失函數、優化器、初始化策略、激活函數、正則化方法都是獨立的模塊,你可使用它們來構建本身的模型。測試
c)易擴展性:添加新模塊超級容易,只須要仿照現有的模塊編寫新的類或函數便可。建立新模塊的便利性使得Keras更適合於先進的研究工做。
d)與Python協做:Keras沒有單獨的模型配置文件類型(做爲對比,caffe有),模型由python代碼描述,使其更緊湊和更易debug,並提供了擴展的便利性。
2.Keras的模塊結構
3.使用Keras搭建一個神經網絡
4.主要概念
1)符號計算
Keras的底層庫使用Theano或TensorFlow,這兩個庫也稱爲Keras的後端。不管是Theano仍是TensorFlow,都是一個「符號式」的庫。符號計算首先定義各類變量,而後創建一個「計算圖」,計算圖規定了各個變量之間的計算關係。
符號計算也叫數據流圖,其過程以下(gif圖很差打開,因此用了靜態圖,數據是按圖中黑色帶箭頭的線流動的):
2)張量
張量(tensor),能夠看做是向量、矩陣的天然推廣,用來表示普遍的數據類型。張量的階數也叫維度。
0階張量,即標量,是一個數。
1階張量,即向量,一組有序排列的數
2階張量,即矩陣,一組向量有序的排列起來
3階張量,即立方體,一組矩陣上下排列起來
4階張量......
依次類推
重點:關於維度的理解
假若有一個10長度的列表,那麼咱們橫向看有10個數字,也能夠叫作10維度,縱向看只能看到1個數字,那麼就叫1維度。注意這個區別有助於理解Keras或者神經網絡中計算時出現的維度問題。
3)數據格式(data_format)
目前主要有兩種方式來表示張量:
a) th模式或channels_first模式,Theano和caffe使用此模式。
b)tf模式或channels_last模式,TensorFlow使用此模式。
下面舉例說明兩種模式的區別:
對於100張RGB3通道的16×32(高爲16寬爲32)彩色圖,
th表示方式:(100,3,16,32)
tf表示方式:(100,16,32,3)
惟一的區別就是表示通道個數3的位置不同。
4)模型
Keras有兩種類型的模型,序貫模型(Sequential)和函數式模型(Model),函數式模型應用更爲普遍,序貫模型是函數式模型的一種特殊狀況。
a)序貫模型(Sequential):單輸入單輸出,一條路通到底,層與層之間只有相鄰關係,沒有跨層鏈接。這種模型編譯速度快,操做也比較簡單
b)函數式模型(Model):多輸入多輸出,層與層之間任意鏈接。這種模型編譯速度慢。
5.第一個示例
這裏也採用介紹神經網絡時經常使用的一個例子:手寫數字的識別。
在寫代碼以前,基於這個例子介紹一些概念,方便你們理解。
PS:多是版本差別的問題,官網中的參數和示例中的參數是不同的,官網中給出的參數少,而且有些參數支持,有些不支持。因此此例子去掉了不支持的參數,而且只介紹本例中用到的參數。
1)Dense(500,input_shape=(784,))
a)Dense層屬於網絡層-->經常使用層中的一個層
b) 500表示輸出的維度,完整的輸出表示:(*,500):即輸出任意個500維的數據流。可是在參數中只寫維度就能夠了,比較具體輸出多少個是有輸入肯定的。換個說法,Dense的輸出實際上是個N×500的矩陣。
c)input_shape(784,) 表示輸入維度是784(28×28,後面具體介紹爲何),完整的輸入表示:(*,784):即輸入N個784維度的數據
2)Activation('tanh')
a)Activation:激活層
b)'tanh' :激活函數
3)Dropout(0.5)
在訓練過程當中每次更新參數時隨機斷開必定百分比(rate)的輸入神經元,防止過擬合。
4)數據集
數據集包括60000張28×28的訓練集和10000張28×28的測試集及其對應的目標數字。若是徹底按照上述數據格式表述,以tensorflow做爲後端應該是(60000,28,28,3),由於示例中採用了mnist.load_data()獲取數據集,因此已經判斷使用了tensorflow做爲後端,所以數據集就變成了(60000,28,28),那麼input_shape(784,)應該是input_shape(28,28,)纔對,可是在這個示例中這麼寫是不對的,須要轉換成(60000,784),才能夠。爲何須要轉換呢?
如上圖,訓練集(60000,28,28)做爲輸入,就至關於一個立方體,而輸入層從當前角度看就是一個平面,立方體的數據流怎麼進入平面的輸入層進行計算呢?因此須要進行黃色箭頭所示的變換,而後才進入輸入層進行後續計算。至於從28*28變換成784以後輸入層如何處理,就不須要咱們關心了。(喜歡鑽研的同窗能夠去研究下源代碼)。
而且,Keras中輸入多爲(nb_samples, input_dim)的形式:即(樣本數量,輸入維度)。
5)示例代碼
from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.optimizers import SGD from keras.datasets import mnist import numpy ''' 第一步:選擇模型 ''' model = Sequential() ''' 第二步:構建網絡層 ''' model.add(Dense(500,input_shape=(784,))) # 輸入層,28*28=784 model.add(Activation('tanh')) # 激活函數是tanh model.add(Dropout(0.5)) # 採用50%的dropout model.add(Dense(500)) # 隱藏層節點500個 model.add(Activation('tanh')) model.add(Dropout(0.5)) model.add(Dense(10)) # 輸出結果是10個類別,因此維度是10 model.add(Activation('softmax')) # 最後一層用softmax做爲激活函數 ''' 第三步:編譯 ''' sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 優化函數,設定學習率(lr)等參數 model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵做爲loss函數 ''' 第四步:訓練 .fit的一些參數 batch_size:對總的樣本數進行分組,每組包含的樣本數量 epochs :訓練次數 shuffle:是否把數據隨機打亂以後再進行訓練 validation_split:拿出百分之多少用來作交叉驗證 verbose:屏顯模式 0:不輸出 1:輸出進度 2:輸出每次的訓練結果 ''' (X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數據(第一次須要聯網) # 因爲mist的輸入數據維度是(num, 28, 28),這裏須要把後面的維度直接拼起來變成784維 X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2]) Y_train = (numpy.arange(10) == y_train[:, None]).astype(int) Y_test = (numpy.arange(10) == y_test[:, None]).astype(int) model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3) model.evaluate(X_test, Y_test, batch_size=200, verbose=0) ''' 第五步:輸出 ''' print("test set") scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0) print("") print("The test loss is %f" % scores) result = model.predict(X_test,batch_size=200,verbose=0) result_max = numpy.argmax(result, axis = 1) test_max = numpy.argmax(Y_test, axis = 1) result_bool = numpy.equal(result_max, test_max) true_num = numpy.sum(result_bool) print("") print("The accuracy of the model is %f" % (true_num/len(result_bool)))