keras入门之手写字识别python代码
?
Keras是Python中以CNTK、Tensorflow或者Theano為計(jì)算后臺(tái)的一個(gè)深度學(xué)習(xí)建模環(huán)境。相對(duì)于其他深度學(xué)習(xí)的計(jì)算軟件,如:Tensorflow、Theano、Caffe等,Keras在實(shí)際應(yīng)用中有一些顯著的優(yōu)點(diǎn),其中最主要的優(yōu)點(diǎn)就是Keras已經(jīng)高度模塊化了,支持現(xiàn)有的常見(jiàn)模型(CNN、RNN等),更重要的是建模過(guò)程相當(dāng)方便快速,加快了開(kāi)發(fā)速度。
?
?
1.核心層(各層函數(shù)只介紹一些常用參數(shù),詳細(xì)參數(shù)介紹可查閱Keras文檔)
1.1全連接層:神經(jīng)網(wǎng)絡(luò)中最常用到的,實(shí)現(xiàn)對(duì)神經(jīng)網(wǎng)絡(luò)里的神經(jīng)元激活。
Dense(units, activation=’relu’, use_bias=True)
參數(shù)說(shuō)明:
units: 全連接層輸出的維度,即下一層神經(jīng)元的個(gè)數(shù)。
activation:激活函數(shù),默認(rèn)使用Relu。
use_bias:是否使用bias偏置項(xiàng)。
?
1.2激活層:對(duì)上一層的輸出應(yīng)用激活函數(shù)。
Activation(activation)
參數(shù)說(shuō)明:
Activation:想要使用的激活函數(shù),如:’relu’、’tanh’、‘sigmoid’等。
?
1.3Dropout層:對(duì)上一層的神經(jīng)元隨機(jī)選取一定比例的失活,不更新,但是權(quán)重仍然保留,防止過(guò)擬合。
Dropout(rate)
參數(shù)說(shuō)明:
rate:失活的比例,0-1的浮點(diǎn)數(shù)。
?
1.4Flatten層:將一個(gè)維度大于或等于3的高維矩陣,“壓扁”為一個(gè)二維矩陣。即保留第一個(gè)維度(如:batch的個(gè)數(shù)),然后將剩下維度的值相乘作為“壓扁”矩陣的第二個(gè)維度。
Flatten()
?
1.5Reshape層:該層的作用和reshape一樣,就是將輸入的維度重構(gòu)成特定的shape。
Reshape(target_shape)
參數(shù)說(shuō)明:
target_shape:目標(biāo)矩陣的維度,不包含batch樣本數(shù)。
如我們想要一個(gè)9個(gè)元素的輸入向量重構(gòu)成一個(gè)(None, 3, 3)的二維矩陣:
Reshape((3,3), input_length=(16, ))
?
1.6卷積層:卷積操作分為一維、二維、三維,分別為Conv1D、Conv2D、Conv3D。一維卷積主要應(yīng)用于以時(shí)間序列數(shù)據(jù)或文本數(shù)據(jù),二維卷積通常應(yīng)用于圖像數(shù)據(jù)。由于這三種的使用和參數(shù)都基本相同,所以主要以處理圖像數(shù)據(jù)的Conv2D進(jìn)行說(shuō)明。
Conv2D(filters, kernel_size, strides=(1, 1), padding=’valid’)
參數(shù)說(shuō)明:
filters:卷積核的個(gè)數(shù)。
kernel_size:卷積核的大小。
strdes:步長(zhǎng),二維中默認(rèn)為(1, 1),一維默認(rèn)為1。
Padding:補(bǔ)“0”策略,’valid‘指卷積后的大小與原來(lái)的大小可以不同,’same‘則卷積后大小與原來(lái)大小一致。
?
1.7池化層:與卷積層一樣,最大統(tǒng)計(jì)量池化和平均統(tǒng)計(jì)量池化也有三種,分別為MaxPooling1D、MaxPooling2D、MaxPooling3D和AveragePooling1D、AveragePooling2D、AveragePooling3D,由于使用和參數(shù)基本相同,所以主要以MaxPooling2D進(jìn)行說(shuō)明。
MaxPooling(pool_size=(2,2), strides=None, padding=’valid’)
參數(shù)說(shuō)明:
pool_size:長(zhǎng)度為2的整數(shù)tuple,表示在橫向和縱向的下采樣樣子,一維則為縱向的下采樣因子。
padding:和卷積層的padding一樣。
?
1.8循環(huán)層:循環(huán)神經(jīng)網(wǎng)絡(luò)中的RNN、LSTM和GRU都繼承本層,所以該父類的參數(shù)同樣使用于對(duì)應(yīng)的子類SimpleRNN、LSTM和GRU。
Recurrent(return_sequences=False)
return_sequences:控制返回的類型,“False”返回輸出序列的最后一個(gè)輸出,“True”則返回整個(gè)序列。當(dāng)我們要搭建多層神經(jīng)網(wǎng)絡(luò)(如深層LSTM)時(shí),若不是最后一層,則需要將該參數(shù)設(shè)為True。
?
1.9嵌入層:該層只能用在模型的第一層,是將所有索引標(biāo)號(hào)的稀疏矩陣映射到致密的低維矩陣。如我們對(duì)文本數(shù)據(jù)進(jìn)行處理時(shí),我們對(duì)每個(gè)詞編號(hào)后,我們希望將詞編號(hào)變成詞向量就可以使用嵌入層。
Embedding(input_dim, output_dim, input_length)
參數(shù)說(shuō)明:
Input_dim:大于或等于0的整數(shù),字典的長(zhǎng)度即輸入數(shù)據(jù)的個(gè)數(shù)。
output_dim:輸出的維度,如詞向量的維度。
input_length:當(dāng)輸入序列的長(zhǎng)度為固定時(shí)為該長(zhǎng)度,然后要在該層后加上Flatten層,然后再加上Dense層,則必須指定該參數(shù),否則Dense層無(wú)法自動(dòng)推斷輸出的維度。
該層可能有點(diǎn)費(fèi)解,舉個(gè)例子,當(dāng)我們有一個(gè)文本,該文本有100句話,我們已經(jīng)通過(guò)一系列操作,使得文本變成一個(gè)(100,32)矩陣,每行代表一句話,每個(gè)元素代表一個(gè)詞,我們希望將該詞變?yōu)?4維的詞向量:
Embedding(100, 64, input_length=32)
則輸出的矩陣的shape變?yōu)?100, 32, 64):即每個(gè)詞已經(jīng)變成一個(gè)64維的詞向量。
?
2.Keras模型搭建
講完了一些常用層的語(yǔ)法后,通過(guò)模型搭建來(lái)說(shuō)明Keras的方便性。Keras中設(shè)定了兩類深度學(xué)習(xí)的模型,一類是序列模型(Sequential類);一類是通用模型(Model類),接下來(lái)我們通過(guò)搭建下圖模型進(jìn)行講解。
假設(shè)我們有一個(gè)兩層神經(jīng)網(wǎng)絡(luò),其中輸入層為784個(gè)神經(jīng)元,隱藏層為32個(gè)神經(jīng)元,輸出層為10個(gè)神經(jīng)元,隱藏層使用relu激活函數(shù),輸出層使用softmax激活函數(shù)。分別使用序列模型和通用模型實(shí)現(xiàn)如下:
?
?
下圖是通用模型實(shí)現(xiàn)。?
?
使用通用模型,首先要使用Input函數(shù)將輸入轉(zhuǎn)化為一個(gè)tensor,然后將每一層用變量存儲(chǔ)后,作為下一層的參數(shù),最后使用Model類將輸入和輸出作為參數(shù)即可搭建模型。
從以上兩類模型的簡(jiǎn)單搭建,都可以發(fā)現(xiàn)Keras在搭建模型比起Tensorflow等簡(jiǎn)單太多了,如Tensorflow需要定義每一層的權(quán)重矩陣,輸入用占位符等,這些在Keras中都不需要,我們只要在第一層定義輸入維度,其他層定義輸出維度就可以搭建起模型,通俗易懂,方便高效,這是Keras的一個(gè)顯著的優(yōu)勢(shì)。
3.模型優(yōu)化和訓(xùn)練
3.1compile(optimizer, loss, metrics=None)
參數(shù)說(shuō)明:
optimizer:優(yōu)化器,如:’SGD‘,’Adam‘等。
loss:定義模型的損失函數(shù),如:’mse’,’mae‘等。
metric:模型的評(píng)價(jià)指標(biāo),如:’accuracy‘等。
?
3.2fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, validation_split=0.0)
參數(shù)說(shuō)明:
x:輸入數(shù)據(jù)。
y:標(biāo)簽。
batch_size:梯度下降時(shí)每個(gè)batch包含的樣本數(shù)。
epochs:整數(shù),所有樣本的訓(xùn)練次數(shù)。
verbose:日志顯示,0為不顯示,1為顯示進(jìn)度條記錄,2為每個(gè)epochs輸出一行記錄。
validation_split:0-1的浮點(diǎn)數(shù),切割輸入數(shù)據(jù)的一定比例作為驗(yàn)證集。
?
import numpy as np import tensorflow as tf from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers.convolutional import Conv2D, MaxPooling2D # 獲得MNIST數(shù)據(jù)集 (X_train, y_train), (X_test, y_test) = mnist.load_data() #print(X_train[0].shape) #print(y_train[0]) X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32') # 歸一化 X_train /= 255 X_test /= 255# 獨(dú)熱編碼 def tran_y(y):y_ohe = np.zeros(10)y_ohe[y] = 1return y_ohe# 把標(biāo)簽進(jìn)行獨(dú)熱編碼 y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))]) y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))]) print(X_train.shape) # 創(chuàng)建序列模型 model = Sequential() # 添加卷積層,64個(gè)濾波器,卷積核大小3x3,平移步長(zhǎng)1,填充方式:補(bǔ)零,設(shè)定輸入層維度,激活函數(shù)relu model.add(Conv2D(filters=64, kernel_size=(5, 5), strides=(1, 1), padding='same', input_shape=(28, 28, 1), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 池化層,取2x2格子中的最大值 model.add(Dropout(0.5)) # dropout層,概率0.5,防止過(guò)擬合,提高泛化能力 model.add(Conv2D(128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Conv2D(256, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.5)) # 把當(dāng)前層節(jié)點(diǎn)展平 model.add(Flatten()) # 添加全連接層 model.add(Dense(128, activation='relu')) model.add(Dense(64, activation='relu')) model.add(Dense(32, activation='relu')) model.add(Dense(10, activation='softmax')) # 10個(gè)神經(jīng)元,對(duì)應(yīng)輸出層 # 編譯模型,指定損失函數(shù)(一般分類問(wèn)題的損失函數(shù)都采用交叉熵),優(yōu)化器,度量 model.compile(loss='categorical_crossentropy', optimizer= 'rmsprop', metrics=['accuracy']) # 放入批量樣本進(jìn)行,訓(xùn)練模型 model.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe), epochs=20, batch_size=128) # 在測(cè)試集上評(píng)估模型的準(zhǔn)確度 scores = model.evaluate(X_test, y_test_ohe, verbose=0)參考資料:http://www.tensorflownews.com/2018/03/15/使用keras進(jìn)行深度學(xué)習(xí)%ef%bc%9a%ef%bc%88一%ef%bc%89keras-入門/
總結(jié)
以上是生活随笔為你收集整理的keras入门之手写字识别python代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: shell中注释一段代码的方法
- 下一篇: leetcode刷题之树(三)
