深度学习(4)手写数字识别实战
深度學習(4)手寫數字識別實戰
- Step0. 數據及模型準備
- 1. X and Y(數據準備)
- 2. out=relu{relu{relu[X@W1+b1]@W2+b2}@W3+b3}out=relu\{relu\{relu[X@W_1+b_1]@W_2+b_2\}@W_3+b_3\}out=relu{relu{relu[X@W1?+b1?]@W2?+b2?}@W3?+b3?}(模型準備)
- Step1&2. Cmpute outoutout&losslossloss(計算h1h_1h1?、h2h_2h2?和h3h_3h3?)
- Step3. Compute gradient and optimize(更新)
- Step4. Loop(循環迭代)
- 完整代碼
- 運行結果
Step0. 數據及模型準備
1. X and Y(數據準備)
(1) (xs, ys)容量為60k,即共有6萬張圖片;
(2) xs.shape: [60k, 28, 28]; ys.shape: [60k];
(3) xs = tf.convert_to_tensor: mnist.load_data格式為numpy,而要使用GPU需要將其轉化為tensor格式;
(4) db = tf.data.Dataset.from_tensor_slices((xs, ys)): 將數據轉化為Dataset類型,這樣可以利用batch一批送入多個數據,默認情況下一批送入一個數據; 如果后邊加上.batch(64)那么一批就可以送入64個數據;
(5) for step, (x, y) in enmuerate(db):print(step, x.shape,y, y.shape): 循環迭代db,并輸出每條數據的shape,如下圖所示:
注: 如果設置.batch(64)的話,x.shape: [64, 28, 28];y.shape: [64];
運行結果如下圖所示:
2. out=relu{relu{relu[X@W1+b1]@W2+b2}@W3+b3}out=relu\{relu\{relu[X@W_1+b_1]@W_2+b_2\}@W_3+b_3\}out=relu{relu{relu[X@W1?+b1?]@W2?+b2?}@W3?+b3?}(模型準備)
(1) 降維過程: 784 →\to→ 512 →\to→ 256 →\to→ 10;
(2) Dense函數: 每層需要調用Dense函數,這是全連接(線性層)中的函數,用來組成每層的結構;
layers.Dense(512, activation=‘relu’),表示圖片由784降維成512,并且非線性因子(即激活函數)為relu;
layers.Dense(256, activation=‘relu’),表示圖片由512降維成256,并且非線性因子(即激活函數)為relu;
layers.Dense(10, activation=‘relu’),表示圖片由256降維成10;
(3) 每個參數的更新規則為: w′=w?lr??l?ww'=w-lr*\frac{?l}{?w}w′=w?lr??w?l?;
(4) optimizer的作用就是需要哪些參數,optimizer就會自動按照規則進行更新,只需要設置其步長(即學習率lrlrlr)即可;
Step1&2. Cmpute outoutout&losslossloss(計算h1h_1h1?、h2h_2h2?和h3h_3h3?)
(1) x = tf.rehsape(x, (-1, 28*28)): 將數據進行“打平”操作,即由28*28變為784維向量;
(2) 這部分不需要考慮h1h_1h1?和h2h_2h2?,只需要考慮outoutout,最終的out:[1,10]out: [1, 10]out:[1,10];
(3) loss = tf.reduce_sum(tf.squre(out - y)) / x.shape[0]: yyy和outoutout之間的歐式距離就是losslossloss,即: loss=1n∑(y?out)2loss=\frac{1}{n}\sum(y-out)^2loss=n1?∑(y?out)2 ;
Step3. Compute gradient and optimize(更新)
(1) tape.gradient(loss, model.trainable_variables): 自動求導工具,因為網絡層數增加,每層都計算導數會非常麻煩,所以我們需要這個工具; tape.gradient(y, x)就是?y?x\frac{?y}{?x}?x?y?; 對于手寫數字識別問題來說,losslossloss就是yyy,而model.trainable_variables(即[W1,W2,W3,b1,b2,b3][W_1,W_2,W_3,b_1,b_2,b_3][W1?,W2?,W3?,b1?,b2?,b3?])就是xxx;
(2) 得到grads后,利用規則: w′=w?lr??l?ww'=w-lr*\frac{?l}{?w}w′=w?lr??w?l? 和自動更新工具optimizer對所有參數進行更新;
Step4. Loop(循環迭代)
(1) train_dataset里共有60k個樣本,假設一次取60張圖片,那么一共需要循環1000次訓練,把對60k個樣本進行一次訓練叫做一個epoch; 把對60張圖片(即一個batch)進行一次訓練叫做一個step; 一個epoch通常包含多個step;
(2) train_epoch(epoch): 對整個數據集迭代一次; 多次調用即可完成對數據集的多次迭代和多次更新;
(3) 將batch設置為200,也就是一共訓練30次。
運行結果如下:
注: 如果出現以下報錯:
則為證書驗證問題,需要添加:
import sslssl._create_default_https_context = ssl._create_unverified_context即可。
完整代碼
import os import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics import sslssl._create_default_https_context = ssl._create_unverified_context# 設置GPU使用方式 # 獲取GPU列表 gpus = tf.config.experimental.list_physical_devices('GPU') if gpus:try:# 設置GPU為增長式占用for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)except RuntimeError as e:# 打印異常print(e)(x, y), (x_val, y_val) = datasets.mnist.load_data() x = tf.convert_to_tensor(x, dtype=tf.float32) / 255. y = tf.convert_to_tensor(y, dtype=tf.int32) y = tf.one_hot(y, depth=10) print('datasets:', x.shape, y.shape) train_dataset = tf.data.Dataset.from_tensor_slices((x, y)) train_dataset = train_dataset.batch(200)model = keras.Sequential([layers.Dense(512, activation='relu'),layers.Dense(256, activation='relu'),layers.Dense(10)])optimizer = optimizers.SGD(lr=0.01)def train_epoch(epoch):# Step4. loopfor step, (x, y) in enumerate(train_dataset):with tf.GradientTape() as tape:# 打平操作,[b, 28, 28] => [b, 784]x = tf.reshape(x, (-1, 28 * 28))# Step1. 得到模型輸出output [b, 784] => [b, 10]out = model(x)# Step2. Compute lossloss = tf.reduce_sum(tf.square(out - y)) / x.shape[0]# Step3. optimizer and update w1, w2, w3, b1, b2, b3grads = tape.gradient(loss, model.trainable_variables)# w' = w - lr * gradoptimizer.apply_gradients(zip(grads, model.trainable_variables))if step % 100 == 0:print(epoch, step, loss.numpy())def train():for epoch in range(30):train_epoch(epoch)if __name__ == '__main__':train()運行結果
.........
參考文獻:
[1] 龍良曲:《深度學習與TensorFlow2入門實戰》
[2] https://blog.csdn.net/qq_43653405/article/details/108449661
總結
以上是生活随笔為你收集整理的深度学习(4)手写数字识别实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国计划强制电动汽车配备行人警示器,19
- 下一篇: 8000元买永久会员的小伙伴放心了 11