基於tensorflow2.0下的手寫體識別初體驗
1.手寫體識別代碼復現
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Flatten, Dense, Conv2D, MaxPooling2D, Dropout
from tensorflow.keras import datasets
#驗證集一般用於進一步確定模型中的超參數(例如正則項係數、神經網絡中隱層的節點個數,k值等)
#測試集只是用於評估模型的精確度(即泛化能力)
(train_images,train_labels),(test_images,test_labels) = datasets.mnist.load_data()#用於下載數據集
#數據處理
train_images = train_images.reshape(60000,28*28).astype('float32')/255#歸一化
test_images = test_images.reshape(10000,28*28).astype('float32')/255
print(train_images.shape)
print('prediction:',train_labels[10000])
train_labels = tf.keras.utils.to_categorical(train_labels)#to_categorical指將整數類別轉化成onehot類別
test_labels = tf.keras.utils.to_categorical(test_labels)
#建造模型
#Sequential指模型建造
#Dense指全連接層,輸出512維,激勵函數爲relu,輸入形式(28*28)格式
#第二個連接層輸出256維
model = Sequential([Dense(512,activation='relu',input_shape=(28*28,)),
Dense(256,activation='relu'),
Dropout(0.4),#失活率,防止過擬合
Dense(10,activation='softmax')])#softmax指經過函數輸出類別(acc的計算)
#categorical_crossentropy指多類區分的損失函數
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['acc'])
history = model.fit(train_images,train_labels,
epochs=10,batch_size=128,#訓練十次,訓練樣本數量
validation_data=(test_images,test_labels))#validation_data可以獲取更好的超參數,防止過擬合
#model.predict(test_images)
#model.predict_class(test_images)
model.evaluate(test_images, test_labels)
2.部分代碼流程介紹
1.Keras
Keras是一個由Python編寫的開源人工神經網絡庫,可以作爲Tensorflow、Microsoft-CNTK和Theano的高階應用程序接口,進行深度學習模型的設計、調試、評估、應用和可視化 。(詳細介紹https://keras.io)
2.數據預處理(轉載)
數據的加噪(本次代碼由於下載數據集無需加噪,若是有興趣自己製作數據集就需要加噪)
3.數據集圖片及標籤
- 打印圖片格式
可見圖片有784個特徵點(故將它做成28*28)
- 圖片內部
- 圖片的標籤(及它的預測值)
如果想將這樣的分類數據轉成我們習慣的0-9數字,可以使用TensorFlow中內置的函數argmax
train_labels = tf.argmax(mnist.train.labels, 1)
下面圖片
4.建立模型(這裏用到簡單的全連接層模型,一般用卷積神經網絡)
-
Dropout(用來防止過擬合,也叫失活率)
想更多瞭解可訪問https://blog.csdn.net/program_developer/article/details/80737724 -
softmax(指分類的預測值及accuracy)
想更多瞭解可訪問https://blog.csdn.net/bitcarmanlee/article/details/8232085
5.編譯,訓練,評估
代碼裏標註清楚了。
這裏簡答講述一下model.evaluate和model.prediction的差異
model.evaluate需要輸入數據及標籤,通過預測結果和標籤誤差進行評估(建議)
model.prediction只需要輸入數據,直接評估預測結果
3.手寫體識別結果可視化
圖片可視化(不太標準)
def plot_image(image):
image_file=plt.imshow(image.reshape(28,28))
plt.show(image_file)
plot_image(train_images[10000])
print(train_labels[10000])
訓練結果可視化(plt作圖,部分轉載)
# 結果可視化
acc = history.history.get('acc')
val_acc = history.history.get('val_acc')
loss = history.history.get('loss')
val_loss = history.history.get('val_loss')
epochs = range(1, len(acc)+1)
plt.figure(figsize=(4,4))
plt.plot(epochs, acc, 'bo', label='Traing acc')
plt.plot(epochs, val_acc, 'r', label='Test acc')
plt.legend()
plt.show()
plt.figure(figsize=(4,4))
plt.plot(epochs, loss, 'bo', label='Traing loss')
plt.plot(epochs, val_loss, 'r', label='Test val_loss')
plt.legend()
plt.show()
精度結果
這個模型精度基本可以穩定在0.995左右
損失函數結果
本文爲作者學習記錄筆記,可能有衆多不足,望指出。謝謝!!!