2016-11-07 68 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