深度學習part2:基於tensorflow2.0手寫體識別初體驗

基於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.建立模型(這裏用到簡單的全連接層模型,一般用卷積神經網絡)

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左右
在這裏插入圖片描述
損失函數結果
在這裏插入圖片描述

本文爲作者學習記錄筆記,可能有衆多不足,望指出。謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章