一、實操
下面進行的模型訓練為偽代碼,一般用tensorflow不會用到這種方式來訓練模型,這個只是用來作為對上一篇常用函數的使用,方便熟悉代碼以及訓練時梯度是如何計算的。
import tensorflow as tf from sklearn.datasets import load_iris # 讀取鳶尾花數據 iris_data = load_iris() x = tf.constant(iris_data.data) y = tf.constant(iris_data.target) x=tf.cast(x,tf.float32) y=tf.cast(y,y.dtype) y = tf.one_hot(y, 3) # 對y進行獨熱編碼 # 構建數據集,分為3批次,每個批次大小為50 dataset = tf.data.Dataset.from_tensor_slices((x, y)).shuffle(30).batch(50) # 構建神經網絡的全連接層4*3的結構,詳情如下:輸入為x的4個特征值,無激活函數;輸出層為3,softmax激活函數 # 輸入層權重、偏倚 w = tf.Variable(tf.ones([4, 3])) b = tf.Variable(tf.ones([1,3])) # 訓練設定迭代5代,每代3個批次,學習率為0.1 epoch = 5 learn_rate = 0.1 for epoch_i in range(epoch): for step, (x_batch, y_batch) in enumerate(dataset): with tf.GradientTape(persistent=True) as tape: a = tf.matmul(x_batch,w) + b # 激活前的值 y_pre = tf.nn.softmax(a) # softmax激活函數后的輸出 loss = tf.reduce_mean(tf.square(y_pre - y_batch)) # 均方誤差 grads = tape.gradient(loss, [w, b]) # 計算梯度 w.assign_sub(learn_rate * grads[0]) # 更新權重 b.assign_sub(learn_rate * grads[1]) # 更新權重 print('第%d代,第%d批次,loss=%.5f'%(epoch_i+1,step+1,loss))
輸出結果:
第1代,第1批次,loss=0.22222 第1代,第2批次,loss=0.24286 第1代,第3批次,loss=0.27031 第2代,第1批次,loss=0.26356 第2代,第2批次,loss=0.20968 第2代,第3批次,loss=0.27439 第3代,第1批次,loss=0.25802 第3代,第2批次,loss=0.23685 第3代,第3批次,loss=0.20936 第4代,第1批次,loss=0.27304 第4代,第2批次,loss=0.21698 第4代,第3批次,loss=0.19768 第5代,第1批次,loss=0.25066 第5代,第2批次,loss=0.22764 第5代,第3批次,loss=0.19781