
如果 用 tensorflow 來(lái)搭建神經(jīng)網(wǎng)絡(luò),我們還需要下一些功夫,而使用keras 我們就省心了,提供高級(jí)的 API 供我們使用來(lái)搭建神經(jīng)網(wǎng)絡(luò)。
keras 在不就之前也走進(jìn)了谷歌的大門(mén),keras 也被整合到 tensorflow 方便我們使用。
定義模型樣子
import tensorflow as tf
mnist = tf.keras.datasets.mnist # 28 x 28 images of hand-written digits 0-9
#### 可視化數(shù)據(jù)
通過(guò) keras.datasets 導(dǎo)入手寫(xiě)數(shù)字集,用于我們學(xué)習(xí)如何搭建神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別圖中數(shù)字
import matplotlib.pyplot as plt
plt.imshow(x_train[0])
print(x_train[0])
使用 matplotlib 庫(kù)可以將數(shù)據(jù)可視化,讓我們更加直觀地了解圖片數(shù)據(jù)到底是什么。

圖片就這樣顯示出來(lái),識(shí)別圖片中的數(shù)字顏色的(也就是帶有 RGB 通道)的圖片并沒(méi)有什么幫助,可以根據(jù)需要去色后進(jìn)行分析。
去色處理
plt.imshow(x_train[0],cmap=plt.cm.binary)

對(duì)數(shù)據(jù)進(jìn)行縮放
x_train = tf.keras.utils.normalize(x_train,axis = 1)
x_test = tf.keras.utils.normalize(x_test, axis = 1)
我們可以對(duì)數(shù)據(jù)通過(guò)處理將數(shù)據(jù)映射到 1 - 0 區(qū)間,這樣更便于處理。
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. ]
[0. 0. 0. 0. 0.37491383 0.56222061
0.66525569 0.63253163 0.48748768 0.45852825 0.43408872 0.359873
0.17428513 0.01425695 0.

開(kāi)始搭建我們神經(jīng)網(wǎng)絡(luò),
model = tf.keras.models.Sequential()
這里我們使用 Sequential 創(chuàng)建順序執(zhí)行執(zhí)行神經(jīng)網(wǎng)絡(luò)。
# add layer first layer is input layer
model.add(tf.keras.layers.Flatten())
首先將多維數(shù)據(jù)壓縮為一維數(shù)據(jù),作為輸入數(shù)據(jù)。Dense 表示一個(gè)全連接的層,這也就是我們要添加一個(gè)輸出 128 的全連接層。然后activation 可以指定激活函數(shù)。
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
添加兩個(gè)神經(jīng)層,因?yàn)槊恳粚虞斎攵际?128 而且激活函數(shù)使用簡(jiǎn)單的 relu,relu 相比其他激活函數(shù)計(jì)算簡(jiǎn)單。
model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))
接下來(lái)評(píng)價(jià)我們模型,可以指定 loss 函數(shù)類(lèi)型,訓(xùn)練模型就是找到最合適方程,可以在 optimizer 指定找到最合適函數(shù)的方式。
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(x_train,y_train,epochs=3)
開(kāi)始訓(xùn)練,第一個(gè)參數(shù)為訓(xùn)練集,y_train 為期望值,x_train 是二維數(shù)組,一維是訓(xùn)練集樣本數(shù)量,第二個(gè)維度是圖片大小,28 * 28 = 784。對(duì)于 y_train 的第一個(gè)維度就是樣本的數(shù)量,第二個(gè)就是 10 維,因?yàn)槲覀儓D片是分為 10 類(lèi)。

其實(shí)這里還有參數(shù)batch_size 指定數(shù)量,這樣 keras 是根據(jù) batch_size 將數(shù)據(jù)進(jìn)行劃分,然后在 batch_size 計(jì)算出 loss 函數(shù)得到然后根據(jù) loss 函數(shù)結(jié)構(gòu)調(diào)整一次參數(shù)依次類(lèi)推,每一個(gè) batch 都會(huì)根據(jù)loss 函數(shù)來(lái)更新參數(shù)


然后每完成一次所有 batch 運(yùn)算就算為 epoch
Epoch 1/3
60000/60000 [==============================] - 4s 64us/sample - loss: 0.2680 - acc: 0.9214
Epoch 2/3
60000/60000 [==============================] - 4s 62us/sample - loss: 0.1091 - acc: 0.9660
Epoch 3/3
60000/60000 [==============================] - 4s 62us/sample - loss: 0.0736 - acc: 0.9768
val_loss, val_acc = model.evaluate(x_test,y_test)
print(val_loss,val_acc)
輸出一個(gè) loss
(0.11153460214892402, 0.9629)
然后就可以檢查一下我們訓(xùn)練成果了,我們可以將訓(xùn)練好模型保存起來(lái),以便以后可以無(wú)需重復(fù)訓(xùn)練通過(guò)加載訓(xùn)練好的模型,來(lái)進(jìn)行圖形識(shí)別。
model.save('epic_num_reader.model')
new_model = tf.keras.models.load_model('epic_num_reader.model')
predictions = new_model.predict([x_test])
print(predictions)
從結(jié)果來(lái)看我們訓(xùn)練出的模型可以滿(mǎn)足我們需要,模型已經(jīng)成功根據(jù)圖片
7
通過(guò)我們測(cè)試模型現(xiàn)在已經(jīng)可以識(shí)別出數(shù)字 7