我正在尝试更新每个时期的权重,但我正在分批处理数据。问题是,为了规范化损失,我需要在训练循环之外记录 TensorFlow 变量(以进行跟踪和规范化)。但是当我这样做时,训练时间是巨大的。
我认为,它会将所有批次的变量累积到图中并在最后计算梯度。
我已经开始在 for 循环外和 for 循环内跟踪变量,后者比第一个更快。我对为什么会发生这种情况感到困惑,因为无论我做什么,我的模型的可训练变量和损失都保持不变。
# Very Slow
loss_value = 0
batches = 0
with tf.GradientTape() as tape:
for inputs, min_seq in zip(dataset, minutes_sequence):
temp_loss_value = my_loss_function(inputs, min_seq)
batches +=1
loss_value = loss_value + temp_loss_value
# The following line takes huge time.
grads = tape.gradient(loss_value, model.trainable_variables)
# Very Fast
loss_value = 0
batches = 0
for inputs, min_seq in zip(dataset, minutes_sequence):
with tf.GradientTape() as tape:
temp_loss_value = my_loss_function(inputs, min_seq)
batches +=1
loss_value = loss_value + temp_loss_value
# If I do the following line, the graph will break because this are out of tape's scope.
loss_value = loss_value / batches
# the following line takes huge time
grads = tape.gradient(loss_value, model.trainable_variables)
当我在 for 循环内声明 tf.GradientTape() 时,它非常快,但我在外面它很慢。
PS - 这是一个自定义损失,架构只包含一个大小为 10 的隐藏层。
我想知道,tf.GradientTape() 的位置的不同之处以及它应该如何用于在批处理数据集中更新每个时期的权重。