tf.Graph
Вычисление TensorFlow, представленное в виде графа потоков данных.
tf.Graph() -> None
Используется в ноутбуках
| Используется в руководстве | Используется в учебных пособиях |
|---|---|
Графы используются tf.function для представления вычислений функции. Каждый граф содержит набор объектов tf.Operation, которые представляют единицы вычисления; и объекты tf.Tensor, которые представляют единицы данных, передаваемые между операциями.
Использование графов напрямую (устарело)
Граф tf.Graph можно создать и использовать напрямую без tf.function, как это требовалось в TensorFlow 1, но это устарело, и рекомендуется использовать tf.function вместо этого. Если граф используется напрямую, также необходимы другие устаревшие классы TensorFlow 1 для выполнения графа, такие как tf.compat.v1.Session.
Определенный граф можно зарегистрировать с помощью менеджера контекста tf.Graph.as_default. Затем операции будут добавляться в граф вместо того, чтобы выполняться немедленно. Например:
g = tf.Graph() with g.as_default(): # Define operations and tensors in `g`. c = tf.constant(30.0) assert c.graph is g
tf.compat.v1.get_default_graph() можно использовать для получения графа по умолчанию.
Важно: этот класс не потокобезопасен для построения графа. Все операции должны создаваться из одного потока, или должна быть обеспечена внешняя синхронизация. За исключением случаев, когда явно указано обратное, все методы не потокобезопасны.
Экземпляр Graph поддерживает произвольное количество "коллекций", которые идентифицируются по имени. Для удобства при построении большого графа коллекции могут хранить группы связанных объектов: например, tf.Variable использует коллекцию (с именем tf.GraphKeys.GLOBAL_VARIABLES) для всех переменных, которые создаются во время построения графа. Вызывающая сторона может определить дополнительные коллекции, указав новое имя.
| Атрибуты | |
|---|---|
building_function | Возвращает True, если этот граф представляет собой функцию. |
collections | Возвращает имена известных этому графу коллекций. |
finalized | True, если этот граф завершен. |
graph_def_versions | Информация о версии GraphDef этого графа. Для получения подробностей о значении каждой версии см. |
operations | |
seed | Случайное зерно уровня графа этого графа. |
version | |
Методы
Dismantle
Dismantle()
(self: handle) -> None
add_to_collection
add_to_collection(
name, value
) -> None
Хранит value в коллекции с заданным name.
Обратите внимание, что коллекции не являются множествами, поэтому можно несколько раз добавить значение в коллекцию.
| Аргументы | |
|---|---|
name | Ключ для коллекции. Класс GraphKeys содержит много стандартных имен коллекций. |
value | Значение для добавления в коллекцию. |
add_to_collections
add_to_collections(
names, value
) -> None
Хранит value в коллекциях, заданных names.
Обратите внимание, что коллекции не являются множествами, поэтому можно несколько раз добавить значение в коллекцию. Эта функция гарантирует, что дубликаты в names будут игнорироваться, но она не будет проверять предварительное членство value в любой из коллекций в names.
names может быть любым итерируемым объектом, но если names является строкой, она обрабатывается как одно имя коллекции.
| Аргументы | |
|---|---|
names | Ключи коллекций для добавления. Класс GraphKeys содержит много стандартных имен коллекций. |
value | Значение для добавления в коллекции. |
as_default
as_default() -> ContextManager['Graph']
Возвращает менеджер контекста, который делает этот Graph текущим графом по умолчанию.
Этот метод следует использовать, если вы хотите создать несколько графов в одном процессе. Для удобства предоставлен глобальный граф по умолчанию, и все операции будут добавлены в этот граф, если вы не создаете новый граф явно.
Используйте этот метод с ключевым словом with, чтобы указать, что операции, созданные в рамках блока, должны быть добавлены в этот граф. В этом случае после выхода из области действия with предыдущий граф по умолчанию снова устанавливается как граф по умолчанию. Есть стек, поэтому вложенные вызовы as_default допустимы.
Граф по умолчанию является свойством текущего потока. Если вы создаете новый поток и хотите использовать граф по умолчанию в этом потоке, вы должны явно добавить with g.as_default(): в функцию этого потока.
Следующие примеры кода эквивалентны:
# 1. Using Graph.as_default(): g = tf.Graph() with g.as_default(): c = tf.constant(5.0) assert c.graph is g # 2. Constructing and making default: with tf.Graph().as_default() as g: c = tf.constant(5.0) assert c.graph is g
Если выполнение жадно включено, операции, созданные в рамках этого менеджера контекста, будут добавлены в граф вместо того, чтобы выполняться немедленно.
| Возвращает | |
|---|---|
| Менеджер контекста для использования этого графа как графа по умолчанию. |
as_graph_def
as_graph_def(
from_version=None, add_shapes=False, use_pybind11_proto=False
) -> tf.compat.v1.GraphDef
Возвращает сериализованное представление этой графы.
Сериализованное представление можно импортировать в другую графу (используя соответствующий метод) или использовать с API сессии C++.
Этот метод потокобезопасен.
| Аргументы | |
|---|---|
from_version
|
Необязательно. Если установлено, возвращает представление, содержащее только узлы, добавленные в эту графу с момента заданного значения свойства version.
|
add_shapes
|
Если True, добавляет атрибут "_output_shapes" к каждому узлу с вычисленными формами каждого из его выходов. |
use_pybind11_proto
|
Если True, использует c++ pybind11_proto API для получения прото GraphDef напрямую из c++, вместо получения через буфер TF. См. https://github.com/pybind/pybind11_protobuf для справки. |
| Возвращаемое значение | |
|---|---|
| Протокол буфера GraphDef. |
| Возможные исключения | |
|---|---|
ValueError
|
Если сериализация graph_def будет слишком большой.
|
as_graph_element
as_graph_element(
obj, allow_tensor=True, allow_operation=True
) -> Union[tensor_lib.Tensor, 'Operation']
Возвращает объект, на который ссылается obj, как элемент Operation или Tensor.
Эта функция проверяет, что obj представляет элемент этой графы, и выдает информативное сообщение об ошибке, если это не так.
Эта функция является стандартным способом получения/проверки объекта одного из разрешенных типов из ссылки на внешний аргумент в API сессии.
Этот метод может вызываться одновременно из нескольких потоков.
| Аргументы | |
|---|---|
obj
|
Объект Tensor, Operation или имя тензора или операции. Также может быть любым объектом с методом _as_graph_element(), возвращающим значение одного из этих типов. Примечание: _as_graph_element будет вызван внутри блокировки графы и, следовательно, не может изменить графу.
|
allow_tensor
|
Если True, obj может ссылаться на Tensor.
|
allow_operation
|
Если True, obj может ссылаться на Operation.
|
| Возвращаемое значение | |
|---|---|
Соответствующий элемент Tensor или Operation в графе obj.
|
| Возможные исключения | |
|---|---|
TypeError
|
Если obj не является типом, который мы поддерживаем для преобразования в типы.
|
ValueError
|
Если obj имеет подходящий тип, но некорректен. Например, некорректная строка.
|
KeyError
|
Если obj не является объектом в графе.
|
clear_collection
clear_collection(
name
) -> None
Очищает все значения в коллекции.
| Аргументы | |
|---|---|
name
|
Ключ коллекции. Класс GraphKeys содержит много стандартных имен коллекций.
|
colocate_with
@tf_contextlib.contextmanager
colocate_with(
op, ignore_existing=False
) -> Iterator[None]
Возвращает контекстный менеджер, который задаёт операцию для совмещения местоположения.
Примечание: эта функция не предназначена для публичного использования, только для внутренних библиотек.
For example:
a = tf.Variable([1.0]) with g.colocate_with(a): b = tf.constant(1.0) c = tf.add(a, b)
b и c всегда будут совмещены по местоположению с a, независимо от того, где a будет в конечном счете размещён.
Примечание: Использование области совмещения местоположения сбрасывает любые существующие ограничения устройства.
Если op равно None, то ignore_existing должно быть True, и новая область сбрасывает все ограничения совмещения местоположения и устройства.
| Аргументы | |
|---|---|
op
|
Операция для совмещения местоположения с созданными операциями или None.
|
ignore_existing
|
Если True, применяется только совмещение местоположения этой операции в рамках контекста, а не применение всех свойств совмещения местоположения в стеке. Если op равно None, это значение должно быть True.
|
| Возможные исключения | |
|---|---|
ValueError
|
если op равно None, но ignore_existing равно False. |
| Возвращаемое значение | |
|---|---|
| Контекстный менеджер, который определяет операцию для совмещения местоположения вновь созданных операций. |
container
@tf_contextlib.contextmanager
container(
container_name
) -> Iterator[str]
Возвращает контекстный менеджер, который определяет контейнер ресурсов для использования.
Состоятельные операции, такие как переменные и очереди, могут сохранять своё состояние на устройствах, чтобы их можно было использовать несколькими процессами. Контейнер ресурсов — это строковое имя, под которым отслеживаются эти состоятельные операции. Эти ресурсы можно освободить или очистить с помощью tf.Session.reset().
For example:
with g.container('experiment0'):
# All stateful Operations constructed in this context will be placed
# in resource container "experiment0".
v1 = tf.Variable([1.0])
v2 = tf.Variable([2.0])
with g.container("experiment1"):
# All stateful Operations constructed in this context will be
# placed in resource container "experiment1".
v3 = tf.Variable([3.0])
q1 = tf.queue.FIFOQueue(10, tf.float32)
# All stateful Operations constructed in this context will be
# be created in the "experiment0".
v4 = tf.Variable([4.0])
q1 = tf.queue.FIFOQueue(20, tf.float32)
with g.container(""):
# All stateful Operations constructed in this context will be
# be placed in the default resource container.
v5 = tf.Variable([5.0])
q3 = tf.queue.FIFOQueue(30, tf.float32)
# Resets container "experiment0", after which the state of v1, v2, v4, q1
# will become undefined (such as uninitialized).
tf.Session.reset(target, ["experiment0"])
| Аргументы | |
|---|---|
container_name
|
Строковое имя контейнера. |
| Возвращаемое значение | |
|---|---|
| Контекстный менеджер для определения контейнеров ресурсов для состоятельных операций, возвращает имя контейнера. |
control_dependencies
control_dependencies(
control_inputs
) -> _ControlDependenciesController
Возвращает контекстный менеджер, который определяет зависимости управления.
Используйте с ключевым словом with, чтобы указать, что все операции, созданные в контексте, должны иметь зависимости управления от control_inputs. Например:
with g.control_dependencies([a, b, c]): # `d` and `e` will only run after `a`, `b`, and `c` have executed. d = ... e = ...
Несколько вызовов control_dependencies() могут быть вложены, и в этом случае новая Operation будет иметь зависимости управления от объединения control_inputs из всех активных контекстов.
with g.control_dependencies([a, b]):
# Ops constructed here run after `a` and `b`.
with g.control_dependencies([c, d]):
# Ops constructed here run after `a`, `b`, `c`, and `d`.
Можно передать None, чтобы очистить зависимости управления:
with g.control_dependencies([a, b]):
# Ops constructed here run after `a` and `b`.
with g.control_dependencies(None):
# Ops constructed here run normally, not waiting for either `a` or `b`.
with g.control_dependencies([c, d]):
# Ops constructed here run after `c` and `d`, also not waiting
# for either `a` or `b`.
Примечание: Контекст зависимостей управления применяется только к операциям, которые созданы внутри контекста. Простое использование операции или тензора в контексте не добавляет зависимость управления. Следующий пример иллюстрирует этот момент:
# WRONG
def my_func(pred, tensor):
t = tf.matmul(tensor, tensor)
with tf.control_dependencies([pred]):
# The matmul op is created outside the context, so no control
# dependency will be added.
return t
# RIGHT
def my_func(pred, tensor):
with tf.control_dependencies([pred]):
# The matmul op is created in the context, so a control dependency
# will be added.
return tf.matmul(tensor, tensor)
Также обратите внимание, что хотя выполнение операций, созданных в рамках этой области, вызовет выполнение зависимостей, созданные в рамках этой области операции могут всё ещё быть удалены из обычной графы TensorFlow. Например, в следующем фрагменте кода зависимости никогда не выполняются:
loss = model.loss()
with tf.control_dependencies(dependencies):
loss = loss + tf.constant(1) # note: dependencies ignored in the
# backward pass
return tf.gradients(loss, model.variables)
Это связано с тем, что для вычисления градиента не требуется вычисление операции константы(1), созданной в прямом проходе.
| Аргументы | |
|---|---|
control_inputs
|
Список объектов Operation или Tensor, которые должны быть выполнены или вычислены перед запуском операций, определённых в контексте. Также может быть None для очистки зависимостей управления.
|
| Возвращаемое значение | |
|---|---|
| Контекстный менеджер, который определяет зависимости управления для всех операций, созданных в рамках контекста. |
| Возможные исключения | |
|---|---|
TypeError
|
Если control_inputs не является списком объектов Operation или Tensor.
|
create_op
create_op(
op_type,
inputs,
dtypes=None,
input_types=None,
name=None,
attrs=None,
op_def=None,
compute_shapes=True,
compute_device=True
) -> 'Operation'
Создаёт операцию Operation в этой графе. (устаревшие аргументы)
Это интерфейс низкого уровня для создания Operation. Большинство программ не будут вызывать этот метод напрямую, а вместо этого будут использовать конструкторы Python-операций, такие как tf.constant(), которые добавляют операции в график по умолчанию.
| Аргументы | |
|---|---|
op_type | Тип Operation для создания. Это соответствует полю OpDef.name в прото, определяющем операцию. |
inputs | Список объектов Tensor, которые будут входными данными для Operation. |
dtypes | (Необязательно) Список объектов DType, которые будут типами тензоров, создаваемых операцией. |
input_types | (Необязательно.) Список DType, которые будут типами тензоров, потребляемых операцией. По умолчанию использует базовый DType каждого входного элемента в inputs. Операции, ожидающие входных данных ссылочного типа, должны явно указать input_types. |
name | (Необязательно) Имя операции в виде строки. Если не указано, имя генерируется на основе op_type. |
attrs | (Необязательно) Словарь, где ключ — это имя атрибута (строка), а значение — соответствующий атрибут attr прото NodeDef, который будет представлять операцию (прото AttrValue). |
op_def | (Необязательно) Прото OpDef, описывающий op_type, который будет иметь операция. |
compute_shapes | (Необязательно) Устаревший. Не оказывает никакого влияния (фигуры всегда вычисляются). |
compute_device | (Необязательно) Если True, функции устройства будут выполняться для вычисления свойства устройства операции. |
| Исключения | |
|---|---|
TypeError | если какой-либо из входных данных не является Tensor. |
ValueError | если возникнут конфликты размещения с существующим назначением устройства. |
| Возвращаемые значения | |
|---|---|
Объект Operation. |
device
@tf_contextlib.contextmanager
device(
device_name_or_function
) -> Iterator[None]
Возвращает контекстный менеджер, определяющий устройство по умолчанию для использования.
Аргумент device_name_or_function может быть строкой имени устройства, функцией устройства или None:
- Если это строка имени устройства, все операции, созданные в этом контексте, будут назначены устройству с этим именем, если не переопределены вложенным контекстом
device(). - Если это функция, она будет обрабатываться как функция от объектов Operation к строкам имен устройств, и вызывается каждый раз при создании новой Operation. Operation будет назначена устройству с возвращенным именем.
- Если это None, все вызовы
device()из окружающего контекста будут игнорироваться.
Дополнительную информацию о допустимом синтаксисе строк имен устройств см. в документации DeviceNameUtils.
Например:
with g.device('/device:GPU:0'):
# All operations constructed in this context will be placed
# on GPU 0.
with g.device(None):
# All operations constructed in this context will have no
# assigned device.
# Defines a function from `Operation` to device string.
def matmul_on_gpu(n):
if n.type == "MatMul":
return "/device:GPU:0"
else:
return "/cpu:0"
with g.device(matmul_on_gpu):
# All operations of type "MatMul" constructed in this context
# will be placed on GPU 0; all other operations will be placed
# on CPU 0.
Примечание: Область действия устройства может быть переопределена обертками операций или другим кодом библиотеки. Например, операция присваивания переменнойv.assign()должна быть размещена совместно сtf.Variablev, и несовместимые области действия устройств будут игнорироваться.
| Аргументы | |
|---|---|
device_name_or_function | Имя устройства или функция для использования в контексте. |
| Возвращаемые значения | |
|---|---|
| Контекстный менеджер, который определяет устройство по умолчанию для использования для вновь созданных операций. |
| Исключения | |
|---|---|
RuntimeError | Если области действия устройств не правильно вложены. |
finalize
finalize() -> None
Завершает этот график, сделав его только для чтения.
После вызова g.finalize() новые операции не могут быть добавлены в g. Этот метод используется для обеспечения того, что к графику не добавляются операции, когда он используется в нескольких потоках, например, при использовании tf.compat.v1.train.QueueRunner.
get
get() -> GraphType
get_all_collection_keys
get_all_collection_keys() -> list[str]
Возвращает список коллекций, используемых в этом графике.
get_collection
get_collection(
name, scope=None
) -> list[Any]
Возвращает список значений в коллекции с заданным name.
Это отличается от get_collection_ref(), которое всегда возвращает фактический список коллекций, так как каждый раз возвращает новый список.
| Аргументы | |
|---|---|
name | Ключ для коллекции. Например, класс GraphKeys содержит много стандартных имен коллекций. |
scope | (Необязательно.) Строка. Если задано, результирующий список фильтруется так, чтобы включать только элементы, атрибут name которых совпадает с scope с помощью re.match. Элементы без атрибута name никогда не возвращаются, если задан scope. Выбор re.match означает, что scope без специальных маркеров фильтруется по префиксу. |
| Возвращаемые значения | |
|---|---|
Список значений в коллекции с заданным name или пустой список, если в эту коллекцию не было добавлено значений. Список содержит значения в порядке их сбора. |
get_collection_ref
get_collection_ref(
name
) -> list[Any]
Возвращает список значений в коллекции с заданным name.
Если коллекция существует, это возвращает сам список, который можно изменить на месте для изменения коллекции. Если коллекция не существует, она создается как пустой список, и список возвращается.
Это отличается от get_collection(), которое всегда возвращает копию списка коллекции, если он существует, и никогда не создает пустую коллекцию.
| Аргументы | |
|---|---|
name | Ключ для коллекции. Например, класс GraphKeys содержит много стандартных имен коллекций. |
| Возвращаемые значения | |
|---|---|
Список значений в коллекции с заданным name или пустой список, если в эту коллекцию не было добавлено значений. |
get_name_scope
get_name_scope() -> str
Возвращает текущую область имен.
Например:
with tf.name_scope('scope1'):
with tf.name_scope('scope2'):
print(tf.compat.v1.get_default_graph().get_name_scope())
выведет строку scope1/scope2.
| Возвращаемые значения | |
|---|---|
| Строка, представляющая текущую область имен. |
get_operation_by_name
get_operation_by_name(
name
) -> 'Operation'
Возвращает Operation с заданным name.
Этот метод можно вызывать одновременно из нескольких потоков.
| Аргументы | |
|---|---|
name | Имя Operation, которое нужно вернуть. |
| Возвращаемые значения | |
|---|---|
Operation с заданным name. |
| Исключения | |
|---|---|
TypeError | Если name не является строкой. |
KeyError | Если name не соответствует операции в этом графе. |
get_operations
get_operations()
(self: handle) -> список
get_tensor_by_name
get_tensor_by_name(
name
) -> tf.Tensor
Возвращает Tensor с заданным name.
Этот метод может вызываться одновременно из нескольких потоков.
| Аргументы | |
|---|---|
name | Имя Tensor, которое нужно вернуть. |
| Возвращаемое значение | |
|---|---|
Tensor с заданным name. |
| Исключения | |
|---|---|
TypeError | Если name не является строкой. |
KeyError | Если name не соответствует тензору в этом графе. |
gradient_override_map
@tf_contextlib.contextmanager
gradient_override_map(
op_type_map
) -> Iterator[None]
ЭКСПЕРИМЕНТАЛЬНО: Менеджер контекста для переопределения функций градиента.
Этот менеджер контекста может использоваться для переопределения функции градиента, которая будет использоваться для операций в рамках контекста.
Например:
@tf.RegisterGradient("CustomSquare")
def _custom_square_grad(op, grad):
# ...
with tf.Graph().as_default() as g:
c = tf.constant(5.0)
s_1 = tf.square(c) # Uses the default gradient for tf.square.
with g.gradient_override_map({"Square": "CustomSquare"}):
s_2 = tf.square(s_2) # Uses _custom_square_grad to compute the
# gradient of s_2.
| Аргументы | |
|---|---|
op_type_map | Словарь, сопоставляющий строки типа операции с альтернативными строками типа операции. |
| Возвращаемое значение | |
|---|---|
| Менеджер контекста, который устанавливает альтернативный тип операции, используемый для одной или нескольких операций, созданных в этом контексте. |
| Исключения | |
|---|---|
TypeError | Если op_type_map не является словарем, сопоставляющим строки со строками. |
is_feedable
is_feedable(
tensor
) -> bool
Возвращает True тогда и только тогда, когда tensor является подаваемым.
is_fetchable
is_fetchable(
tensor_or_op
) -> bool
Возвращает True тогда и только тогда, когда tensor_or_op извлекается.
name_scope
@tf_contextlib.contextmanager
name_scope(
name
) -> Iterator[str]
Возвращает менеджер контекста, который создает иерархические имена для операций.
Граф поддерживает стек имен пространств. Оператор with name_scope(...): добавляет новое имя в стек на время существования контекста.
Аргумент name будет интерпретирован следующим образом:
- Строка (не заканчивающаяся на '/') создаст новое пространство имен, в котором
nameбудет добавлен к префиксу всех операций, созданных в контексте. Еслиnameуже использовалось, оно будет сделано уникальным путем вызоваself.unique_name(name). - Пространство имен, ранее полученное из оператора
with g.name_scope(...) as scope:, будет обработано как "абсолютное" пространство имен, что позволяет повторно войти в существующие пространства имен. - Значение
Noneили пустая строка сбросят текущее пространство имен до верхнего уровня (пустого) пространства имен.
Например:
with tf.Graph().as_default() as g:
c = tf.constant(5.0, name="c")
assert c.op.name == "c"
c_1 = tf.constant(6.0, name="c")
assert c_1.op.name == "c_1"
# Creates a scope called "nested"
with g.name_scope("nested") as scope:
nested_c = tf.constant(10.0, name="c")
assert nested_c.op.name == "nested/c"
# Creates a nested scope called "inner".
with g.name_scope("inner"):
nested_inner_c = tf.constant(20.0, name="c")
assert nested_inner_c.op.name == "nested/inner/c"
# Create a nested scope called "inner_1".
with g.name_scope("inner"):
nested_inner_1_c = tf.constant(30.0, name="c")
assert nested_inner_1_c.op.name == "nested/inner_1/c"
# Treats `scope` as an absolute name scope, and
# switches to the "nested/" scope.
with g.name_scope(scope):
nested_d = tf.constant(40.0, name="d")
assert nested_d.op.name == "nested/d"
with g.name_scope(""):
e = tf.constant(50.0, name="e")
assert e.op.name == "e"
Само имя пространства имен можно получить с помощью with g.name_scope(...) as scope:, которое сохраняет имя пространства имен в переменной scope. Это значение может быть использовано для именования операции, которая представляет собой общий результат выполнения операций в пространстве имен. Например:
inputs = tf.constant(...)
with g.name_scope('my_layer') as scope:
weights = tf.Variable(..., name="weights")
biases = tf.Variable(..., name="biases")
affine = tf.matmul(inputs, weights) + biases
output = tf.nn.relu(affine, name=scope)
Примечание: Этот конструктор проверяет переданное name. Действительные имена пространств имен соответствуют одному из следующих регулярных выражений:
[A-Za-z0-9.][A-Za-z0-9_.\-/]* (for scopes at the root) [A-Za-z0-9_.\-/]* (for other scopes)
| Аргументы | |
|---|---|
name | Имя пространства имен. |
| Возвращаемое значение | |
|---|---|
Менеджер контекста, который устанавливает name как новое пространство имен. |
| Исключения | |
|---|---|
ValueError | Если name не является допустимым именем пространства имен в соответствии с вышеупомянутыми правилами. |
new_operations
new_operations()
(self: handle) -> Список[TF_Operation]
num_operations
num_operations()
(self: handle) -> int
op_def_for_type
op_def_for_type(
type
) -> op_def_pb2.OpDef
Возвращает прото OpDef для type. type является строкой.
prevent_feeding
prevent_feeding(
tensor
) -> None
Помечает заданный tensor как неподаваемый в этом графе.
prevent_fetching
prevent_fetching(
op
) -> None
Помечает заданный op как неизвлекаемый в этом графе.
switch_to_thread_local
switch_to_thread_local() -> None
Переключение стеков устройства, совмещенной размещения и зависимостей на локальные для потока.
Стек устройства, совмещенной размещения и зависимостей по умолчанию не являются локальными для потока. Если к ним обращаются несколько потоков, состояние разделяемое. Это означает, что один поток может повлиять на поведение другого потока.
После вызова этого метода стеки становятся локальными для потока. Если к ним обращаются несколько потоков, состояние не разделяемое. Каждый поток использует своё значение; поток не влияет на другие потоки, изменяя такой стек.
Начальное значение для стека каждого потока устанавливается в текущее значение стека, когда switch_to_thread_local() был вызван впервые.
unique_name
unique_name(
name, mark_as_used=True
) -> str
Возвращает уникальное имя операции для name.
Примечание: Вам редко нужно вызыватьunique_name()напрямую. В большинстве случаев вам достаточно создать блокиwith g.name_scope()для генерации структурированных имён.
unique_name используется для генерации структурированных имён, разделенных "/", чтобы помочь в идентификации операций при отладке графа. Имена операций отображаются в сообщения об ошибках, отправленных исполнителем TensorFlow, и в различных инструментах визуализации, таких как TensorBoard.
Если mark_as_used установлено в True, что является значением по умолчанию, создаётся новое уникальное имя и помечается как используемое. Если оно установлено в False, уникальное имя возвращается без фактической пометки как используемое. Это полезно, когда вызывающий просто хочет узнать, каким будет созданное имя.
| Аргументы | |
|---|---|
name | Имя для операции. |
mark_as_used | Нужно ли отмечать это имя как используемое. |
| Возвращаемое значение | |
|---|---|
Строка, которая должна быть передана в create_op() и будет использоваться для именования создаваемой операции. |
__enter__
__enter__() -> GraphType
__exit__
__exit__(
*args
) -> None
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/Graph