我有一个张量,它只是一个矢量,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实现这一目标?
答案 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 matrix
与vec
相乘并让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}}的尺寸与j
(b
的第二个尺寸)匹配。
另一个示例用例:
每个神经元都有一个状态,并且由于我们分批进行仿真,因此该状态具有维度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)>