我正在处理一个矩阵sim_mat,它是一个大小的张量(?,?,?)。
我想像这样在上面使用tf.slice:
a=tf.slice(sim_matrix,[0,0,0],tf.stack([tf.shape(sim_matrix[0],tf.shape(sim_matrix)[1],3]))
print(a)
但这给了我张量a的大小(?,?,?)而不是(?,?)此外,当我使用a作为进一步的函数时,我得到了一条错误消息:
输入的大小(输入的深度)必须可以通过形状推断访问,但是没有看到值。
有解决办法吗?
谢谢。
发布于 2018-04-16 05:16:09
您可以使用花哨的索引编写以下等价但更易读的行:
a = sim_matrix[ :, :, 0 : 3 ]
然而,这仍然会给出形状的张量( ?,?,?)。
如果您确实需要修正由此产生的张量的第三维空间,请使用tf.gather()
。但是,您必须使用tf.transpose()
在前后更改维度,因为tf.gather()
只在第一个维度上工作。(这里也有tf.gather_nd()
,但这没有帮助,因为您不想在前两个dims上指定索引,而是想取切片。)如下所示(测试代码):
import tensorflow as tf
sim_matrix = tf.placeholder( shape=(None,None,None), dtype = tf.float32 )
sim_matrixT = tf.transpose( sim_matrix, [ 2, 0, 1 ] )
aT = tf.gather( sim_matrixT, [ 0, 1, 2 ] ) # get first three
a = tf.transpose( aT, [ 1, 2, 0 ] )
print( a.get_shape() )
输出:
(?,?,3)
您还会说在进一步的函数上出现了一个错误。如果这些函数需要在它们的输入张量上固定形状,情况可能仍然是这样。
https://stackoverflow.com/questions/49858041
复制相似问题