介紹如何使用keras搭建一個多層感知機實現手寫體識別及搭建一個神經網絡最小的必備知識
import keras # 導入keras dir(keras) # 查看keras常用的模塊 ['Input', 'Model', 'Sequential', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'absolute_import', 'activations', 'applications', 'backend', 'callbacks', 'constraints', 'datasets', 'engine', 'initializers', 'layers', 'legacy', 'losses', 'metrics', 'models', 'optimizers', 'preprocessing', 'regularizers', 'utils', 'wrappers']
keras常用模塊的簡單介紹
- 'Input','Model','Sequential',這三個模塊是以前老的接口,新的版本已經將它們融合到后面的模塊當中
- 以'__'開頭的模塊是一些內嵌的模塊
- 'activations'是激活函數,包括像sigmoid,relu,softmax等
- 'applications'是應用,這里面提供了已經訓練好的keras模型,像圖像識別的VGG等
- 'backend'是后端函數,keras通過它來操作其他的后端執行代碼,像tensorflow,theano等,在后面使用models時,models會自動地調用
- 'callbacks'是一個回調的抽象函數,在高級應用里面可以用來展示訓練過程中網絡內部的狀態
- 'constraints'是一個約束項,主要是能夠對神經網絡進行約束,來防止神經網絡的過擬合
- 'datasets'里面包含了很多神經網絡常用的數據集
- 'engine'是引擎模塊,是layers的核心代碼,主要是用來實現神經網絡的拓補結構,后面的層的構建都是從這里繼承而來
- 'initializers'是初始化方法
- 'layers'里面包含了keras已經實現的一些網絡層,像全連接層Dense,卷積神經網絡中的Conv
- 'legacy'是遺留代碼,舊版本的代碼都放在里面
- 'losses'是目標函數,也就損失函數,代價函數等,包括像均方差誤差,交叉熵等等,用來衡量神經網絡訓練過程中的訓練的好壞,能夠看在迭代的過程中神經網絡的一個訓練情況
- 'metrics'是評估函數,可以用來評估神經網絡的性能,里面包括像准確度,召回率等
- 'models'是模型庫,Keras有兩種類型的模型,序貫模型(Sequential)和函數式模型(Model),函數式模型應用更為廣泛,序貫模型是函數式模型的一種特殊情況。序貫模型:使用序貫模型可以像搭積木一樣一層一層地網上疊加神經網絡
- 'optimizers'是優化器,神經網絡編譯時必備的參數之一,可以用來在神經網絡訓練過程當中來更新權值的一個方法
- 'preprocessing'是預處理模塊,包括對數據,序列,文本以及圖像數據的預處理
- 'regularizers'是正則化方法,是用來防止神經網絡在訓練過程中出現過擬合
- 'utils'工具模塊,本模塊提供了一系列有用工具,用於提供像數據轉換,數據規范化等功能
- 'wrappers'包裝器(層封裝器),能夠將普通層進行包裝,比如將普通數據封裝成時序數據
本次所用Keras基礎模塊
from keras.models import Sequential # 導入序貫模型,可以通過順序的方式,疊加神經網絡層 model = Sequential() # 構造一個模型對象model model.add(Dense(8)) from keras.layers import Dense Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs) from keras import optimizers Init signature: optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False, **kwargs) optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False) <keras.optimizers.SGD at 0x54ef320>
手寫體識別
import keras # 導入Keras from keras.datasets import mnist # 從keras中導入mnist數據集 from keras.models import Sequential # 導入序貫模型 from keras.layers import Dense # 導入全連接層 from keras.optimizers import SGD # 導入優化函數 Using TensorFlow backend. (x_train, y_train), (x_test, y_test) = mnist.load_data() # 下載mnist數據集 print(x_train.shape,y_train.shape) # 60000張28*28的單通道灰度圖 print(x_test.shape,y_test.shape) (60000, 28, 28) (60000,) (10000, 28, 28) (10000,) import matplotlib.pyplot as plt # 導入可視化的包 im = plt.imshow(x_train[0],cmap='gray') plt.show() y_train[0]
x_train = x_train.reshape(60000,784) # 將圖片攤平,變成向量 x_test = x_test.reshape(10000,784) # 對測試集進行同樣的處理 print(x_train.shape) print(x_test.shape) (60000, 784) (10000, 784) x_train[0] array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 18, 18, 126, 136, 175, 26, 166, 255, 247, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 36, 94, 154, 170, 253, 253, 253, 253, 253, 225, 172, 253, 242, 195, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 238, 253, 253, 253, 253, 253, 253, 253, 253, 251, 93, 82, 82, 56, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 253, 253, 253, 212, 135, 132, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)
對數據進行歸一化處理
x_train = x_train / 255 x_test = x_test / 255 x_train[0] array([0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.01176471, 0.07058824, 0.07058824, 0.07058824, 0.49411765, 0.53333333, 0.68627451, 0.10196078, 0.65098039, 1. , 0.96862745, 0.49803922, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.11764706, 0.14117647, 0.36862745, 0.60392157, 0.66666667, 0.99215686, 0.99215686, 0.99215686, 0.99215686, 0.99215686, 0.88235294, 0.6745098 , 0.99215686, 0.94901961, 0.76470588, 0.25098039, 0. , 0. , 0. , 0. , 0.53333333, 0.99215686, 0.99215686, 0.99215686, 0.83137255, 0.52941176, 0.51764706, 0.0627451 , 0. , 0. , 0. , 0. , 0. ])
對y標簽進行處理,5 --> [ 0, 0, 0, 0, 0,1, 0, 0, 0, 0] ,使用keras的utils工具集中的函數可以做到
y_train = keras.utils.to_categorical(y_train,10)
y_test = keras.utils.to_categorical(y_test,10)
構建模型
model = Sequential() # 構建一個空的序貫模型 # 添加神經網絡層 model.add(Dense(512,activation='relu',input_shape=(784,))) model.add(Dense(256,activation='relu')) model.add(Dense(10,activation='softmax')) model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 512) 401920 _________________________________________________________________ dense_2 (Dense) (None, 256) 131328 _________________________________________________________________ dense_3 (Dense) (None, 10) 2570 ================================================================= Total params: 535,818 Trainable params: 535,818 Non-trainable params: 0 _________________________________________________________________
將神經網絡進行編譯
model.compile(optimizer=SGD(),loss='categorical_crossentropy',metrics=['accuracy'])
模型的訓練
model.fit(x_train,y_train,batch_size=64,epochs=5,validation_data=(x_test,y_test)) # 此處直接將測試集用作了驗證集 Train on 60000 samples, validate on 10000 samples Epoch 1/5 60000/60000 [==============================] - 8s 141us/step - loss: 0.7648 - acc: 0.8165 - val_loss: 0.3706 - val_acc: 0.9027 Epoch 2/5 60000/60000 [==============================] - 8s 138us/step - loss: 0.3383 - acc: 0.9069 - val_loss: 0.2891 - val_acc: 0.9190 Epoch 3/5 60000/60000 [==============================] - 8s 128us/step - loss: 0.2821 - acc: 0.9208 - val_loss: 0.2558 - val_acc: 0.9257 Epoch 4/5 60000/60000 [==============================] - 7s 111us/step - loss: 0.2496 - acc: 0.9296 - val_loss: 0.2281 - val_acc: 0.9350 Epoch 5/5 60000/60000 [==============================] - 8s 127us/step - loss: 0.2256 - acc: 0.9364 - val_loss: 0.2117 - val_acc: 0.9391 <keras.callbacks.History at 0x5359080>
模型的得分情況
score = model.evaluate(x_test,y_test) print("loss:",score[0]) print("accu:",score[1]) 10000/10000 [==============================] - 0s 47us/step loss: 0.2117454363614321 accu: 0.9391