天天看點

深度學習:Keras入門(一)之基礎篇

作者:AI喬治
深度學習:Keras入門(一)之基礎篇

1.關于Keras

1)簡介

Keras是由純python編寫的基于theano/tensorflow的深度學習架構。

Keras是一個高層神經網絡API,支援快速實驗,能夠把你的idea迅速轉換為結果,如果有如下需求,可以優先選擇Keras:

a)簡易和快速的原型設計(keras具有高度子產品化,極簡,和可擴充特性)

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的子產品結構

深度學習:Keras入門(一)之基礎篇

3.使用Keras搭建一個神經網絡

深度學習:Keras入門(一)之基礎篇

4.主要概念

1)符号計算

Keras的底層庫使用Theano或TensorFlow,這兩個庫也稱為Keras的後端。無論是Theano還是TensorFlow,都是一個“符号式”的庫。符号計算首先定義各種變量,然後建立一個“計算圖”,計算圖規定了各個變量之間的計算關系。

符号計算也叫資料流圖,其過程如下(gif圖不好打開,是以用了靜态圖,資料是按圖中黑色帶箭頭的線流動的):

深度學習:Keras入門(一)之基礎篇

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),才可以。為什麼需要轉換呢?

深度學習:Keras入門(一)之基礎篇

如上圖,訓練集(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)))           

為幫助更多對人工智能感興趣的小夥伴們能夠有效的系統性的學習以及論文的研究,小編特意制作整理了一份人工智能學習資料給大家,整理了很久,非常全面。

大緻内容包括一些人工智能基礎入門視訊和文檔+AI常用架構實戰視訊、計算機視覺、機器學習、圖像識别、NLP、OpenCV、YOLO、pytorch、深度學習與神經網絡等學習資料、課件源碼、國内外知名精華資源、以及AI熱門論文等全套學習資料。

深度學習:Keras入門(一)之基礎篇

需要以上這些文中提到的資料,請先關注作者頭條【AI喬治】,回複【666】,即可免費擷取~~~~

每一個專欄都是大家非常關心,和非常有價值的話題,如果我的文章對你有所幫助,還請幫忙點贊、好評、轉發一下,你的支援會激勵我輸出更高品質的文章,非常感謝!

深度學習:Keras入門(一)之基礎篇

繼續閱讀