tensorflow张量操作 - 使用维对象平铺不起作用?

时间:2017-06-15 19:11:19

标签: tensorflow

我有一个矩阵M:

[[101,  51, 12],
 [101,  19, 18]]

长话短说,我需要使用tensorflow语法创建以下内容:

[[0, 0, 101],
 [0, 1, 51],
 [0, 2, 12],
 [1, 0, 101],
 [1, 1, 19],
 [1, 2, 18]]

我的方法是创建3个单独的向量并将它们连接起来以产生上述内容:

v1 = [0, 0, 0, 1, 1, 1]

v2 = [0, 1, 2, 0, 1, 2]

and

M_flat = [101, 51, 12, 101, 19, 18]

我可以使用M_flat = [101, 51, 12, 101, 19, 18]

获取tf.reshape(M, shape=(-1,))

我事先不知道M的维度,所以我使用以下语法来获取它:

dim0 = M.get_shape()[0]
dim1 = M.get_shape()[1]

从此我可以通过

获得[0, 1, 2]
tf.range(dim1)

要获得[0, 1, 2, 0, 1, 2]我尝试平铺:

tf.tile(tf.range(dim1), [dim0])

但是,这不起作用,因为dim0是一个维度对象,tile想要一个整数,所以我得到错误Expected binary or unicode string, got Dimension(100)

此外,我不确定tile是否可用于生成此[0, 0, 0, 1, 1, 1](可能会进行一些重构,转置和平铺,同样假设这些操作可以在{{1}之后运行}和dim0而不是显式数字)

有没有更好的方法来做我想做的事情?

1 个答案:

答案 0 :(得分:2)

根据错误,您只需通过value之类的内容访问Dimension对象的M.get_shape[0].value

对于[0, 0, 0, 1, 1, 1]所关注的问题,您可以使用tf.tile完成的工作非常类似(只需在另一个轴上滚动)。

您可以按如下方式获得结果(写得非常快但应该完成工作):

M = tf.convert_to_tensor([[101, 51, 12], [101, 19, 18]])
dim0 = M.get_shape()[0].value
dim1 = M.get_shape()[1].value
r0 = tf.range(dim0)
r0x = tf.expand_dims(r0,1)
A = tf.reshape(tf.tile(r0x, [1, dim1]), [-1, 1])  # A = [[0],[0],[0],[1],[1],[1]]
r1 = tf.range(dim1)
r1x = tf.expand_dims(r1,1)
B = tf.reshape(tf.tile(r1x, [dim0, 1]), [-1, 1])  # B = [[0],[1],[2],[0],[1],[2]]
M = tf.reshape(M, [-1, 1])
res = tf.concat((A, B, M), axis=1)