Keras 基礎(1)

唉!!!這些大佬,寫個LSTM每一個人的實現方法都不一樣,有用Keras,TF,Pytorch等,可憐我啥時候才能看懂那篇論文的代碼啊!!!!

好START

如果 用 tensorflow 來搭建神經網絡,我們還需要下一些功夫,而使用keras 我們就省心了,提供高級的 API 供我們使用來搭建神經網絡,keras 也走進了谷歌的大門,keras 也被整合到 tensorflow 方便我們使用。

定義模型樣子

這裡說一下mnist是一個用到爛的數據集

Keras 基礎(1)

<code># %pip install tensorflow
import tensorflow as tf
mnist = tf.keras.datasets.mnist # 28 x 28 images of hand-written digits 0-9
#加載數據
(x_train,y_train),(x_test,y_test) = mnist.load_data()
#### 可視化數據
/<code>

通過 keras.datasets 導入手寫數字集,用於我們學習如何搭建神經網絡來識別圖中數字

<code>import matplotlib.pyplot as plt
plt.imshow(x_train[0])
print(x_train[0])
/<code>
Keras 基礎(1)

使用 matplotlib 庫可以將數據可視化,讓我們更加直觀地瞭解圖片數據到底是什麼。

<code>plt.imshow(x_train[0],cmap=plt.cm.binary)
/<code>
Keras 基礎(1)

<code>x_train = tf.keras.utils.normalize(x_train,axis = 1)
x_test = tf.keras.utils.normalize(x_test, axis = 1)

/<code>

我們可以對數據通過處理將數據映射到 1 - 0 區間,這樣更便於處理。

Keras 基礎(1)

Keras 基礎(1)

開始搭建我們神經網絡

<code>model = tf.keras.models.Sequential()
/<code>

這裡我們使用 Sequential 創建順序執行執行神經網絡。

<code># add layer first layer is input layer
model.add(tf.keras.layers.Flatten())

/<code>

首先將多維數據壓縮為一維數據,作為輸入數據。Dense 表示一個全連接的層,這也就是我們要添加一個輸出 128 的全連接層。然後activation 可以指定激活函數。

<code>model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
/<code>

添加兩個神經層,因為每一層輸入都是 128 而且激活函數使用簡單的 relu,relu 相比其他激活函數計算簡單。

<code>model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))
/<code>

接下來評價我們模型,可以指定 loss 函數類型,訓練模型就是找到最合適方程,可以在 optimizer 指定找到最合適函數的方式。

<code>model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

model.fit(x_train,y_train,epochs=3)

/<code>

開始訓練,第一個參數為訓練集,y_train 為期望值,x_train 是二維數組,一維是訓練集樣本數量,第二個維度是圖片大小,28 * 28 = 784。對於 y_train 的第一個維度就是樣本的數量,第二個就是 10 維,因為我們圖片是分為 10 類。

Keras 基礎(1)

其實這裡還有參數batch_size 指定數量,這樣 keras 是根據 batch_size 將數據進行劃分,然後在 batch_size 計算出 loss 函數得到然後根據 loss 函數(損失函數)結構調整一次參數依次類推,每一個 batch 都會根據loss 函數來更新參數

解析

batch_size:整數,指定進行梯度下降時每個batch包含的樣本數。訓練時一個batch的樣本會被計算一次梯度下降,使目標函數優化一步。 epochs:整數,訓練終止時的epoch值,訓練將在達到該epoch值時停止,當沒有設置initial_epoch時,它就是訓練的總輪數,否則訓練的總輪數為epochs - inital_epoch

Keras 基礎(1)

Keras 基礎(1)

然後每完成一次所有 batch 運算就算為 epoch

Keras 基礎(1)

輸出一個 loss

<code>(0.11153460214892402, 0.9629)
/<code>

然後就可以檢查一下我們訓練成果了,我們可以將訓練好模型保存起來,以便以後可以無需重複訓練通過加載訓練好的模型,來進行圖形識別。

<code>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)
/<code>

模型保存這一步很重要 我之前一直以為在線上模型使用每次都要fit一下,顯然不是的。sava model 從結果來看我們訓練出的模型可以滿足我們需要,模型已經成功根據圖片

<code>7
/<code>

通過我們測試模型現在已經可以識別出數字 7

一個demo下來,發現很多框架細節都不懂,真的得一個個參數去看了!!!


分享到:


相關文章: