105

Suppose I have a Tensorflow tensor. How do I get the dimensions (shape) of the tensor as integer values? I know there are two methods, tensor.get_shape() and tf.shape(tensor), but I can't get the shape values as integer int32 values.

For example, below I've created a 2-D tensor, and I need to get the number of rows and columns as int32 so that I can call reshape() to create a tensor of shape (num_rows * num_cols, 1). However, the method tensor.get_shape() returns values as Dimension type, not int32.

import tensorflow as tf import numpy as np sess = tf.Session() tensor = tf.convert_to_tensor(np.array([[1001,1002,1003],[3,4,5]]), dtype=tf.float32) sess.run(tensor) # array([[ 1001., 1002., 1003.], # [ 3., 4., 5.]], dtype=float32) tensor_shape = tensor.get_shape() tensor_shape # TensorShape([Dimension(2), Dimension(3)]) print tensor_shape # (2, 3) num_rows = tensor_shape[0] # ??? num_cols = tensor_shape[1] # ??? tensor2 = tf.reshape(tensor, (num_rows*num_cols, 1)) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 1750, in reshape # name=name) # File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 454, in apply_op # as_ref=input_arg.is_ref) # File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 621, in convert_to_tensor # ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) # File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 180, in _constant_tensor_conversion_function # return constant(v, dtype=dtype, name=name) # File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 163, in constant # tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape)) # File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 353, in make_tensor_proto # _AssertCompatible(values, dtype) # File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 290, in _AssertCompatible # (dtype.name, repr(mismatch), type(mismatch).__name__)) # TypeError: Expected int32, got Dimension(6) of type 'Dimension' instead. 

7 Answers 7

147

To get the shape as a list of ints, do tensor.get_shape().as_list().

To complete your tf.shape() call, try tensor2 = tf.reshape(tensor, tf.TensorShape([num_rows*num_cols, 1])). Or you can directly do tensor2 = tf.reshape(tensor, tf.TensorShape([-1, 1])) where its first dimension can be inferred.

Sign up to request clarification or add additional context in comments.

6 Comments

Thanks, that lets me call and complete tf.reshape(), but I would really like to get num_rows and num_cols as integers for other operations.
Try tensor.get_shape().as_list()
For completeness, this code works: num_rows, num_cols = x.get_shape().as_list()
Nice! I was using python int() to cast the results of x.get_shape(). ie num_rows=int(x.get_shape()[1]), num_cols=int(x.get_shape()[2]), etc.Yep, kinda a hacky to get around that pesky error, but it worked. Thanks for enlightening me to a better way :-)
In TF2.0, it seems not work: as_list() is not defined on an unknown TensorShape
|
33

Another way to solve this is like this:

tensor_shape[0].value 

This will return the int value of the Dimension object.

Comments

13

2.0 Compatible Answer: In Tensorflow 2.x (2.1), you can get the dimensions (shape) of the tensor as integer values, as shown in the Code below:

Method 1 (using tf.shape):

import tensorflow as tf c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) Shape = c.shape.as_list() print(Shape) # [2,3] 

Method 2 (using tf.get_shape()):

import tensorflow as tf c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) Shape = c.get_shape().as_list() print(Shape) # [2,3] 

2 Comments

is there any difference between the two methods?
8

for a 2-D tensor, you can get the number of rows and columns as int32 using the following code:

rows, columns = map(lambda i: i.value, tensor.get_shape()) 

1 Comment

Very inelegant. How does this add to the already provided answers?
2

Another simple solution is to use map() as follows:

tensor_shape = map(int, my_tensor.shape) 

This converts all the Dimension objects to int

Comments

0

In later versions (tested with TensorFlow 1.14) there's a more numpy-like way to get the shape of a tensor. You can use tensor.shape to get the shape of the tensor.

tensor_shape = tensor.shape print(tensor_shape) 

Comments

0

Using this line of code:

tensor_shape[0].value 

It will give you the shape of the tensor formatted as an integer.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.