将一个张量的一部分分配到另一个张量中的相应位置

Posted

技术标签:

【中文标题】将一个张量的一部分分配到另一个张量中的相应位置【英文标题】:Assign part of a tensor to the corresponding places in another tensor 【发布时间】:2022-01-20 19:47:19 【问题描述】:

我找不到如何用另一个张量数据替换部分张量数据。挖了一点之后,我看到很多报告说张量是不可分配的数据;建议了一些解决方法,例如 (https://github.com/tensorflow/tensorflow/issues/14132#issuecomment-483002522)。

让我举一个简单的例子来说明我在寻找什么。我有两批如下:


x=·tf.random.uniform((2,3,2))
y= tf.random.uniform((2,3,2))
print (x)
print ('===================')
print (y)

上面两批的输出如下:

<tf.Tensor: shape=(2, 3, 2), dtype=float32, numpy=
array([[[0.17130184, 0.5413419 ],
        [0.6435019 , 0.82179713],
        [0.79388785, 0.9519701 ]],

       [[0.46769345, 0.9812336 ],
        [0.5796915 , 0.29866755],
        [0.0442245 , 0.86057484]]], dtype=float32)>
===================
<tf.Tensor: shape=(2, 3, 2), dtype=float32, numpy=
array([[[0.82299507, 0.8277409 ],
        [0.24233484, 0.4353037 ],
        [0.23145556, 0.00768614]],

       [[0.83972216, 0.03451204],
        [0.46768224, 0.44939125],
        [0.7840742 , 0.99360645]]], dtype=float32)>

我想将 x 批次中每个数组的第一行替换为 y 批次中的对应数组。

我期待这样的结果:


<tf.Tensor: shape=(2, 3, 2), dtype=float32, numpy=
array([[[0.82299507, 0.8277409 ],  # copied from the y batch
        [0.6435019 , 0.82179713],
        [0.79388785, 0.9519701 ]], 

       [[0.83972216, 0.03451204],  # copied from the y batch
        [0.5796915 , 0.29866755],
        [0.0442245 , 0.86057484]]], dtype=float32)>

将批次转换为 NumPy 时以下工作(但这不是我想要的,我想直接使用张量)

x = x.numpy()
y = y.numpy()

x[:, 0:1 , : ] = y[:, 0:1 , :]
x

输出是 NumPy 数组,我可以再次将其转换为张量,但我想直接在张量上进行此类操作。

array([[[0.82299507, 0.8277409 ],
        [0.6435019 , 0.82179713],
        [0.79388785, 0.9519701 ]],

       [[0.83972216, 0.03451204],
        [0.5796915 , 0.29866755],
        [0.0442245 , 0.86057484]]], dtype=float32)

非常感谢任何帮助。

【问题讨论】:

github.com/tensorflow/tensorflow/issues/… 你可能会发现 lokk at assign tf 变量的方法很有用。 感谢您的帮助;但您的链接已包含在我原来的问题中。让我们等待可以在这方面提供帮助的人 【参考方案1】:

也许只使用tf.concat:

import tensorflow as tf
tf.random.set_seed(1)

x= tf.random.uniform((2,3,2))
y= tf.random.uniform((2,3,2))
print('X -->', x)
print('Y -->', y)
print('Z -->', tf.concat([y[:, 0:1 , :], x[:, 1: , : ]], axis=1))
X --> tf.Tensor(
[[[0.16513085 0.9014813 ]
  [0.6309742  0.4345461 ]
  [0.29193902 0.64250207]]

 [[0.9757855  0.43509948]
  [0.6601019  0.60489583]
  [0.6366315  0.6144488 ]]], shape=(2, 3, 2), dtype=float32)
Y --> tf.Tensor(
[[[0.51010704 0.44353175]
  [0.4085331  0.9924923 ]
  [0.68866396 0.34584963]]

 [[0.436067   0.601061  ]
  [0.45662427 0.75269794]
  [0.18799722 0.54875696]]], shape=(2, 3, 2), dtype=float32)
Z --> tf.Tensor(
[[[0.51010704 0.44353175]
  [0.6309742  0.4345461 ]
  [0.29193902 0.64250207]]

 [[0.436067   0.601061  ]
  [0.6601019  0.60489583]
  [0.6366315  0.6144488 ]]], shape=(2, 3, 2), dtype=float32)

【讨论】:

非常感谢;您的解决方案适用于我的情况。重新分配张量的最佳解决方法(将张量嵌入另一个张量)。 如果您不介意,如何从批次 y 的左上角更新批次 x 的左上角。如果可能,请将其添加到您的答案中以获得更全面的解决方案。

以上是关于将一个张量的一部分分配到另一个张量中的相应位置的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:“张量”对象在注意力模型中没有“分配”属性

如何有效地分配给 TensorFlow 中的张量切片

如何将张量逐行乘以 PyTorch 中的向量?

张量流中的最小 RNN 示例

当切片本身是张量流中的张量时如何进行切片分配

Pytorch中的tensor常用操作