TensorFlow-在大批次上运行优化器OP



通常,我们将带有优化器操作的运行命令称为输入,以更新某些模型的可训练参数:

session.run(model.optimizer_op, feed_dict={model.X: X_batch, model.y: y_batch})

但是,当批处理大小很大时,x_ batch不能适合GPU内存。我如何拆分此任务以处理大批量大小?

这主要取决于您的GPU内存大小。但是,很难将整个数据集与模型及其所需的操作(即预测概率)一起拟合。因此,您需要从不同的角度考虑批处理。我认为您的代码符合这些行:

# Model Definition    
X = tf.placeholder(tf.float32, shape=[None, DIM,DIM,3], name='X')
y = tf.placeholder(tf.float32, shape=[None, N_CLASSES], name='y')
...
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
...
# Training your model
sess.run([train_step], feed_dict={X: X_batch, y: y_batch})

而不是将Xy用作feed_dict的CC_2。您可以为所有批次(即整个数据集)累积cross_entropy。然后,您可以运行一次train_step。例如:

cross_entropy_all = []
for X_batch, y_batch in batches_generator():
    cross_entropy_all += sess.run([cross_entropy], feed_dict={X: X_batch, y: y_batch})
# Numpy or Tensorflow equivalent for `vstack`
cross_entropy_all = np.vstack(cross_entropy_all)
# Run the optimizer on the entire dataset (not just on a specific batch)
sess.run([train_step], feed_dict={cross_entropy: cross_entropy_all})

这应该实现您的目标,而无需使您的GPU脱离记忆。建议的方法对所有交叉熵进行优化步骤。因此,您无需喂食X和Y(用于生产cross_entropy所需的/所需的X和Y。

最新更新