张量流中具有未指定尺寸的张量
python
tensorflow
6
0

我正在使用tensorflow并遇到以下代码问题:

def _init_parameters(self, input_data, labels):

    # the input shape is (batch_size, input_size)
    input_size = tf.shape(input_data)[1]

    # labels in one-hot format have shape (batch_size, num_classes)
    num_classes = tf.shape(labels)[1]

    stddev = 1.0 / tf.cast(input_size, tf.float32)

    w_shape = tf.pack([input_size, num_classes], 'w-shape')
    normal_dist = tf.truncated_normal(w_shape, stddev=stddev, name='normaldist')
    self.w = tf.Variable(normal_dist, name='weights')

(我正在使用tf.pack ,因为这个问题 ,因为我得到相同的错误)

当我运行它时(从调用此脚本的较大脚本中),我得到此错误:

ValueError: initial_value must have a shape specified: Tensor("normaldist:0", shape=TensorShape([Dimension(None), Dimension(None)]), dtype=float32)

我试图在交互式外壳程序中复制该过程。实际上,尽管提供的值确实存在,但normal_dist的尺寸未指定:

In [70]: input_size.eval()
Out[70]: 4

In [71]: num_classes.eval()
Out[71]: 3

In [72]: w_shape.eval()
Out[72]: array([4, 3], dtype=int32)

In [73]: normal_dist.eval()
Out[73]: 
array([[-0.27035281, -0.223277  ,  0.14694688],
       [-0.16527176,  0.02180306,  0.00807841],
       [ 0.22624688,  0.36425814, -0.03099642],
       [ 0.25575709, -0.02765726, -0.26169327]], dtype=float32)

In [78]: normal_dist.get_shape()
Out[78]: TensorShape([Dimension(None), Dimension(None)])

真奇怪Tensorflow生成矢量,但无法说出其形状。难道我做错了什么?

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

正如Ishamael所说,所有张量都具有静态形状,该静态形状在图构造时就已知,并且可以使用Tensor.get_shape()访问;动态形状,只有在运行时才知道,并且可以通过获取张量的值或将其传递给tf.shape类的运算符来tf.shape 。在许多情况下,静态和动态形状是相同的,但是它们可以不同-可以部分定义静态形状-以允许动态形状从一个步骤到下一个步骤变化。

在您的代码中normal_dist具有部分定义的静态形状,因为w_shape是一个计算值。 (TensorFlow有时会尝试在图形构建时评估这些计算值,但会卡在tf.pack 。)它会推断出TensorShape([Dimension(None), Dimension(None)])的形状,其含义是“具有行和列的数量未知”,因为它知道w_shape是长度为2的向量,因此结果normal_dist必须为二维。

您有两种选择来处理此问题。您可以按照Ishamael的建议设置静态形状,但这需要您在图形构建时知道形状。例如,以下可能有效:

normal_dist.set_shape([input_data.get_shape()[1], labels.get_shape()[1]])

或者,您可以将validate_shape=False传递给tf.Variable构造函数 。这使您可以创建具有部分定义的形状的变量,但是它限制了可以在图形中稍后推断的静态形状信息的数量。

收藏
评论

变量可以具有动态形状。 get_shape()返回静态形状。

在您的情况下,您的张量具有动态形状,并且当前恰好持有4x3的值(但在其他时候,它可以持有具有不同形状的值-因为形状是动态的)。要设置静态形状,请使用set_shape(w_shape) 。之后,将设置您设置的形状,并且张量将是有效的initial_value

收藏
评论

TF FAQ中很好地解释了类似的问题:

在TensorFlow中,张量既具有静态(推断)形状又具有动态(真实)形状。可以使用tf.Tensor.get_shape方法读取静态形状:此形状是根据用于创建张量的操作推断出来的,并且可以部分完成。如果静态形状没有完全定义,则可以通过评估tf.shape(t)来确定张量t的动态形状。

所以tf.shape()返回一个张量,将始终具有shape=(N,)的大小,并且可以在会话中进行计算:

a = tf.Variable(tf.zeros(shape=(2, 3, 4)))
with tf.Session() as sess:
    print sess.run(tf.shape(a))

另一方面,您可以使用x.get_shape().as_list()提取静态形状,并且可以在任何位置进行计算。

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

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号