Keras 基礎(chǔ)(1)

MachineLearninginMarketing

如果 用 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容