TensorFlow 2.x

Eager Execution is enabled by default, so just call .numpy() on the Tensor object.

import tensorflow as tf

a = tf.constant([[1, 2], [3, 4]])

b = tf.add(a, 1)

a.numpy()

# array([[1, 2],

# [3, 4]], dtype=int32)

b.numpy()

# array([[2, 3],

# [4, 5]], dtype=int32)

tf.multiply(a, b).numpy()

# array([[ 2, 6],

# [12, 20]], dtype=int32)

See NumPy Compatibility for more. It is worth noting (from the docs),

Numpy array may share memory with the Tensor object. Any changes to one may be reflected in the other.

Bold emphasis mine. A copy may or may not be returned, and this is an implementation detail based on whether the data is in CPU or GPU (in the latter case, a copy has to be made from GPU to host memory).

But why am I getting AttributeError: ‘Tensor’ object has no attribute ‘numpy’?.

A lot of folks have commented about this issue, there are a couple of possible reasons:

TF 2.0 is not correctly installed (in which case, try re-installing), or

TF 2.0 is installed, but eager execution is disabled for some reason. In such cases, call tf.compat.v1.enable_eager_execution() to enable it, or see below.

If Eager Execution is disabled, you can build a graph and then run it through tf.compat.v1.Session:

a = tf.constant([[1, 2], [3, 4]])

b = tf.add(a, 1)

out = tf.multiply(a, b)

out.eval(session=tf.compat.v1.Session())

# array([[ 2, 6],

# [12, 20]], dtype=int32)

See also TF 2.0 Symbols Map for a mapping of the old API to the new one.

Any tensor returned by Session.run or eval is a NumPy array.

>>> print(type(tf.Session().run(tf.constant([1,2,3]))))

Or:

>>> sess = tf.InteractiveSession()

>>> print(type(tf.constant([1,2,3]).eval()))

Or, equivalently:

>>> sess = tf.Session()

>>> with sess.as_default():

>>> print(type(tf.constant([1,2,3]).eval()))

EDIT: Not any tensor returned by Session.run or eval() is a NumPy array. Sparse Tensors for example are returned as SparseTensorValue:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))