使用tf.tile复制行张量?

时间:2017-07-26 00:33:30

标签: tensorflow

我有一个张量,它只是一个矢量,vector = [0.5 0.4]和tf.shape表示它有shape =(1,),我想复制矢量m次,形状为[m, 2],因此对于m = 2,matrix = [[0.5 0.4], [0.5 0.4]]。我如何使用tf.tile实现这一目标?

6 个答案:

答案 0 :(得分:13)

采取以下措施,vec是一个向量,multiply是你的m,重复向量的次数。 tf.tile在向量上执行,然后使用tf.reshape将其重新整形为所需的结构。

import tensorflow as tf

vec = tf.constant([1, 2, 3, 4])
multiply = tf.constant([3])

matrix = tf.reshape(tf.tile(vec, multiply), [ multiply[0], tf.shape(vec)[0]])
with tf.Session() as sess:
    print(sess.run([matrix]))

这导致:

[array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]], dtype=int32)]

答案 1 :(得分:9)

通过将ones matrixvec相乘并让broadcasting执行此操作,可以实现同样的效果:

  

tf.ones([m,1])* vec

vec = tf.constant([1., 2., 3., 4.])
m = 3
matrix = tf.ones([m, 1]) * vec

with tf.Session() as sess:
   print(sess.run([matrix]))

#Output: [[1., 2., 3., 4.],
#         [1., 2., 3., 4.],
#         [1., 2., 3., 4.]]

答案 2 :(得分:4)

复制/复制张量(是一维矢量,2D矩阵或任何维数)可以通过创建此张量的副本列表(使用纯python),然后使用tf.stack-具有两个步骤来完成一(短)行。 这是复制2D张量的示例:

import tensorflow as tf
tf.enable_eager_execution()

a = tf.constant([[1,2,3],[4,5,6]])  # shape=(2,3)
a_stack = tf.stack([a] * 4)  # shape=(4,2,3)

print(a)
print(a_stack)

“ [a] * 4”创建一个包含相同张量的四个副本的列表(这是纯python)。 tf.stack然后在第一个轴(axis = 0)上一个接一个地堆叠它们

在图形模式下:

import tensorflow as tf

a = tf.constant([[1,2,3],[4,5,6]])  # shape=(2,3)
a_stack = tf.stack([a] * 4)  # shape=(4,2,3)

sess = tf.Session()
print('original tensor:')
print(sess.run(a))
print('stacked tensor:')
print(sess.run(a_stack))

答案 3 :(得分:0)

我认为这种复制的主要用例是匹配两个张量的维数(要相乘吗?)。

在这种情况下,有一个更简单的解决方案。让tensorflow为您完成维数匹配的工作:

import tensorflow as tf
tf.enable_eager_execution()

a = tf.constant([1, 2, 3])  # shape=(3)
b = tf.constant([[[1, 3], [1, 3], [1, 3]], [[2, 0], [2, 0], [2, 0]]])  # shape=(2, 3, 2)

print(tf.einsum('ijk,j->ijk', b, a))

# OUTPUT:
# tf.Tensor(
# [[[1 3]
#   [2 6]
#   [3 9]]
# 
#  [[2 0]
#   [4 0]
#   [6 0]]], shape=(2, 3, 2), dtype=int32)

如您所见,它可以在更复杂的情况下工作:当您需要在第一个和最后一个维度上复制时,当您使用更复杂的形状时,等等。您需要做的就是匹配字符串描述(在上面,我们将标记为a的{​​{1}}的尺寸与jb的第二个尺寸)匹配。

另一个示例用例: 每个神经元都有一个状态,并且由于我们分批进行仿真,因此该状态具有维度ijk。我需要使用此状态来调节神经元之间的连接(突触的权重),在我的情况下,神经元具有附加的维数,因此它们具有维数(n_batch, n_neuron)

我不会像平铺,重塑等那样使人一团糟。我可以像这样单行编写它:

(n_neuron, n_neuron, n_X)

答案 4 :(得分:0)

无需重塑的答案:

vec = tf.constant([[1, 2, 3, 4]])
multiply = tf.constant([3, 1])
tf.tile(vec, multiply)

答案 5 :(得分:0)

Tensorflow 2.0解决方案: 请参考此链接以了解有关tf.tile

的更多信息
vector = [0.5, 0.4]
tf.reshape(tf.tile(vector, [2]), [2, tf.shape(vector)[0]])

# output 
<tf.Tensor: id=59, shape=(2, 2), dtype=float32, numpy=
array([[0.5, 0.4],
       [0.5, 0.4]], dtype=float32)>