如何使用累积渐变更新模型参数?

wei*_*ong 15 python gradient tensorflow

我正在使用TensorFlow构建一个深度学习模型.TensorFlow的新手.

由于某种原因,我的模型具有有限的批量大小,然后这种有限的批量大小将使模型具有高的方差.

所以,我想用一些技巧来增加批量.我的想法是存储每个小批量的渐变,例如64个小批量,然后将渐变相加,使用这64个小批量训练数据的平均梯度来更新模型的参数.

这意味着对于前63个小批量,不更新参数,并且在64小批量之后,仅更新模型的参数一次.

但由于TensorFlow是基于图形的,有谁知道如何实现这个想要的功能?

非常感谢.

wei*_*ong 9

我在这里找到了一个解决方案:https://github.com/tensorflow/tensorflow/issues/3994#event-766328647

opt = tf.train.AdamOptimizer()
tvs = tf.trainable_variables()
accum_vars = [tf.Variable(tf.zeros_like(tv.initialized_value()), trainable=False) for tv in tvs]                                        
zero_ops = [tv.assign(tf.zeros_like(tv)) for tv in accum_vars]
gvs = opt.compute_gradients(rmse, tvs)
accum_ops = [accum_vars[i].assign_add(gv[0]) for i, gv in enumerate(gvs)]
train_step = opt.apply_gradients([(accum_vars[i], gv[1]) for i, gv in enumerate(gvs)])
Run Code Online (Sandbox Code Playgroud)

在训练循环中:

while True:
    sess.run(zero_ops)
    for i in xrange(n_minibatches):
        sess.run(accum_ops, feed_dict=dict(X: Xs[i], y: ys[i]))
    sess.run(train_step)
Run Code Online (Sandbox Code Playgroud)

但是这段代码看起来不是很干净漂亮,有谁知道如何优化这些代码?