我试图了解Tensorflow培训如何取决于之前运行的结果。当我们训练模型时,我们将在优化器中指定学习速率,以最低成本训练模型。子时代的学习率不会改变,但是当全局步骤达到子时期的倍数时,学习率会发生变化。
def Train(...):
epoch = 5
sub_epoch = 3
for i in range(epoch):
for j in range(sub_epoch):
session.run(optimizer, ...)
因为我不确定Tensorflow在训练数据时是如何工作的,并且如果每次运行都依赖于之前运行的内部结果,我害怕将训练分成多个线程,这可能导致不准确的训练结果。
让我们说sub-epoch是3,我们可以在3个不同线程中以相同的学习率训练每个子纪元的数据,并等待所有3个线程在完成下一个纪元训练之前完成吗?
Thread 1, epoch 0, sub-epoch 0: Train(data1, lr1)
Thread 2, epoch 0, sub-epoch 1: Train(data2, lr1)
Thread 3, epoch 0, sub-epoch 2: Train(data3, lr1)
[wait for all 3 threads to complete]
Thread 1, epoch 1, sub-epoch 0: Train(data4, lr2)
Thread 2, epoch 1, sub-epoch 1: Train(data5, lr2)
Thread 3, epoch 1, sub-epoch 2: Train(data6, lr2)
...
我想知道培训依赖性,请有人告诉我下面哪些描述是正确的?
因为我不熟悉它是如何工作的,我可能会问一些愚蠢的问题,请随时告诉我上述任何事情是否错误(例如我们不需要等待所有3个线程完成等)< / p>
答案 0 :(得分:1)
您所描述的是异步培训,其中不协调变量更新(即每个工作者/线程获取每个变量可用的任何值,然后发送其更新)。在这种情况下,session.run
调用没有等效的单线程排序,因为模型&#34;快照&#34;是不一致的。
一种流行的替代方法是同步训练,其中每个工作人员为每个变量获得相同的值。这实际上只是为您提供了更大的批量。 tf.train.SyncReplicasOptimizer是进行同步训练的一种方式。