当我们以最小批量大小的数据输入输入张量时,用于GradientDescentOptimizer的Tensorflow minimize API是否已经实现了最小批量?

我正在阅读此bolg,这表明minibatch未在minimize方法中实现,我们必须先执行compute_gradients,然后累积梯度,最后执行apply_gradients,以完成minibatch训练。

def train_standard(opt_type, learning_rate, image_set):
# Arrays for logging accuracy and loss
acc_log = np.zeros(len(image_set))
loss_log = np.zeros(len(image_set))
# Create optimizer
opt = opt_type(learning_rate)
#
# no-minibatch (standard, simple) operation
#
minimize = opt.minimize(loss)
# Create session to execute ops
sess = tf.InteractiveSession()
# Necessary initializations
tf.set_random_seed(1234)
tf.global_variables_initializer().run()
# Train loop
for i, batch in enumerate(image_set):
    sess.run(minimize, feed_dict={x: batch[0], y_: batch[1]})

    acc_log[i] = sess.run(accuracy,
                          feed_dict={x: mnist.test.images, y_: mnist.test.labels})
    loss_log[i] = sess.run(loss,
                           feed_dict={x: mnist.test.images, y_: mnist.test.labels})

return acc_log, loss_log


但是,当我进行实验时,我发现两种方法会产生相似的结果。我想知道如果我们minimize是一个小批量大小矩阵而不是仅仅一行训练数据,那么feed_dict方法是否会进行小批量更新。

如果我错了,谁能帮助我澄清这个问题并纠正我?

最好的祝福

最佳答案

这取决于您对小批量学习的定义。一种实现方法是简单地对一个小批量进行采样,执行权重更新(即计算向前和向后通过),对另一个小批量进行采样,进行另一个权重更新等等。当您一次只送入一个小批量时,使用Optimizer.minimize()即可轻松完成此操作。 AFAIK,这是最常用的方法。

您喜欢的帖子旨在做其他事情:在多个小批处理上计算梯度(即,计算前进和后退传递,但不改变权重),然后使用所有累积的梯度执行一次权重更新。这当然是不同的,并且需要执行更多工作(如文章中所示)。

09-26 18:40