tf.einsum
Stay organized with collections
Save and categorize content based on your preferences.
Tensor contraction over specified indices and outer product.
tf.einsum(
equation, *inputs, **kwargs
)
This function returns a tensor whose elements are defined by equation
,
which is written in a shorthand form inspired by the Einstein summation
convention. As an example, consider multiplying two matrices
A and B to form a matrix C. The elements of C are given by:
C[i,k] = sum_j A[i,j] * B[j,k]
The corresponding equation
is:
ij,jk->ik
In general, the equation
is obtained from the more familiar element-wise
equation by
- removing variable names, brackets, and commas,
- replacing "*" with ",",
- dropping summation signs, and
- moving the output to the right, and replacing "=" with "->".
Many common operations can be expressed in this way. For example:
# Matrix multiplication
>>> einsum('ij,jk->ik', m0, m1) # output[i,k] = sum_j m0[i,j] * m1[j, k]
# Dot product
>>> einsum('i,i->', u, v) # output = sum_i u[i]*v[i]
# Outer product
>>> einsum('i,j->ij', u, v) # output[i,j] = u[i]*v[j]
# Transpose
>>> einsum('ij->ji', m) # output[j,i] = m[i,j]
# Trace
>>> einsum('ii', m) # output[j,i] = trace(m) = sum_i m[i, i]
# Batch matrix multiplication
>>> einsum('aij,ajk->aik', s, t) # out[a,i,k] = sum_j s[a,i,j] * t[a, j, k]
To enable and control broadcasting, use an ellipsis. For example, to do
batch matrix multiplication, you could use:
einsum('...ij,...jk->...ik', u, v)
This function behaves like numpy.einsum
, but does not support:
- Subscripts where an axis appears more than once for a single input
(e.g.
ijj,k->ik
) unless it is a trace (e.g. ijji
).
Args |
equation
|
a str describing the contraction, in the same format as
numpy.einsum .
|
*inputs
|
the inputs to contract (each one a Tensor ), whose shapes should
be consistent with equation .
|
name
|
A name for the operation (optional).
|
Returns |
The contracted Tensor , with shape determined by equation .
|
Raises |
ValueError
|
If
- the format of
equation is incorrect,
- the number of inputs implied by
equation does not match len(inputs) ,
- an axis appears in the output subscripts but not in any of the inputs,
- the number of dimensions of an input differs from the number of
indices in its subscript, or
- the input shapes are inconsistent along a particular axis.
|
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2020-10-01 UTC.
[null,null,["Last updated 2020-10-01 UTC."],[],[],null,["# tf.einsum\n\n\u003cbr /\u003e\n\n|----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|\n| [TensorFlow 2 version](/api_docs/python/tf/einsum) | [View source on GitHub](https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/special_math_ops.py#L170-L308) |\n\nTensor contraction over specified indices and outer product.\n\n#### View aliases\n\n\n**Main aliases**\n\n[`tf.linalg.einsum`](/api_docs/python/tf/einsum)\n**Compat aliases for migration**\n\nSee\n[Migration guide](https://www.tensorflow.org/guide/migrate) for\nmore details.\n\n[`tf.compat.v1.einsum`](/api_docs/python/tf/einsum), [`tf.compat.v1.linalg.einsum`](/api_docs/python/tf/einsum), \\`tf.compat.v2.einsum\\`, \\`tf.compat.v2.linalg.einsum\\`\n\n\u003cbr /\u003e\n\n tf.einsum(\n equation, *inputs, **kwargs\n )\n\nThis function returns a tensor whose elements are defined by `equation`,\nwhich is written in a shorthand form inspired by the Einstein summation\nconvention. As an example, consider multiplying two matrices\nA and B to form a matrix C. The elements of C are given by: \n\n C[i,k] = sum_j A[i,j] * B[j,k]\n\nThe corresponding `equation` is: \n\n ij,jk-\u003eik\n\nIn general, the `equation` is obtained from the more familiar element-wise\nequation by\n\n1. removing variable names, brackets, and commas,\n2. replacing \"\\*\" with \",\",\n3. dropping summation signs, and\n4. moving the output to the right, and replacing \"=\" with \"-\\\u003e\".\n\nMany common operations can be expressed in this way. For example: \n\n # Matrix multiplication\n \u003e\u003e\u003e einsum('ij,jk-\u003eik', m0, m1) # output[i,k] = sum_j m0[i,j] * m1[j, k]\n\n # Dot product\n \u003e\u003e\u003e einsum('i,i-\u003e', u, v) # output = sum_i u[i]*v[i]\n\n # Outer product\n \u003e\u003e\u003e einsum('i,j-\u003eij', u, v) # output[i,j] = u[i]*v[j]\n\n # Transpose\n \u003e\u003e\u003e einsum('ij-\u003eji', m) # output[j,i] = m[i,j]\n\n # Trace\n \u003e\u003e\u003e einsum('ii', m) # output[j,i] = trace(m) = sum_i m[i, i]\n\n # Batch matrix multiplication\n \u003e\u003e\u003e einsum('aij,ajk-\u003eaik', s, t) # out[a,i,k] = sum_j s[a,i,j] * t[a, j, k]\n\nTo enable and control broadcasting, use an ellipsis. For example, to do\nbatch matrix multiplication, you could use: \n\n einsum('...ij,...jk-\u003e...ik', u, v)\n\nThis function behaves like `numpy.einsum`, but does not support:\n\n- Subscripts where an axis appears more than once for a single input (e.g. `ijj,k-\u003eik`) unless it is a trace (e.g. `ijji`).\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Args ---- ||\n|------------|--------------------------------------------------------------------------------------------------|\n| `equation` | a `str` describing the contraction, in the same format as `numpy.einsum`. |\n| `*inputs` | the inputs to contract (each one a `Tensor`), whose shapes should be consistent with `equation`. |\n| `name` | A name for the operation (optional). |\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Returns ------- ||\n|---|---|\n| The contracted `Tensor`, with shape determined by `equation`. ||\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Raises ------ ||\n|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `ValueError` | If \u003cbr /\u003e - the format of `equation` is incorrect, - the number of inputs implied by `equation` does not match `len(inputs)`, - an axis appears in the output subscripts but not in any of the inputs, - the number of dimensions of an input differs from the number of indices in its subscript, or - the input shapes are inconsistent along a particular axis. |"]]