returnn.extern.graph_editor.transform#

Class to transform an subgraph into another.

returnn.extern.graph_editor.transform.replace_t_with_placeholder_handler(info, t)[source]#

Transform a tensor into a placeholder tensor.

This handler is typically used to transform a subgraph input tensor into a placeholder.

Args:

info: Transform._TmpInfo instance. t: tensor whose input must be transformed into a place holder.

Returns:

The tensor generated by the newly created place holder.

returnn.extern.graph_editor.transform.keep_t_if_possible_handler(info, t)[source]#

Transform a tensor into itself (identity) if possible.

This handler transform a tensor into itself if the source and destination graph are the same. Otherwise it will create a placeholder. This handler is typically used to transform a hidden input tensors.

Args:

info: Transform._TmpInfo instance. t: tensor whose input must be transformed into a place holder.

Returns:

The tensor generated by the newly created place holder.

returnn.extern.graph_editor.transform.assign_renamed_collections_handler(info, elem, elem_)[source]#

Add the transformed elem to the (renamed) collections of elem.

A collection is renamed only if is not a known key, as described in tf.compat.v1.GraphKeys.

Args:

info: Transform._TmpInfo instance. elem: the original element (tf.Tensor or tf.Operation) elem_: the transformed element

returnn.extern.graph_editor.transform.transform_op_if_inside_handler(info, op, keep_if_possible=True)[source]#

Transform an optional op only if it is inside the subgraph.

This handler is typically use to handle original op: it is fine to keep them if they are inside the subgraph, otherwise they are just ignored.

Args:

info: Transform._TmpInfo instance. op: the optional op to transform (or ignore). keep_if_possible: re-attach to the original op if possible, that is,

if the source graph and the destination graph are the same.

Returns:

The transformed op or None.

returnn.extern.graph_editor.transform.copy_op_handler(info, op, new_inputs)[source]#

Copy a tf.Operation.

Args:

info: Transform._TmpInfo instance. op: the tf.Operation to be copied. new_inputs: The new inputs for this op.

Returns:

A (op, op_outputs) tuple containing the transformed op and its outputs.

class returnn.extern.graph_editor.transform.Transformer[source]#

Transform a subgraph into another one.

By default, the constructor create a transform which copy a subgraph and replaces inputs with placeholders. This behavior can be modified by changing the handlers.

Transformer constructor.

The following members can be modified: transform_op_handler: handle the transformation of a tf.Operation.

This handler defaults to a simple copy.

assign_collections_handler: handle the assignment of collections.

This handler defaults to assigning new collections created under the given name-scope.

transform_external_input_handler: handle the transform of the inputs to

the given subgraph. This handler defaults to creating placeholders instead of the ops just before the input tensors of the subgraph.

transform_external_hidden_input_handler: handle the transform of the

hidden inputs of the subgraph, that is, the inputs which are not listed in sgv.inputs. This handler defaults to a transform which keep the same input if the source and destination graphs are the same, otherwise use placeholders.

transform_original_op_handler: handle the transform of original_op. This

handler defaults to transforming original_op only if they are in the subgraph, otherwise they are ignored.

class returnn.extern.graph_editor.transform.TransformerInfo(info)[source]#

“Contains information about the result of a transform operation.

Constructor.

Args:
info: an instance of Transformer._TmpInfo containing various internal

information about the transform operation.

transformed(original, missing_fn=None)[source]#

Return the transformed op/tensor corresponding to the original one.

Note that the output of this function mimics the hierarchy of its input argument original. Given an iterable, it returns a list. Given an operation or a tensor, it will return an operation or a tensor.

Args:

original: the original tensor/operation. missing_fn: function handling the case where the counterpart

cannot be found. By default, None is returned.

Returns:

the transformed tensor/operation (or None if no match is found).

original(transformed, missing_fn=None)[source]#

Return the original op/tensor corresponding to the transformed one.

Note that the output of this function mimics the hierarchy of its input argument transformed. Given an iterable, it returns a list. Given an operation or a tensor, it will return an operation or a tensor.

Args:

transformed: the transformed tensor/operation. missing_fn: function handling the case where the counterpart

cannot be found. By default, None is returned.

Returns:

the original tensor/operation (or None if no match is found).

returnn.extern.graph_editor.transform.copy(sgv, dst_graph=None, dst_scope='', src_scope='', reuse_dst_scope=False)[source]#

Copy a subgraph.

Args:
sgv: the source subgraph-view. This argument is converted to a subgraph

using the same rules than the function subgraph.make_view.

dst_graph: the destination graph. dst_scope: the destination scope. src_scope: the source scope. reuse_dst_scope: if True the dst_scope is re-used if it already exists.

Otherwise, the scope is given a unique name based on the one given by appending an underscore followed by a digit (default).

Returns:
A tuple (sgv, info) where:

sgv is the transformed subgraph view; info is an instance of TransformerInfo containing information about the transform, including mapping between original and transformed tensors and operations.

Raises:

TypeError: if dst_graph is not a tf.Graph. StandardError: if sgv cannot be converted to a SubGraphView using

the same rules than the function subgraph.make_view.

returnn.extern.graph_editor.transform.copy_with_input_replacements(sgv, replacement_ts, dst_graph=None, dst_scope='', src_scope='', reuse_dst_scope=False)[source]#

Copy a subgraph, replacing some of its inputs.

Note a replacement only happens if the tensor to be replaced is an input of the given subgraph. The inputs of a subgraph can be queried using sgv.inputs.

Args:
sgv: the source subgraph-view. This argument is converted to a subgraph

using the same rules as the function subgraph.make_view.

replacement_ts: dictionary mapping from original tensors to the

replaced one.

dst_graph: the destination graph. dst_scope: the destination scope. src_scope: the source scope. reuse_dst_scope: if True the dst_scope is re-used if it already exists.

Otherwise, the scope is given a unique name based on the one given by appending an underscore followed by a digit (default).

Returns:
A tuple (sgv, info) where:

sgv is the transformed subgraph view; info is an instance of TransformerInfo containing information about the transform, including mapping between original and transformed tensors and operations.

Raises:

TypeError: if dst_graph is not a tf.Graph. StandardError: if sgv cannot be converted to a SubGraphView using

the same rules as the function subgraph.make_view.

returnn.extern.graph_editor.transform.graph_replace(target_ts, replacement_ts, dst_scope='', src_scope='', reuse_dst_scope=False)[source]#

Create a new graph which compute the targets from the replaced Tensors.

Args:

target_ts: a single tf.Tensor or an iterable of tf.Tensor. replacement_ts: dictionary mapping from original tensors to replaced tensors dst_scope: the destination scope. src_scope: the source scope. reuse_dst_scope: if True the dst_scope is re-used if it already exists.

Otherwise, the scope is given a unique name based on the one given by appending an underscore followed by a digit (default).

Returns:

A single tf.Tensor or a list of target tf.Tensor, depending on the type of the input argument target_ts. The returned tensors are recomputed using the tensors from replacement_ts.

Raises:

ValueError: if the targets are not connected to replacement_ts.