【TensorFlow】通过两个简单的例子实现反向传播
生活随笔
收集整理的這篇文章主要介紹了
【TensorFlow】通过两个简单的例子实现反向传播
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
回歸算法示例
# python 3.6 # TensorFlow實現反向傳播 import tensorflow as tf import numpy as npsess = tf.Session()# 一、回歸算法 # 從均值為1、標準差為0.1的正態分布中抽樣隨機數, # 然后乘以變量A,損失函數為L2正則損失函數。 # 理論上,A的最優值是10,因為生成的樣例數據均值是1。# 1.生成數據 創建占位符和變量A x_vals = np.random.normal(1,0.1,100) y_vals = np.repeat(10.,100) x_data = tf.placeholder(shape=[1],dtype=tf.float32) y_target = tf.placeholder(shape=[1],dtype=tf.float32) A = tf.Variable(tf.random_normal(shape=[1]))# 2.增加乘法操作 my_output = tf.multiply(x_data,A)# 3.增加L2正則損失函數 loss = tf.square(my_output-y_target)# 4.初始化所有變量 init = tf.global_variables_initializer() sess.run(init)# 5.聲明變量優化器 # 迭代步長由學習率控制 # 學習率越小 收斂時間越長 學習率過大 可能無法收斂 導致梯度消失或爆炸 my_opt = tf.train.GradientDescentOptimizer(learning_rate=0.02) train_step = my_opt.minimize(loss)# 6.訓練算法 迭代100次 每25次返回結果 選擇一個隨機的x和y傳入計算圖 # tf自動計算損失 調整A偏差來最小化損失 for i in range(100):rand_index = np.random.choice(100)rand_x = [x_vals[rand_index]]rand_y = [y_vals[rand_index]]sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})if (i+1)%25 == 0:print("Step # " + str(i+1) + ' A = ' + str(sess.run(A)))print("Loss=" + str(sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})))分類算法示例
# python 3.6 import tensorflow as tf import numpy as np# 二、二值分類算法 # 從兩個正態分布N(-1,1)和N(3,1)生成100個數。 # 所有從正態分布N(-1,1)生成的數據標為目標類0; # 從正態分布N(3,1)生成的數據標為目標類1, # 模型算法通過sigmoid函數將這些生成的數據轉換成目標類數據。 # 換句話講,模型算法是sigmoid(x+A) # 其中,A是要擬合的變量,理論上A=-1。 # 假設,兩個正態分布的均值分別是m1和m2,則達到A的取值時, # 它們通過-(m1+m2)/2轉換成到0等距的值。 # 后面將會在TensorFlow中見證怎樣取到相應的值。# 1.創建計算圖 sess = tf.Session()# 2.生成數據和目標標簽、占位符和變量A x_vals = np.concatenate((np.random.normal(-1,1,50),np.random.normal(3,1,50))) y_vals = np.concatenate((np.repeat(0.,50),np.repeat(1.,50))) x_data = tf.placeholder(shape=[1],dtype=tf.float32) y_target = tf.placeholder(shape=[1],dtype=tf.float32) # 初始化變量A為10附近的值,遠離理論值-1。 # 這樣可以清楚地顯示算法是如何從10收斂為-1的。 A = tf.Variable(tf.random_normal(mean=10,shape=[1]))# 3.增加轉換操作 my_output = tf.add(x_data,A)# 4.由于指定的損失函數期望批量數據增加一個批量數的維度, # 這里使用expand_dims()函數增加維度。 # 之后將討論如何使用批量變量訓練,這次還是一次使用一個隨機數據: my_output_expanded = tf.expand_dims(my_output,0) y_target_expanded = tf.expand_dims(y_target,0)# 5.初始化變量A init = tf.global_variables_initializer() sess.run(init)# 6.聲明損失函數:帶非歸一化logits的交叉熵損失函數 用sigmoid轉換 xentropy = tf.nn.sigmoid_cross_entropy_with_logits(logits=my_output_expanded,labels=y_target_expanded)# 7.增加一個優化器函數讓TensorFlow知道如何更新和偏差變量 my_opt = tf.train.GradientDescentOptimizer(0.05) train_step = my_opt.minimize(xentropy)# 8.通過隨機選擇的數據迭代幾百次 更新變量A 每200次輸出loss和A的值 for i in range(1400):rand_index=np.random.choice(100)rand_x = [x_vals[rand_index]]rand_y = [y_vals[rand_index]]sess.run(train_step, feed_dict={x_data:rand_x,y_target:rand_y})if (i+1)%200 == 0:print('Step # ' + str(i+1) + ' A = ' + str(sess.run(A)))print('Loss = '+ str(sess.run(xentropy,feed_dict={x_data:rand_x,y_target:rand_y})))總結
實現反向傳播的步驟
學習率和優化器算法
| 大 | 結果精確 | 收斂慢 | 算法不穩定,降低學習率 |
| 小 | 收斂快 | 結果不精確 | 算法收斂慢,提高學習率 |
問題
有時,標準梯度下降算法會明顯卡頓或者收斂變慢,特別是在梯度為0的附近的點。
解決思路
①TensorFlow的MomentumOptimizer()函數增加了一項勢能, 前一次迭代過程的梯度下降值的倒數。
②可以改變的是優化器的步長,理想情況下,對于變化小的變量使用大步長;而變化迅速的變量使用小步長。實現這種優點的常用Adagrad算法。此算法考慮整個歷史迭代的變量梯度,TensorFlow中相應功能的實現是AdagradOptimizer()函數。
問題
有時,由于Adagrad算法計算整個歷史迭代的梯度,導致梯度迅速變為0。
解決思路
可以用Adadelta算法解決,它限制使用的迭代次數。TensorFlow中相應功能的實現是AdadeltaOptimizer()函數。
總結
以上是生活随笔為你收集整理的【TensorFlow】通过两个简单的例子实现反向传播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没错,继事理图谱后,我们又搞事情了:数地
- 下一篇: Spring之AOP实现