Pytorch学习笔记---3:张量存储视图

    了解张量的底层实现对张量的学习有很大的帮助。张量中的值被分配到由torch.Storage实例所管理的连续内存块中。存储区是由数字数据组成的一维数组,即包括给定类型的数字的连续内存块,例如float(代表32位浮点数)或int64(代表64位整数)。一个Pytorch的Tensor实例就是这样一个Storage实例的视图,该实例能够使用偏移量和每个维度的步长对该存储区进行索引。

    注意:多个张量可以索引同一存储区,即使它们索引到的数据不同。

Pytorch学习笔记---3:张量存储视图_第1张图片

    我们使用不同的索引方式索引同一块存储区,得到不同的张量。底层内存只分配一次,因此可以快速创建数据的备用张量视图,而不管Storage实例管理的数据的大小。

①索引存储区:使用storage()访问给定张量的存储区:

points = torch.tensor([[4.0, 1.0], [5.0, 3.0], [2.0, 1.0]])
print(points.storage())
 4.0
 1.0
 5.0
 3.0
 2.0
 1.0
[torch.storage._TypedStorage(dtype=torch.float32, device=cpu) of size 6]

    尽管张量显示自己有3行2列,但底层的存储区是一个大小为6的连续数组。从这个意义上说,张量只知道如何将一对索引转换成存储区中的一个位置。

    我们还可以手动索引存储区,如:

points_storage = points.storage()
print(points_storage[0])
print(points.storage()[1])
4.0
1.0

    我们不能用2个索引来索引二维张量的存储区。不管和存储区关联的任何其他张量的维度是多少,它的布局始终是一维的。

    因此改变一个存储区的值导致与其关联的张量的内容发生变化就不足为怪了。

②修改存储值:就地操作

    除了前面介绍的对张量的操作,还有少量操作仅作为Tensor对象的方法存在。这些操作可以以名称结尾的下划线识别出来,如zero_(),这表明该方法通过修改输入张量,而不是创建一个新的输出张量,然后返回新创建的输出张量。

注意:任何不带下划线的方法都不会改变源张量,而是返回一个新的张量!

tensor = torch.ones(3, 2)
print(tensor)
tensor.zero_()
print(tensor)
tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
tensor([[0., 0.],
        [0., 0.],
        [0., 0.]])

你可能感兴趣的:(Deep,Learning,pytorch,学习,python)