【问题标题】:TensorFlow: Each iteration in training for-loop slower [duplicate]TensorFlow:训练for循环中的每次迭代速度较慢[重复]
【发布时间】:2016-05-28 02:29:20
【问题描述】:

我正在 TensorFlow 中训练具有三个隐藏层的标准、简单的多层感知器 ANN。我添加了一个文本进度条,这样我就可以看到迭代各个时期的进度。我发现在前几个时期之后,每次迭代的处理时间会增加。这是一个示例屏幕截图,显示了每次迭代的增加:

在这种情况下,前几次迭代大约需要 1.05 秒/次,而 100% 需要 4.01 秒/次。

这里列出了相关代码:

# ------------------------- Build the TensorFlow Graph -------------------------

with tf.Graph().as_default():

    (a bunch of statements for specifying the graph)

# --------------------------------- Training ----------------------------------

    sess = tf.InteractiveSession()
    sess.run(tf.initialize_all_variables())

    print "Start Training"

    pbar = tqdm(total = training_epochs)
    for epoch in range(training_epochs):
        avg_cost = 0.0
    batch_iter = 0

    while batch_iter < batch_size:
        train_features = []
        train_labels = []
        batch_segments = random.sample(train_segments, 20)
        for segment in batch_segments:
            train_features.append(segment[0])
            train_labels.append(segment[1])
        sess.run(optimizer, feed_dict={x: train_features, y_: train_labels})
        line_out = "," + str(batch_iter) + "\n"
        train_outfile.write(line_out)
        line_out = ",," + str(sess.run(tf.reduce_mean(weights['h1']), feed_dict={x: train_features, y_: train_labels}))
        line_out += "," + str(sess.run(tf.reduce_mean(weights['h2']), feed_dict={x: train_features, y_: train_labels}))
        line_out += "," + str(sess.run(tf.reduce_mean(weights['h3']), feed_dict={x: train_features, y_: train_labels})) + "\n"
        train_outfile.write(line_out)
        avg_cost += sess.run(cost, feed_dict={x: train_features, y_: train_labels})/batch_size

        batch_iter += 1

    pbar.update(1)  # Increment the progress bar by one

train_outfile.close()
print "Completed training"

在搜索 stackoverflow 时,我发现 Processing time gets longer and longer after each iteration 其他人也遇到问题,每次迭代花费的时间都比上一次长。但是,我相信我的可能会有所不同,因为他们清楚地使用如下语句向图中添加了操作:

distorted_image = tf.image.random_flip_left_right(image_tensor)

虽然我是 TensorFlow 新手,但我不相信自己会犯同样的错误,因为我的循环中唯一的东西是 sess.run() 调用。

非常感谢任何帮助。

【问题讨论】:

  • 使用 session.run 调用在循环体中添加强制序列化/复制整个图,因此这种循环具有二次复杂度。你可以做self.tf.get_default_graph().finalize() 让你不会像这样意外修改图表
  • @YaroslavBulatov,感谢您将我指向 finalize() 函数。我不知道那件事。我能够找到其他一些我不小心将操作添加到图表的地方。
  • @etarion,我明确提到了另一个线程(它是“这篇文章”的超链接)并且觉得我的不同。我将编辑我的问题以明确这一点。
  • @etarion,再看一遍我认为你是正确的。我被甩了,因为我认为在 sess.run() 中放置一个操作不会导致对图形的修改。虽然我同意这个问题被标记为重复,但我认为 YaroslavBulatov 和 Vincent 的答案是贡献,不应该被丢弃。
  • @DojoGojira,作为重复关闭不会丢弃答案,它只会阻止新答案。

标签: python for-loop tensorflow


【解决方案1】:

你拥有的三个地方:

sess.run(tf.reduce_mean(weights['h1']), ...)

每个都将一个新的tf.reduce_mean() 节点添加到图表在while 循环的每次迭代中,这会增加开销。尝试在 while 循环之外创建它们:

with tf.Graph().as_default():
  ...
  m1 = tf.reduce_mean(weights['h1'])

while batch_iter < batch_size:
  ...
  line_out = ",," + str(sess.run(m1, feed_dict={x: train_features, y_: train_labels}))

【讨论】:

  • Yaroslav 上面所说的在这种情况下也是正确的。
  • 是的,我不知道 finalize() 函数。你的回答很有帮助,所以我给你打了勾,但我最终还是用他的回答找到了其他一些我不小心在图表中添加操作的地方。感谢您非常明确的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2018-04-30
  • 1970-01-01
  • 2020-01-05
  • 2019-06-05
相关资源
最近更新 更多