How to get the dimensions of a tensor (in TensorFlow) at graph construction time?
I see most people confused about tf.shape(tensor)
and tensor.get_shape()
Let's make it clear:
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
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.
Tensor.get_shape()
from this post.
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])print(c.get_shape())==> TensorShape([Dimension(2), Dimension(3)])
A function to access the values:
def shape(tensor): s = tensor.get_shape() return tuple([s[i].value for i in range(0, len(s))])
Example:
batch_size, num_feats = shape(logits)