Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带线程的TensorFlow摘要_Python_Multithreading_Tensorflow_Tensorboard - Fatal编程技术网

Python 带线程的TensorFlow摘要

Python 带线程的TensorFlow摘要,python,multithreading,tensorflow,tensorboard,Python,Multithreading,Tensorflow,Tensorboard,我试图将摘要添加到异步运行的TensorFlow图中。我已经在单线程的情况下完成了所有工作,但是一旦我转到多线程,总结似乎就消失了。这里有一个玩具的例子,我正在尝试做什么 import tensorflow as tf # 1.1.0 import threading class Worker: def __init__(self): self.x = tf.Variable([1, -2, 3], tf.float32, name='x') sel

我试图将摘要添加到异步运行的TensorFlow图中。我已经在单线程的情况下完成了所有工作,但是一旦我转到多线程,总结似乎就消失了。这里有一个玩具的例子,我正在尝试做什么

import tensorflow as tf  # 1.1.0
import threading


class Worker:
    def __init__(self):
        self.x = tf.Variable([1, -2, 3], tf.float32, name='x')
        self.y = tf.Variable([-1, 2, -3], tf.float32, name='y')
        self.dot_product = tf.reduce_sum(tf.multiply(self.x, self.y))
        tf.summary.scalar("Dot_Product", self.dot_product)

    def work(self):
        for i in range(10):
            SESS.run(self.dot_product)

            # Write summary
            summary_str = SESS.run(tf.summary.merge_all())
            WRITER.add_summary(summary_str, i)
            WRITER.flush()

COORD = tf.train.Coordinator()
SESS = tf.Session()
WRITER = tf.summary.FileWriter(SUMMARY_DIR, SESS.graph)

# Single Thread  case
w = Worker()
SESS.run(tf.global_variables_initializer())
print(tf.get_collection(tf.GraphKeys.SUMMARIES))
w.work()
这个很好用。但是,如果我使用多线程:

# Multi-thread case
workers = [Worker() for i in range(4)]
SESS.run(tf.global_variables_initializer())
print(tf.get_collection(tf.GraphKeys.SUMMARIES))

worker_threads = []
for worker in workers:
    job = lambda: worker.work()
    t = threading.Thread(target=job)
    t.start()
    worker_threads.append(t)
COORD.join(worker_threads)
无论何时调用
tf.summary.merge_all()
,我都会遇到这样的错误,因为它看不到任何摘要:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/home/anjum/PycharmProjects/junk.py", line 43, in <lambda>
    job = lambda: worker.work()
  File "/home/anjum/PycharmProjects/junk.py", line 22, in work
    summary_str = SESS.run(tf.summary.merge_all())
  File "/usr/local/lib/python3.5/dist-
packages/tensorflow/python/client/session.py", line 778, in run
    run_metadata_ptr)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 969, in _run
fetch_handler = _FetchHandler(self._graph, fetches, feed_dict_string)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 408, in __init__
self._fetch_mapper = _FetchMapper.for_fetch(fetches)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 227, in for_fetch
(fetch, type(fetch)))
TypeError: Fetch argument None has invalid type <class 'NoneType'>
线程2中的异常: 回溯(最近一次呼叫最后一次): 文件“/usr/lib/python3.5/threading.py”,第914行,在内部引导中 self.run() 文件“/usr/lib/python3.5/threading.py”,第862行,正在运行 自我目标(*自我参数,**自我参数) 文件“/home/anjum/PycharmProjects/junk.py”,第43行,在 job=lambda:worker.work() 文件“/home/anjum/PycharmProjects/junk.py”,第22行,工作中 summary\u str=SESS.run(tf.summary.merge\u all()) 文件“/usr/local/lib/python3.5/dist- packages/tensorflow/python/client/session.py”,第778行,运行中 运行_元数据_ptr) 文件“/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py”,第969行,正在运行 fetch\u handler=\u FetchHandler(self.\u图形、fetches、feed\u dict\u字符串) 文件“/usr/local/lib/python3.5/dist packages/tensorflow/python/client/session.py”,第408行,在__ self.\u fetch\u mapper=\u FetchMapper.for\u fetch(fetches) 文件“/usr/local/lib/python3.5/dist packages/tensorflow/python/client/session.py”,第227行,for_fetch (fetch,键入(fetch))) TypeError:获取参数None的类型无效 如果我将
print(tf.get\u collection(tf.GraphKeys.SUMMARIES))
放入
work()
中,将返回一个空列表。这意味着我的总结在某个地方丢失了


有人能解释一下如何正确使用多线程摘要吗?

我想我已经弄明白了-必须像这样合并摘要。我不能100%确定为什么TensorFlow对这个问题如此挑剔

class Worker:
    def __init__(self):
        self.x = tf.Variable([1, -2, 3], tf.float32, name='x')
        self.y = tf.Variable([-1, 2, -3], tf.float32, name='y')
        self.dot_product = tf.reduce_sum(tf.multiply(self.x, self.y))
        tf.summary.scalar("Dot_Product", self.dot_product)

        self.summarise = tf.summary.merge_all()

    def work(self):
        for i in range(10):
            SESS.run(self.dot_product)

            # Write summary
            summary = SESS.run(self.summarise)
            WRITER.add_summary(summary, i)
            WRITER.flush()

我想我已经弄明白了-总结必须像这样合并。我不能100%确定为什么TensorFlow对这个问题如此挑剔

class Worker:
    def __init__(self):
        self.x = tf.Variable([1, -2, 3], tf.float32, name='x')
        self.y = tf.Variable([-1, 2, -3], tf.float32, name='y')
        self.dot_product = tf.reduce_sum(tf.multiply(self.x, self.y))
        tf.summary.scalar("Dot_Product", self.dot_product)

        self.summarise = tf.summary.merge_all()

    def work(self):
        for i in range(10):
            SESS.run(self.dot_product)

            # Write summary
            summary = SESS.run(self.summarise)
            WRITER.add_summary(summary, i)
            WRITER.flush()