1.關(guān)于Keras

        1)簡(jiǎn)介          

         Keras是由純python編寫的基于theano/tensorflow的深度學(xué)習(xí)框架。

         Keras是一個(gè)高層神經(jīng)網(wǎng)絡(luò)API,支持快速實(shí)驗(yàn),能夠把你的idea迅速轉(zhuǎn)換為結(jié)果,如果有如下需求,可以優(yōu)先選擇Keras:

                a)簡(jiǎn)易和快速的原型設(shè)計(jì)(keras具有高度模塊化,極簡(jiǎn),和可擴(kuò)充特性)

                b)支持CNN和RNN,或二者的結(jié)合

                c)無縫CPU和GPU切換

         2)設(shè)計(jì)原則

               a)用戶友好:Keras是為人類而不是天頂星人設(shè)計(jì)的API。用戶的使用體驗(yàn)始終是我們考慮的首要和中心內(nèi)容。Keras遵循減少認(rèn)知困難的最佳實(shí)踐:Keras提供一致而簡(jiǎn)潔的API, 能夠極大減少一般應(yīng)用下用戶的工作量,同時(shí),Keras提供清晰和具有實(shí)踐意義的bug反饋。

               b)模塊性:模型可理解為一個(gè)層的序列或數(shù)據(jù)的運(yùn)算圖,完全可配置的模塊可以用最少的代價(jià)自由組合在一起。具體而言,網(wǎng)絡(luò)層、損失函數(shù)、優(yōu)化器、初始化策略、激活函數(shù)、正則化方法都是獨(dú)立的模塊,你可以使用它們來構(gòu)建自己的模型。

              c)易擴(kuò)展性:添加新模塊超級(jí)容易,只需要仿照現(xiàn)有的模塊編寫新的類或函數(shù)即可。創(chuàng)建新模塊的便利性使得Keras更適合于先進(jìn)的研究工作。

              d)與Python協(xié)作:Keras沒有單獨(dú)的模型配置文件類型(作為對(duì)比,caffe有),模型由python代碼描述,使其更緊湊和更易debug,并提供了擴(kuò)展的便利性。

 

2.Keras的模塊結(jié)構(gòu)

   萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

3.使用Keras搭建一個(gè)神經(jīng)網(wǎng)絡(luò)

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

4.主要概念

   1)符號(hào)計(jì)算

        Keras的底層庫使用Theano或TensorFlow,這兩個(gè)庫也稱為Keras的后端。無論是Theano還是TensorFlow,都是一個(gè)“符號(hào)式”的庫。符號(hào)計(jì)算首先定義各種變量,然后建立一個(gè)“計(jì)算圖”,計(jì)算圖規(guī)定了各個(gè)變量之間的計(jì)算關(guān)系。

       符號(hào)計(jì)算也叫數(shù)據(jù)流圖,其過程如下(gif圖不好打開,所以用了靜態(tài)圖,數(shù)據(jù)是按圖中黑色帶箭頭的線流動(dòng)的):

        萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

     2)張量

          張量(tensor),可以看作是向量、矩陣的自然推廣,用來表示廣泛的數(shù)據(jù)類型。張量的階數(shù)也叫維度。

          0階張量,即標(biāo)量,是一個(gè)數(shù)。

          1階張量,即向量,一組有序排列的數(shù)

          2階張量,即矩陣,一組向量有序的排列起來

          3階張量,即立方體,一組矩陣上下排列起來

          4階張量......
          依次類推

          重點(diǎn):關(guān)于維度的理解

          假如有一個(gè)10長(zhǎng)度的列表,那么我們橫向看有10個(gè)數(shù)字,也可以叫做10維度,縱向看只能看到1個(gè)數(shù)字,那么就叫1維度。注意這個(gè)區(qū)別有助于理解Keras或者神經(jīng)網(wǎng)絡(luò)中計(jì)算時(shí)出現(xiàn)的維度問題。

    3)數(shù)據(jù)格式(data_format)

        目前主要有兩種方式來表示張量:
        a) th模式或channels_first模式,Theano和caffe使用此模式。
        b)tf模式或channels_last模式,TensorFlow使用此模式。

 
        下面舉例說明兩種模式的區(qū)別:
         對(duì)于100張RGB3通道的16×32(高為16寬為32)彩色圖,
         th表示方式:(100,3,16,32)
         tf表示方式:(100,16,32,3)
         唯一的區(qū)別就是表示通道個(gè)數(shù)3的位置不一樣。

     4)模型

          Keras有兩種類型的模型,序貫?zāi)P停⊿equential)和函數(shù)式模型(Model),函數(shù)式模型應(yīng)用更為廣泛,序貫?zāi)P褪呛瘮?shù)式模型的一種特殊情況。
          a)序貫?zāi)P停⊿equential):單輸入單輸出,一條路通到底,層與層之間只有相鄰關(guān)系,沒有跨層連接。這種模型編譯速度快,操作也比較簡(jiǎn)單
          b)函數(shù)式模型(Model):多輸入多輸出,層與層之間任意連接。這種模型編譯速度慢。

 

