Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 使用tf.tile复制行张量?_Tensorflow - Fatal编程技术网

Tensorflow 使用tf.tile复制行张量?

Tensorflow 使用tf.tile复制行张量?,tensorflow,Tensorflow,我有一个张量,它只是一个向量,vector=[0.50.4]和tf.shape表示它有shape=(1),我想复制向量m次,形状为[m,2],因此对于m=2,矩阵=[0.50.4],[0.50.4]。如何使用tf.tile实现这一点?采用以下公式,vec是一个向量,multiply是你的m,重复向量的次数tf.tile在向量上执行,然后使用tf.reformate将其重塑为所需的结构 import tensorflow as tf vec = tf.constant([1, 2, 3, 4])

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

采用以下公式,
vec
是一个向量,
multiply
是你的m,重复向量的次数
tf.tile
在向量上执行,然后使用
tf.reformate
将其重塑为所需的结构

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)]

通过将
one矩阵
vec
相乘,并让
广播
执行以下操作,可以实现同样的效果:

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


复制/复制张量(可以是一维向量、二维矩阵或任何维度)可以通过创建该张量的副本列表(使用纯python)来完成,然后使用tf.stack,将两个步骤放在一行(短)中。 下面是复制二维张量的示例:

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)。 然后在第一个轴(轴=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))

我假设这种复制的主要用例是匹配两个张量的维数(你想乘吗?)

在这种情况下,有一个更简单的解决方案。让
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)
正如您所见,它适用于更复杂的情况:当您需要在第一个维度和最后一个维度上进行复制时,当您使用更复杂的形状时,等等。您所需要做的就是匹配字符串描述中的索引(上面我们将标有
j
a
维度与
b
的第二维度(
ijk
)相匹配

另一个示例用例: 我每个神经元都有一个状态,因为我们分批模拟,这个状态有维度
(n\u batch,n\u neuron)
。我需要用这个状态来调节神经元之间的连接(突触的重量),在我的例子中,它有额外的维度,所以它们有维度
(n\u neuron,n\u neuron,n\u X)

我可以这样写在一行中,而不是把平铺、重塑等弄得一团糟:

W_modulated = tf.einsum('ijk,bi->bijk', self.W, ux)

没有重塑的答案:

vec = tf.constant([[1, 2, 3, 4]])
multiply = tf.constant([3, 1])
tf.tile(vec, multiply)
Tensorflow 2.0解决方案: 请参阅此链接以了解更多信息

vector=[0.5,0.4]
重塑(tf.tile(向量,[2]),[2,tf.shape(向量)[0]]
#输出

为什么numpy.tile不等于tf.tile?
tf.tile
np.tile
不同,使用tile和重塑很容易出错,最好使用显式选项,如
tf.stack
matmul
vec = tf.constant([[1, 2, 3, 4]])
multiply = tf.constant([3, 1])
tf.tile(vec, multiply)
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)>