QBoard » Artificial Intelligence & ML » AI and ML - Tensorflow » How to get the dimensions of a tensor (in TensorFlow) at graph construction time?

How to get the dimensions of a tensor (in TensorFlow) at graph construction time?

  • I am trying an Op that is not behaving as expected.

    graph = tf.Graph()
    with graph.as_default():
      train_dataset = tf.placeholder(tf.int32, shape=[128, 2])
      embeddings = tf.Variable(
        tf.random_uniform([50000, 64], -1.0, 1.0))
      embed = tf.nn.embedding_lookup(embeddings, train_dataset)
      embed = tf.reduce_sum(embed, reduction_indices=0)​

    So I need to know the dimensions of the Tensor embed. I know that it can be done at the run time but it's too much work for such a simple operation. What's the easier way to do it?

    This post was edited by Advika Banerjee at September 2, 2020 3:26 PM IST
      September 2, 2020 3:25 PM IST
    0
  • I see most people confused about tf.shape(tensor) and tensor.get_shape() Let's make it clear:

    1.tf.shape

    tf.shape is used for dynamic shape. If your tensor's shape is changable, use it. An example: a input is an image with changable width and height, we want resize it to half of its size, then we can write something like:
    new_height = tf.shape(image)[0] / 2

    2.tensor.get_shape

    tensor.get_shape is used for fixed shapes, which means the tensor's shape can be deduced in the graph.

    Conclusion: tf.shape can be used almost anywhere, but t.get_shape only for shapes can be deduced from graph.
      September 2, 2020 4:40 PM IST
    0
  • A function to access the values:

    def shape(tensor):
        s = tensor.get_shape()
        return tuple([s.value for i in range(0, len(s))])

    Example:

    batch_size, num_feats = shape(logits)
      September 2, 2020 4:42 PM IST
    0

  • Let's make it simple as hell. If you want a single number for the number of dimensions like 2, 3, 4, etc., then just use tf.rank(). But, if you want the exact shape of the tensor then use tensor.get_shape().

    with tf.Session() as sess:
       arr = tf.random_normal(shape=(10, 32, 32, 128))
       a = tf.random_gamma(shape=(3, 3, 1), alpha=0.1)
       print(sess.run([tf.rank(arr), tf.rank(a)]))
       print(arr.get_shape(), ", ", a.get_shape())     
    
    
    # for tf.rank()    
    [4, 3]
    
    # for tf.get_shape()
    Output: (10, 32, 32, 128) , (3, 3, 1)​
      September 2, 2020 4:54 PM IST
    0
  • Tensor.get_shape() from this post.

    From documentation:

    c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
    print(c.get_shape())
    ==> TensorShape([Dimension(2), Dimension(3)])​
      September 2, 2020 4:57 PM IST
    0
  • The method tf.shape is a TensorFlow static method. However, there is also the method get_shape for the Tensor class. See

    https://www.tensorflow.org/api_docs/python/tf/Tensor#get_shape

      September 3, 2020 1:46 PM IST
    0
  • Just print out the embed after construction graph (ops) without running:

    import tensorflow as tf
    
    ...
    
    train_dataset = tf.placeholder(tf.int32, shape=[128, 2])
    embeddings = tf.Variable(
        tf.random_uniform([50000, 64], -1.0, 1.0))
    embed = tf.nn.embedding_lookup(embeddings, train_dataset)
    print (embed)


    This will show the shape of the embed tensor:

    Tensor("embedding_lookup:0", shape=(128, 2, 64), dtype=float32)


    Usually, it's good to check shapes of all tensors before training your models.

      September 3, 2020 1:56 PM IST
    0
    • Advika Banerjee
      Advika Banerjee @Raji Reddy A, your answer gives more information about the tensor than just its shape, hence, I accept it as the correct answer..
      September 3, 2020