5.第一個(gè)示例

          這里也采用介紹神經(jīng)網(wǎng)絡(luò)時(shí)常用的一個(gè)例子:手寫數(shù)字的識(shí)別。

          在寫代碼之前,基于這個(gè)例子介紹一些概念,方便大家理解。

          PS:可能是版本差異的問題,官網(wǎng)中的參數(shù)和示例中的參數(shù)是不一樣的,官網(wǎng)中給出的參數(shù)少,并且有些參數(shù)支持,有些不支持。所以此例子去掉了不支持的參數(shù),并且只介紹本例中用到的參數(shù)。

          1)Dense(500,input_shape=(784,))

               a)Dense層屬于網(wǎng)絡(luò)層-->常用層中的一個(gè)層

               b) 500表示輸出的維度,完整的輸出表示:(*,500):即輸出任意個(gè)500維的數(shù)據(jù)流。但是在參數(shù)中只寫維度就可以了,比較具體輸出多少個(gè)是有輸入確定的。換個(gè)說法,Dense的輸出其實(shí)是個(gè)N×500的矩陣。

              c)input_shape(784,) 表示輸入維度是784(28×28,后面具體介紹為什么),完整的輸入表示:(*,784):即輸入N個(gè)784維度的數(shù)據(jù)

         2)Activation('tanh')

              a)Activation:激活層

              b)'tanh' :激活函數(shù)

         3)Dropout(0.5)

              在訓(xùn)練過程中每次更新參數(shù)時(shí)隨機(jī)斷開一定百分比(rate)的輸入神經(jīng)元,防止過擬合。

         4)數(shù)據(jù)集

             數(shù)據(jù)集包括60000張28×28的訓(xùn)練集和10000張28×28的測(cè)試集及其對(duì)應(yīng)的目標(biāo)數(shù)字。如果完全按照上述數(shù)據(jù)格式表述,以tensorflow作為后端應(yīng)該是(60000,28,28,3),因?yàn)槭纠胁捎昧薽nist.load_data()獲取數(shù)據(jù)集,所以已經(jīng)判斷使用了tensorflow作為后端,因此數(shù)據(jù)集就變成了(60000,28,28),那么input_shape(784,)應(yīng)該是input_shape(28,28,)才對(duì),但是在這個(gè)示例中這么寫是不對(duì)的,需要轉(zhuǎn)換成(60000,784),才可以。為什么需要轉(zhuǎn)換呢?

           萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

              如上圖,訓(xùn)練集(60000,28,28)作為輸入,就相當(dāng)于一個(gè)立方體,而輸入層從當(dāng)前角度看就是一個(gè)平面,立方體的數(shù)據(jù)流怎么進(jìn)入平面的輸入層進(jìn)行計(jì)算呢?所以需要進(jìn)行黃色箭頭所示的變換,然后才進(jìn)入輸入層進(jìn)行后續(xù)計(jì)算。至于從28*28變換成784之后輸入層如何處理,就不需要我們關(guān)心了。(喜歡鉆研的同學(xué)可以去研究下源代碼)。

         并且,Keras中輸入多為(nb_samples, input_dim)的形式:即(樣本數(shù)量,輸入維度)。

        5)示例代碼

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

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()'''
   第二步:構(gòu)建網(wǎng)絡(luò)層'''model.add(Dense(500,input_shape=(784,))) # 輸入層,28*28=784  model.add(Activation('tanh')) # 激活函數(shù)是tanh  model.add(Dropout(0.5)) # 采用50%的dropoutmodel.add(Dense(500)) # 隱藏層節(jié)點(diǎn)500個(gè)  model.add(Activation('tanh'))  
model.add(Dropout(0.5))

model.add(Dense(10)) # 輸出結(jié)果是10個(gè)類別,所以維度是10  model.add(Activation('softmax')) # 最后一層用softmax作為激活函數(shù)'''
   第三步:編譯'''sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 優(yōu)化函數(shù),設(shè)定學(xué)習(xí)率(lr)等參數(shù)  model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作為loss函數(shù)'''
   第四步:訓(xùn)練
   .fit的一些參數(shù)
   batch_size:對(duì)總的樣本數(shù)進(jìn)行分組,每組包含的樣本數(shù)量
   epochs :訓(xùn)練次數(shù)
   shuffle:是否把數(shù)據(jù)隨機(jī)打亂之后再進(jìn)行訓(xùn)練
   validation_split:拿出百分之多少用來做交叉驗(yàn)證
   verbose:屏顯模式 0:不輸出  1:輸出進(jìn)度  2:輸出每次的訓(xùn)練結(jié)果'''(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數(shù)據(jù)(第一次需要聯(lián)網(wǎng))# 由于mist的輸入數(shù)據(jù)維度是(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)))

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

http://www.cnblogs.com/lc1217/p/7132364.html