2017-06-15 45 views
0

当我用在TensoFlow中构造Graph时获取图层形状?

concat = tf.concat([query_rep, title_rep, cos_similarity], axis=1) 
    print(concat.shape[1].value) 
    # query_rep + title_rep + cos_similarity 
    hidden_size = concat.shape[1] 

我发现我不能得到CONCAT形状,它将返回None。我必须专门为hidden_size赋值,例如hidden_size=201。我怎样才能自动获取形状?

另外,对于我的CNN网络,我想填充每批中的输入序列而不是整个数据集。所以我必须做出max_len a placeholder,但后来我发现placeholder不能作为另一个placeholder的参数。例如以下代码不起作用

self.max_len = tf.placeholder(int32) 
    self.query_holder = tf.placeholder(tf.int32, shape=[None, self.max_len]) 

该怎么做到的?

回答

1

有形状的两个“种”:该静态形状可以在编译时来推断和动态形状仅在运行期间是已知的。为了让静态的形状,你可以调用my_tensor.get_shape()在张量,访问动感的外形,你可以打电话tf.shape(my_tensor)。如果get_shape()返回None那么只能动态地知道形状。如果您有关于形状的其他信息,则可以使用my_tensor.set_shape()设置形状。

关于第二个问题,你为什么不使用

self.query_holder = tf.placeholder(tf.int32, shape=[None, None]) 

这样两个尺寸是可变的。

+0

第二个解决方案看起来不错!谢谢,但第一个,'tf.shape(my_tensor)'仍然不能得到形状,并返回错误信息'ValueError异常:initial_value必须指定的形状:张量(“random_normal:0?”,形状=(?) ,dtype = float32)'并且不能使用这个形状创建一个新图层的参数'h_W = tf.Variable(tf.random_normal(shape = [hidden_​​size,hidden_​​size],stddev = 0.1),name ='h_W')' – danche

+0

是的,这是正常的。当你创建一个变量时,必须在编译时知道该形状,所以如果该动态形状具有未知值(如你的那样),则不能使用另一个张量的动态形状作为新变量的形状。你必须事先知道'hidden_​​size',你通常会这样做,因为这是你的架构的设计选择。 – kaufmanu