人工智能AI培訓_Tensorflow 2.0實現手寫數字實驗
發布時間:
2019-07-18 17:49:14
人工智能AI培訓_Tensorflow 2.0實現手寫數字實驗
1.實驗介紹
1.1.關于本實驗
本實驗主要內容是進行手寫字體圖像的識別,用到的框架主要包括:TensorFlow2.0,主要用于深度學習算法的構建,本實驗以開源的手寫字體數據集為基礎,基于Keras深度學習庫對手寫字體進行識別。
1.2.實驗目的
理解圖像識別的原理。
掌握利用TensorFlow2.0構建圖像識別模型。
2.實驗步驟
2.1.導入實驗環境
步驟 1導入相應的模塊
Keras是一個高層神經網絡API,Keras由純Python編寫而成并基于Tensorflow、Theano以及CNTK后端。Keras 支持快速實驗。
#導入相關依賴包
import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, optimizers, datasets
from matplotlib import pyplot as plt
import numpy as np
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
2.2.導入實驗數據集
步驟 2下載數據集
TensorFlow2.0 的datasets中為我們提供了很多開源的數據集,可以直接執行命令下載。
#下載后,我們會得到含有60k的訓練集xs,和10k的測試集ys,
(x, y), (x_val, y_val) = datasets.mnist.load_data()
步驟 3數據集格式轉換
我們下載得到的數據集是numpy的格式,需要轉換成tensor。
#將圖像轉化為tensor
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255.
y = tf.convert_to_tensor(y, dtype=tf.int32)
print(x.shape, y.shape)
輸出結果:
(60000, 28, 28) (60000,)
步驟 4切分訓練集與測試集
train_dataset = tf.data.Dataset.from_tensor_slices((x, y))
train_dataset = train_dataset.batch(200)
步驟 5查看數據集信息
本實驗是文字識別,我們可以先打印查看前9張圖片,檢查圖片是否是正確的數據集。
plt.figure()
for i in range(9):
plt.subplot(3,3,i+1)
plt.imshow(x[i])
plt.ylabel(y[i].numpy())
plt.show()
輸出結果:
?
2.3.手寫字體圖像識別建模
步驟 6初始化神經網絡
數據集準備完成,接下來我們就需要構建訓練模型,我們首先需要建立初始化的神經網絡。
#調用全連接784->512->256->10, 激活函數選擇Relu進行映射
model=keras.Sequential([
layers.Dense(512, activation='relu'),
layers.Dense(256, activation='relu'),
layers.Dense(10)
])
步驟 7定義學習率更新規則
設置模型的學習率參數。
#給出學習率(步長)進行更新
optimizer=optimizers.SGD(learning_rate=0.001)
步驟 8構建模型訓練函數
神經網絡的模型參數更新是一個迭代的過程,所以我們可以將模型訓練的過程定義成一個函數,從而進行模型的訓練。
def train_epoch(epoch):
# Step4.loop
for step, (x, y) in enumerate(train_dataset):
with tf.GradientTape() as tape:
# 將圖像由二維矩陣轉化為向量;[b, 28, 28] => [b, 784]
x = tf.reshape(x, (-1, 28*28))
#將label用獨熱碼表示,例5:[0,0,0,0,0,1,0,0,0,0]
y = tf.one_hot(y, depth=10)
# 將圖像導入模型開始預測
# [b, 784] => [b, 10]
out = model(x)
# 計算 loss
print(np.size(x))
loss = tf.reduce_sum(tf.square(out - y)) / x.shape[0]
# 更新。optimize and update w1, w2, w3, b1, b2, b3
grads = tape.gradient(loss, model.trainable_variables)
# w' = w - lr * grad
optimizer.apply_gradients(zip(grads, model.trainable_variables))
if step % 100 == 0:
print(epoch, step, 'loss:', loss.numpy())
return loss
步驟 9構建繪圖函數
繪制train loss與epoch的關系圖,這樣我們就可以查看模型訓練的每一步損失值。
def plot_figure(y):
#作出train loss與epoch的關系圖
x = range(0, np.size(y))
plt.figure(1)
plt.plot(x, y, 'o-')
plt.title('epoches')
plt.ylabel('Train loss')
plt.show()
步驟 10構建模型訓練函數
定義模型訓練函數用于進行模型訓練:
def train():
#創建list用于保存loss值
loss_list = []
for epoch in range(30):
loss= train_epoch(epoch)
loss_list.append(loss)
plot_figure(loss_list)
步驟 11執行模型訓練
執行定義好的模型訓練函數進行模型訓練:
if __name__ == '__main__':
train()
輸出結果:
展示最后10次的模型訓練損失值:
20 0 loss: 1.1279364
156800
21 0 loss: 1.1141373
156800
22 0 loss: 1.1015469
156800
23 0 loss: 1.0899687
156800
24 0 loss: 1.0792384
156800
25 0 loss: 1.0692606
156800
26 0 loss: 1.0599515
156800
27 0 loss: 1.0512612
156800
28 0 loss: 1.0431163
156800
29 0 loss: 1.0354265
train loss與epoch的關系圖:

本實驗利用網上已有的北京房價數據集預測了北京的房價,實現了TensorFlow的線性回歸應用。
上一篇:
大數據培訓_基于solr的Hbase秒級查詢方案
下一篇:
思科認證體系知識