2016-11-07 139 views
1

我是新來的張量流,我看到兩種不同的方式使用GradientDescentOptimiserTensorflow學習差環

for (x, y) in zip(trX, trY): 
    sess.run(train_op, feed_dict={X: x, Y: y}) 

我也見這種集成迴路的

sess.run(train_op, feed_dict={X: trX, Y: trY}) 

我測試了但結果稍有不同。目前我只是訓練自己進行簡單的線性迴歸,但可能會對ANN產生影響。爲什麼會有差異,哪個是神經網絡的最佳代碼?

+1

嗨JLB,你能給出更多關於第二種情況的代碼嗎?什麼是train_op,變量X和Y? – Corentin

+0

當然,在下面的代碼中定義了更多的代碼,gradientdecent。 唯一的區別在於上面提到的估計循環。 成本= tf.square(Y - y_model)#使用平方誤差爲代價函數 train_op = tf.train.GradientDescentOptimizer(0.001).minimize(成本) var_grad = tf.gradients(成本,w)的 與TF。 Session()as sess: tf.initialize_all_variables()。run() for i in range(100): sess.run(train_op,feed_dict = {X:trX,Y:trY}) – JLB

+0

您可能想要後者 - 獲得張量來驅動執行。 – drpng

回答

0

梯度下降是一個迭代過程,其通過更新參數的大量的時間與最小化的成本函數:

W」 = W - 一個delta_W

其中W¯¯是該組您的模型的參數a學習率和delta_W是成本函數梯度的近似值。 (查看更多詳情here

sess.run(train_op, feed_dict={X:...,Y:...})只使用X和Y計算一次迭代來近似梯度。

所以,你的第二個代碼使用所有的訓練數據集近似梯度(它很昂貴,但逼近是準確的),並且僅適用於一個更新。收斂到最低限度是不夠的。

您的第一個代碼更好,您應用了一個更新參數示例,但近似值不是很準確(因爲您僅使用一個示例)。

我建議你創建一個功能generate_mini_batch這對你的訓練數據集返回一個隨機組數據與它們相關聯的標籤和運行這個循環:

for i in range(N_STEPS) : # with N_STEPS very large 
     batch_x,batch_y = generate_mini_batch(trX,trY,s) # s is th size of the mini-batch 
     sess.run(train_op, feed_dict={X: batch_x, Y: batch_y}) 

這種方法被稱爲小批量梯度下降(見這個video),它實際上廣泛用於優化問題。

+0

明白了。令我感到驚訝的是,與全數據集相比,使用每個點估計的梯度來解決方案如此相似。小批量確實是一個看起來最佳的經典解決方案。謝謝 ! – JLB