Tensorflow 在TensoFlow中构造图形时获取图层形状?

Tensorflow 在TensoFlow中构造图形时获取图层形状?,tensorflow,neural-network,Tensorflow,Neural Network,当我使用 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。我必须专门为隐藏的大小指定一个值,例如隐藏的大小=201。如何自动获取

当我使用

    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
。我必须专门为
隐藏的大小
指定一个值,例如
隐藏的大小=201
。如何自动获取形状

此外,对于我的
CNN
网络,我希望在每个批中填充输入序列,而不是在整个数据集中填充。因此,我必须使
max_len
成为
占位符
,但随后我发现
占位符
不能用作另一个
占位符
的参数。e、 g.以下代码不起作用

    self.max_len = tf.placeholder(int32)
    self.query_holder = tf.placeholder(tf.int32, shape=[None, self.max_len])
如何实现这一点?

有两种“类型”的形状:可以在编译时推断的静态形状和只有在运行时才知道的动态形状。要获取静态形状,可以在张量上调用
my\u tensor.get\u shape()
,要访问动态形状,可以调用
tf.shape(my\u tensor)
。如果
get_shape()
返回
None
,则只能动态地知道形状。如果您有关于形状的其他信息,可以使用
my\u tensor.set\u shape()
设置形状

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

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

这样,两个维度都是可变的。

第二个解决方案看起来不错!谢谢,但是对于第一个,
tf.shape(my_tensor)
仍然无法获取形状并返回错误信息
ValueError:initial_值必须指定一个形状:tensor(“random_normal:0”,shape=(?,?),dtype=float32)
并且不能使用此形状创建新层的参数
h_W=tf.Variable(tf.random_normal(shape=[hidden_size,hidden_size],stddev=0.1),name='h_W')
Yes,这是正常的。创建变量时,必须在编译时知道该形状,因此如果该动态形状具有未知值(与您的一样),则不能使用另一个张量的动态形状作为新变量的形状。您必须事先知道
隐藏的\u大小
,这是您通常会做的,因为这是您的体系结构的设计选择。