Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow tf.zeros()的动态大小(用于无维度的占位符)_Tensorflow - Fatal编程技术网

Tensorflow tf.zeros()的动态大小(用于无维度的占位符)

Tensorflow tf.zeros()的动态大小(用于无维度的占位符),tensorflow,Tensorflow,考虑以下代码: x=tf.placeholder(“float”,shape=[42,4]) y=tf.零([42,4],“浮动”) xy_堆叠=tf.concat(1,[x,y]) 打印(x.get_shape()) 打印(y.get_shape()) 打印(xy_堆叠。获取_形状()) 这将产生预期的以下输出: TensorShape([尺寸(42),尺寸(4)]) 张量形状([尺寸(42),尺寸(4)]) 张量形状([尺寸(42),尺寸(8)]) 但是,如果占位符有一个动态维度,该维度

考虑以下代码:

x=tf.placeholder(“float”,shape=[42,4])
y=tf.零([42,4],“浮动”)
xy_堆叠=tf.concat(1,[x,y])
打印(x.get_shape())
打印(y.get_shape())
打印(xy_堆叠。获取_形状())
这将产生预期的以下输出:

TensorShape([尺寸(42),尺寸(4)])
张量形状([尺寸(42),尺寸(4)])
张量形状([尺寸(42),尺寸(8)])
但是,如果占位符有一个动态维度,该维度在运行时由传递给
feed\u dict=
的值确定,那么该怎么办

x=tf.placeholder(“float”,shape=[None,4])
y=tf.零([None,4],“float”)
xy_堆叠=tf.concat(1,[x,y])
这将为
tf.zero([None,4],“float”)
产生错误。显然
维度(无)
不允许用于
tf.zero

TypeError回溯(最近一次调用)
在()
2.
3 x=tf.占位符(“float”,shape=[None,4])
---->4 y=tf.零([None,4],“float”)
5 xy_堆叠=tf.concat(1,[x,y])
6.
[...]
/usr/local/lib/python3.4/dist-packages/numpy/core//u methods.py in\u prod(a、axis、dtype、out、keepdims)
33
34 def_prod(a,axis=None,dtype=None,out=None,keepdims=False):
--->35返回umr_产品(a、轴、数据类型、输出、保持)
36
37 def_any(a,axis=None,dtype=None,out=None,keepdims=False):
TypeError:不支持*:“NoneType”和“int”的操作数类型
我发现,如果我将零张量的第一个维度设置为非无,则不会产生错误,例如1:

x=tf.placeholder(“float”,shape=[None,4])
y=tf.零([1,4],“浮动”)
xy_堆叠=tf.concat(1,[x,y])
但随后,生成的
xy\u叠加
张量被截断为以下大小:

TensorShape([尺寸(无),尺寸(4)])
张量形状([尺寸(1),尺寸(4)])
张量形状([尺寸(1),尺寸(8)])
在本例中,如何用零填充占位符张量,以获得形状为
TensorShape([Dimension(None),Dimension(8)])
的张量

到目前为止,我发现的唯一“解决方案”如下所示:

x=tf.placeholder(“float”,shape=[None,4])
y=0*x
xy_堆叠=tf.concat(1,[x,y])
或者简单地将
y
声明为占位符,并始终传递正确大小的零数组

但这两种方法看起来都不是解决问题的干净方法,在比这个简单示例更复杂的应用程序中,这样的黑客行为很快就会失控


我使用的是
tensorflow-0.6.0-py3

制作与另一个张量形状相同的零张量的推荐方法是使用op:

x=tf.placeholder(tf.float32,shape=[None,4])
y=tf.类零(x)
结果张量
y
的形状似乎是
[None,None]
,根据,但在运行时,它将扩展为与
x
相同的形状:

打印y.获取形状()
#==>TensorShape([尺寸(无),尺寸(无)])
sess=tf.Session()
y_result=sess.run(y,feed_dict={x:np.random.rand(4,4)})
打印y_result.shape
# ==> (4, 4)
返回
[None,None]
静态形状,因为形状推断尚未专门用于
tf.zeros\u like()
。我已经提交了一份申请,应该很快就能解决


编辑:在您的评论中,您询问如何处理零张量的形状基于原始张量,但与原始张量不同的情况。这也是可能的,使用和来建立尺寸,并产生零张量:

x = tf.placeholder(tf.float32, shape=[None, 4])

# Use tf.shape() to get the runtime size of `x` in the 0th dimension.
zeros_dims = tf.stack([tf.shape(x)[0], 7])

y = tf.fill(zeros_dims, 0.0)

sess = tf.Session()
y_result = sess.run(y, feed_dict={x: np.random.rand(4, 4)})
print y_result.shape
# ==> (4, 7)

像(x)那样的
y=tf.zero会发生什么?@user728291然后我得到了一些形状
TensorShape([Dimension(None),Dimension(None)])
y
xy\u堆叠的
!?如果
x
实际上应该具有与
y
相同的形状,那么我在问题中提到的
0*x
黑客似乎更有意义。在我真正的应用程序中,一切当然都更复杂,我必须通过切片、复制和连接
0*
的结果来构造零张量,以获得我需要的形状张量。如果第二维度不匹配,我该怎么办?例如,我希望
x
具有
shape=[None,4]
y
具有
shape=[None,7]
。(在我的应用程序中,这些张量的第二维度是独立的配置参数。我甚至无法提前知道哪个张量更大。)很抱歉在问题中没有提到这一点。更新了我的答案以涵盖您的情况。请注意,在tf 1.x+tf.pack上,已重命名为tf.stack