Создаются ли несколько экземпляров графа при создании двух сеансов TensorFlow? - PullRequest
1 голос
/ 05 июня 2019

Фон

Я изучаю TensorFlow, проходя часть II Практического машинного обучения с Scikit-Learn и TensorFlow , и один из вопросов упражнения - ( выделен жирным шрифтом текст мой дополнение, чтобы внести ясность в вопрос):

"Если вы создадите график g, содержащий переменную w, затем запустите два потока и откройте сеанс в каждом потоке, оба используют один и тот же график g, будет ли каждый сеанс иметь собственная копия переменной w или она будет передана в общий доступ? "

Ответ, приведенный в конце книги, ниже:

"В локальном TensorFlow сеанс управляет значениями переменных, поэтому, если вы создаете график g, содержащий переменную w, затем запускаете два потока и открываете локальный сеанс в каждом потоке, оба используют один и тот же график g, тогда каждый сеанс будет иметь свою собственную копию переменной w ... "

Мой вопрос

Является ли A) или B) правильной интерпретацией происходящего?

A) . В обоих сеансах используется один и тот же экземпляр графика g, и две отдельные переменные связаны только с двумя отдельными сеансами.

B) При создании двух отдельных сеансов два потока используют одну и ту же архитектуру графа g, но два отдельных экземпляра создаются графы g, приводящие к двум различным переменным.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Я думаю, что проблема здесь заключается в неоднозначности термина "создание экземпляров", а также о том, что на самом деле представляют граф и сеанс.

Если у вас есть один граф и два открытых сеанса, для него есть только одинэкземпляр графа.Это объект Python, который описывает вычисления, выполняемые вашей моделью, а именно операции между тензорами, возможно, включая некоторые постоянные значения и переменные.Если вы добавите новый элемент в этот график (новая операция), он будет доступен обоим сеансам.Важно понимать, что графы статичны, то есть у них нет состояния, и они ничего не вычисляют как таковые, они просто описывают, как будут выполняться вычисления.Его можно рассматривать как аналог исходного кода компьютерной программы.

Сеанс - это объект, который хранит состояние для графа, который может выполнять вычисления на нем.Это «состояние» содержит, самое главное, значение переменных в графе.Таким образом, сам объект переменной является частью графа (и в этом смысле «разделяется» между сеансами), но значение, которое он имеет в любое время, сохраняется в каждом открытом сеансе.Однако значения переменных - не единственное, что хранится в сессии.У вас также есть такие вещи, как статус генераторов случайных чисел или итераторов наборов данных.См. Что такое «объект с состоянием» в тензорном потоке? .Следуя предыдущей аналогии, сеанс будет чем-то вроде памяти и ЦП, используемых для выполнения программы, для которой граф является исходным кодом.

Если попытаться ответить на ваш вопрос более конкретно, правильная интерпретация будет А) , я думаю, если я правильно понимаю, что вы имеете в виду правильно.

0 голосов
/ 05 июня 2019

Давайте посмотрим, что произойдет:

tf.reset_default_graph()
w = tf.Variable(tf.random_uniform([2,3]), name="w")
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    w1 = sess.run(w)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    w2 = sess.run(w)

assert np.testing.assert_equal(w1, w2)

И мы получим ошибку подтверждения.Это означает, что B) является правильным ответом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...