首页 > 解决方案 > 如何在 Tensorflow 的小批量中进行选择性反向传播?

问题描述

最近,我正在开展一个项目“通过在 Tensorflow 中使用 LSTM,根据过去的轨迹预测对象的未来轨迹”。(这里,轨迹是指一系列 2D 位置。)

LSTM 的输入当然是“过去的轨迹”,输出是“未来的轨迹”。

mini-batch 的大小在训练时是固定的。但是,小批量中过去轨迹的数量可以不同。例如,让 mini-batch 大小为 10。如果当前训练迭代只有 4 条过去的轨迹,则 mini-batch 中 10 个中的 6 个被填充为零值。

在计算反向传播的损失时,我让 6 的损失为零,这样只有 4 有助于反向传播。

我担心的问题是..Tensorflow 似乎仍然计算 6 的梯度,即使它们的损失为零。结果,即使我使用相同的训练数据,随着我增加小批量大小,训练速度也会变慢。

在计算损失时,我还使用了 tf.where 函数。但是,训练时间并没有减少。

如何减少培训时间?

在这里,我附上了我的伪代码进行培训。

# For each frame in a sequence
for f in range(pred_length):

    # For each element in a batch
    for b in range(batch_size):


        with tf.variable_scope("rnnlm") as scope:
            if (f > 0 or b > 0):
                scope.reuse_variables()

            # for each pedestrian in an element
            for p in range(MNP):

                # ground-truth position
                cur_gt_pose = ...

                # loss mask
                loss_mask_ped = ... # '1' or '0'

                # go through RNN decoder
                output_states_dec_list[b][p], zero_states_dec_list[b][p] = cell_dec(cur_embed_frm_dec,
                                                                                    zero_states_dec_list[b][p])

                # fully connected layer for output
                cur_pred_pose_dec = tf.nn.xw_plus_b(output_states_dec_list[b][p], output_wd, output_bd)

                # go through embedding function for the next input
                prev_embed_frms_dec_list[b][p] = tf.reshape(tf.nn.relu(tf.nn.xw_plus_b(cur_pred_pose_dec, embedding_wd, embedding_bd)), shape=(1, rnn_size))

                # calculate MSE loss
                mse_loss = tf.reduce_sum(tf.pow(tf.subtract(cur_pred_pose_dec, cur_gt_pose_dec), 2.0))

                # only valid ped's traj contributes to the loss
                self.loss += tf.multiply(mse_loss, loss_mask_ped)

标签: tensorflowlstmbackpropagationmini-batch

解决方案


我认为您正在寻找功能tf.stop_gradienttf.where(loss_mask, tensor, tf.stop_gradient(tensor))假设尺寸正确 ,您可以使用它来实现所需的结果。

但是,看起来这可能不是您的问题。似乎对于数据集中的每个项目,您都在定义新的图形节点。这不是 TensorFlow 应该如何运作的,你应该只拥有一个预先构建的图表来执行一些固定的功能,而不管批量大小。您绝对不应该为批处理中的每个元素定义新节点,因为这不能有效地利用并行性。


推荐阅读