如何在图构建时获取张量的尺寸(在TensorFlow中)?
deep-learning
python
tensor
tensorflow
6
0

我正在尝试一个操作不正常的操作。

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)

所以我需要知道张量embed的尺寸。我知道可以在运行时完成,但是对于这样一个简单的操作而言,这是太多的工作。有什么更简单的方法呢?

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

让我们简单到地狱。如果您想要一个单一的数字作为维数,例如2, 3, 4, etc.,则只需使用tf.rank() 。但是,如果您想要张量的确切形状,请使用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)
收藏
评论

只需在不运行的情况下打印出构造图(ops)之后的嵌入内容即可:

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)

这将显示嵌入张量的形状:

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

通常,在训练模型之前检查所有张量的形状是很好的。

收藏
评论

此帖子中的 Tensor.get_shape()

从文档

c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(c.get_shape())
==> TensorShape([Dimension(2), Dimension(3)])
收藏
评论

访问值的函数:

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

例:

batch_size, num_feats = shape(logits)
收藏
评论

我看到大多数人对tf.shape(tensor)tensor.get_shape()感到困惑,让我们澄清一下:

  1. tf.shape

tf.shape用于动态形状。如果张量的形状可变 ,请使用它。一个例子:输入是宽度和高度可变的图像,我们想要将其调整为其大小的一半,然后可以编写如下内容:
new_height = tf.shape(image)[0] / 2

  1. tensor.get_shape

tensor.get_shape用于固定形状,这意味着可以在图形中推导张量的形状

结论: tf.shape几乎可以在任何地方使用,但是只能从图形中推断出t.get_shape仅用于形状。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号