使用 TensorFlow 反转张量内的两个元素块
Reverse two block of elements inside a tensor using TensorFlow
假设我有一个大小为 [batch, D] 的二阶张量(矩阵),我想用 D-d 列元素交换前 d 列元素的位置。我怎样才能在 TensorFlow 中有效地做到这一点?
示例:一个大小为 [4,4] 的矩阵,我想将第一个 d=2 列元素的位置与左侧的列块交换。
输入:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
输出:
3 4 1 2
3 4 1 2
3 4 1 2
3 4 1 2
谢谢。
假设你的矩阵是 A
那么 tf.concat((A[:,d:], A[:,:d]), axis=1)
应该会给你你想要的。我不知道有什么直接的方法可以提高它的效率,但我不会担心它,除非它是你模型中的瓶颈。
更新: 如果 d << D
并且您只需要执行一次操作,那么由于减少了复制开销,以下操作可能会更快(但也会使用更多内存)
# allocate D + d columns
A = tf.Variable(tf.zeros((batch, D + d)))
# set A[:,:D] to initial value
# copy first d columns to the the last d columns
A = A[:,-d:].assign(A[:,:d])
# use slicing to ignore the first d columns
A = A[:,d:]
假设我有一个大小为 [batch, D] 的二阶张量(矩阵),我想用 D-d 列元素交换前 d 列元素的位置。我怎样才能在 TensorFlow 中有效地做到这一点? 示例:一个大小为 [4,4] 的矩阵,我想将第一个 d=2 列元素的位置与左侧的列块交换。
输入:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
输出:
3 4 1 2
3 4 1 2
3 4 1 2
3 4 1 2
谢谢。
假设你的矩阵是 A
那么 tf.concat((A[:,d:], A[:,:d]), axis=1)
应该会给你你想要的。我不知道有什么直接的方法可以提高它的效率,但我不会担心它,除非它是你模型中的瓶颈。
更新: 如果 d << D
并且您只需要执行一次操作,那么由于减少了复制开销,以下操作可能会更快(但也会使用更多内存)
# allocate D + d columns
A = tf.Variable(tf.zeros((batch, D + d)))
# set A[:,:D] to initial value
# copy first d columns to the the last d columns
A = A[:,-d:].assign(A[:,:d])
# use slicing to ignore the first d columns
A = A[:,d:]