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