张量视图

查看源文件

张量视图(Tensor Views)是指一个Tensor经过view类算子的返回值,与该Tensor共享内存数据,避免了数据复制,从而可以进行快速且内存高效的重塑、切片和逐元素操作。

例如,要获取Tensor t的视图,可以用t.view(…)。

from mindspore import Tensor
import numpy as np
t = Tensor(np.array([[1, 2, 3], [2, 3, 4]], dtype=np.float32))
b = t.view((3, 2))
# Modifying view Tensor changes base Tensor as well.
b[0][0] = 100
print(t[0][0])
# 100

由于视图与其原来的Tensor共享底层数据,因此如果在视图中修改数据,它也会反映在原来的Tensor中。

通常,MindSpore算子操作会返回一个新的Tensor作为输出,例如add()。 但在视图操作的情况下,输出是输入Tensor的视图,以避免不必要的数据复制。创建视图时不会发生数据移动,视图Tensor只是改变它解析相同数据的方式。 使用Tensor Views可能会使内存储存连续的Tensor产生内存存储非连续的Tensor。用户应格外注意,因为连续性可能会对性能产生隐式影响。transpose()是一个常见的例子。

from mindspore import Tensor
import numpy as np
base = Tensor([[0, 1], [2, 3]])
base.is_contiguous()
# True
t = base.transpose(1, 0) # t is a view of base. No data movement happened here.
t.is_contiguous()
# False
# To get a contiguous Tensor, call `.contiguous()` to enforce
# copying data when `t` is not contiguous.
c = t.contiguous()
c.is_contiguous()
# True

view类算子

作为参考,以下是MindSpore中支持view特性算子的完整列表:

broadcast_to()

diagonal()

expand_as()

movedim()

narrow()

permute()

squeeze()

transpose()

t()

T

unsqueeze()

view()

view_as()

unbind()

split()

hsplit()

vsplit()

tensor_split()

swapaxes()

swapdims()