Python 如何实现霍格威德!Tensorflow中的样式更新
我试图在Tensorflow中实现一个简单的hogwild概念证明。理想情况下,它将使用Python线程来执行更新。我已经完成了一个实现,它紧跟着TF网站上的专家教程Deep MNIST,除了Hogwild。可在以下位置获得实施: 代码的关键部分如下:Python 如何实现霍格威德!Tensorflow中的样式更新,python,tensorflow,deep-learning,Python,Tensorflow,Deep Learning,我试图在Tensorflow中实现一个简单的hogwild概念证明。理想情况下,它将使用Python线程来执行更新。我已经完成了一个实现,它紧跟着TF网站上的专家教程Deep MNIST,除了Hogwild。可在以下位置获得实施: 代码的关键部分如下: def accuracy(session, graphs, data_iter, num_threads, train=False): num_total = 0 num_correct = 0 def proces
def accuracy(session, graphs, data_iter, num_threads, train=False):
num_total = 0
num_correct = 0
def process_batch(batch_x, batch_y):
nonlocal num_correct
nonlocal num_total
with graphs.lease() as g:
input_placeholder, output_placeholder, \
keep_prob_placeholder, train_step_f, num_correct_f, \
no_op = g
batch_num_correct, _ = session.run(
[num_correct_f, train_step_f if train else no_op],
{
input_placeholder: batch_x,
output_placeholder: batch_y,
keep_prob_placeholder: 0.5 if train else 1.0,
})
num_correct += batch_num_correct
num_total += len(batch_x)
with BlockOnFullThreadPool(max_workers=num_threads, queue_size=num_threads // 2) as pool:
for i, (batch_x, batch_y) in enumerate(data_iter):
pool.submit(process_batch, batch_x, batch_y)
pool.shutdown(wait=True)
return float(num_correct) / float(num_total)
所以本质上我创建了num_threads
tensorflow表达式集(在我的代码中,它们是命名不好的-图),其中变量被重用,优化器不使用锁定。现在,该实现具有所有期望的特性(并行化加速、收敛时的性能等),但每次我运行它时,在获得最佳性能后,它都会在第30纪元左右发生变化,这只是num_threads=10
的情况,而不是num_threads=1
(此处提供了针对num_threads=10
的每个历元日志的培训/验证:)
有人知道是什么原因造成的吗?我遗漏了一些基本的东西吗?例如,每个图形都在单独的数组中计算梯度吗?你创建多个图形是什么意思?你创建了多个
图形对象吗?如果是,你如何让多个图形对象重用同一个变量对象?不,我只是cre在同一个图中吃了多个变量,我这边的措辞很糟糕,对不起。您是否检查了num_线程1和10的不同值的行为?“如果不收敛,请保持冷静并降低您的学习率。”:-)