我有一个矩阵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
而不是显式数字)
有没有更好的方法来做我想做的事情?
答案 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)