最近,我正在开展一个项目“通过在 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)