TensorFlow中实现任意尺寸输入的异步梯度更新方案
本文介绍在TensorFlow中如何处理任意尺寸输入数据的Batch梯度更新。当网络支持不同尺寸图片时,可通过先独立计算每个样本的梯度,再在内存中累加或求平均,最后统一应用优化器更新参数。该方法避免了固定Placeholder的限制,实现了灵活的异步梯度更新策略。
背景说明:
在常规的网络训练流程中,通常会设定batchsize参数,即按批次更新梯度。这一机制的前提是Batch内所有图片的尺寸必须一致,以便能够组装成固定的placeholder。然而,如果设计的网络对输入图片的尺寸没有严格限制,允许任意尺寸的图片输入,同时我们又希望保持按Batch更新梯度的效率,该如何实现呢?
具体操作步骤如下:
首先计算梯度:
# 模型部分
Optimizer = tf.train.GradientDescentOptimizer(1)
gradient = Optimizer.compute_gradients(loss) # 每次计算所有变量的梯度
grads_holder = [(tf.placeholder(tf.float32, shape=g.get_shape()), v) for (g, v) in gradient]# 将每次计算的梯度保存
optm = Optimizer.apply_gradients(grads_holder) # 进行梯度更新
# 初始化部分
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
# 实际训练部分
grads = [] # 定义一个空的列表用于存储每次计算的梯度
for i in range(batchsize): # batchsize设置在这里
x_i = ... # 输入
y_real = ... # 标签
grad_i = sess.run(gradient, feed_dict={inputs: x_i, outputs: y_real}) #梯度计算
grads.append(grad_i) # 梯度存储
# 定义一个空的字典用于存储,batchsize中所有梯度的和
grads_sum = {}
# 将网络中每个需要更新梯度的变量都遍历一遍
for i in range(len(grads_holder)):
k = grads_holder[i][0] # 得到该变量名
# 将该变量名下的所有梯度求和,这里也可以求平均,求平均只需要除以batchsize
grads_sum[k] = sum([g[i][0] for g in grads])
# 完成梯度更新
sess.run(optm,feed_dict=grads_sum)
以上关于TensorFlow实现梯度异步更新的示例内容分享完毕,希望能为读者提供参考,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













