写点什么

Pytorch 基础 -tensor 数据结构

作者:叶致习
  • 2023-01-06
    广东
  • 本文字数:2518 字

    阅读完需:约 8 分钟

Pytorch基础-tensor数据结构

torch.Tensor

torch.Tensor 是一种包含单一数据类型元素的多维矩阵,类似于 numpy 的 array。可以使用使用 torch.tensor() 方法将 python 的 list 或序列数据转换成 Tensor 数据,生成的是dtype 默认是 torch.FloatTensor


注意 torch.tensor() 总是拷贝 data。如果你有一个 tensor data 并且仅仅想改变它的 requires_grad 属性,可用 requires_grad_() 或者 detach() 来避免拷贝。如果你有一个 numpy 数组并且想避免拷贝,请使用 torch.as_tensor()


1,指定数据类型的 tensor 可以通过传递参数 torch.dtype 和/或者 torch.device 到构造函数生成:


注意为了改变已有的 tensor 的 torch.device 和/或者 torch.dtype, 考虑使用 to() 方法.


>>> torch.ones([2,3], dtype=torch.float64, device="cuda:0")tensor([[1., 1., 1.],        [1., 1., 1.]], device='cuda:0', dtype=torch.float64)>>> torch.ones([2,3], dtype=torch.float32)tensor([[1., 1., 1.],        [1., 1., 1.]])
复制代码


2,Tensor 的内容可以通过 Python 索引或者切片访问以及修改:


>>> matrix = torch.tensor([[2,3,4],[5,6,7]])>>> print(matrix[1][2])tensor(7)>>> matrix[1][2] = 9>>> print(matrix)tensor([[2, 3, 4],        [5, 6, 9]])
复制代码


3,使用 torch.Tensor.item() 或者 int() 方法从只有一个值的 Tensor 中获取 Python Number:


>>> x = torch.tensor([[4.5]])>>> xtensor([[4.5000]])>>> x.item()4.5>>> int(x)4
复制代码


4,Tensor 可以通过参数 requires_grad=True 创建, 这样 torch.autograd 会记录相关的运算实现自动求导:


>>> x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)>>> out = x.pow(2).sum()>>> out.backward()>>> x.gradtensor([[ 2.0000, -2.0000], [ 2.0000,  2.0000]])
复制代码


5,每一个 tensor 都有一个相应的 torch.Storage 保存其数据。tensor 类提供了一个多维的、strided 视图, 并定义了数值操作。

Tensor 数据类型

Torch 定义了七种 CPU Tensor 类型和八种 GPU Tensor 类型:



torch.Tensor 是默认的 tensor 类型(torch.FloatTensor)的简称,即 32 位浮点数数据类型。

Tensor 的属性

Tensor 有很多属性,包括数据类型、Tensor 的维度、Tensor 的尺寸。


  • 数据类型:可通过改变 torch.tensor() 方法的 dtype 参数值,来设定不同的 Tensor 数据类型。

  • 维度:不同类型的数据可以用不同维度(dimension)的张量来表示。标量为 0 维张量,向量为 1 维张量,矩阵为 2 维张量。彩色图像有 rgb 三个通道,可以表示为 3 维张量。视频还有时间维,可以表示为 4 维张量,有几个中括号 [ 维度就是几。可使用 dim() 方法 获取 tensor 的维度

  • 尺寸:可以使用 shape属性或者 size()方法查看张量在每一维的长度,可以使用 view()方法或者reshape() 方法改变张量的尺寸。Pytorch 框架中四维张量形状的定义是 (N, C, H, W)


关于如何理解 Pytorch 的 Tensor Shape 可以参考 stackoverflow 上的这个 回答


样例代码如下:


matrix = torch.tensor([[[1,2,3,4],[5,6,7,8]],                       [[5,4,6,7], [5,6,8,9]]], dtype = torch.float64)print(matrix)               # 打印 tensorprint(matrix.dtype)     # 打印 tensor 数据类型print(matrix.dim())     # 打印 tensor 维度print(matrix.size())     # 打印 tensor 尺寸print(matrix.shape)    # 打印 tensor 尺寸matrix2 = matrix.view(4, 2, 2) # 改变 tensor 尺寸print(matrix2)
复制代码


程序输出结果如下:


view 和 reshape 的区别

  • 两个方法都是用来改变 tensor 的 shape,view() 只适合对满足连续性条件(contiguous)的 tensor 进行操作,而 reshape() 同时还可以对不满足连续性条件的 tensor 进行操作。

  • 在满足 tensor 连续性条件(contiguous)时,a.reshape() 返回的结果与 a.view() 相同,都不会开辟新内存空间;不满足 contiguous 时, 直接使用 view() 方法会失败,reshape() 依然有用,但是会重新开辟内存空间,不与之前的 tensor 共享内存,即返回的是 ”副本“(等价于先调用 contiguous() 方法再使用 view() 方法)。更多理解参考这篇文章

Tensor 与 ndarray

1,张量和 numpy 数组。可以用 .numpy() 方法从 Tensor 得到 numpy 数组,也可以用 torch.from_numpy 从 numpy 数组得到 Tensor。这两种方法关联的 Tensor 和 numpy 数组是共享数据内存的。可以用张量的 clone方法拷贝张量,中断这种关联。


arr = np.random.rand(4,5)print(type(arr))tensor1 = torch.from_numpy(arr)print(type(tensor1))arr1 = tensor1.numpy()print(type(arr1))"""<class 'numpy.ndarray'><class 'torch.Tensor'><class 'numpy.ndarray'>"""
复制代码


2,item() 方法和 tolist() 方法可以将张量转换成 Python 数值和数值列表。


# item方法和tolist方法可以将张量转换成Python数值和数值列表scalar = torch.tensor(5)  # 标量s = scalar.item()print(s)print(type(s))
tensor = torch.rand(3,2) # 矩阵t = tensor.tolist()print(t)print(type(t))"""1.0<class 'float'>[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]<class 'list'>"""
复制代码

创建 Tensor

创建 tensor ,可以传入数据或者维度,torch.tensor() 方法只能传入数据,torch.Tensor() 方法既可以传入数据也可以传维度,强烈建议 tensor() 传数据,Tensor() 传维度,否则易搞混。

传入维度的方法


样例代码:


>>> torch.rand([1,1,3,3])tensor([[[[0.3005, 0.6891, 0.4628],          [0.4808, 0.8968, 0.5237],          [0.4417, 0.2479, 0.0175]]]])>>> torch.normal(2, 3, size=(1, 4))tensor([[3.6851, 3.2853, 1.8538, 3.5181]])>>> torch.full([2, 2], 4)tensor([[4, 4],        [4, 4]])>>> torch.arange(0,10,2)tensor([0, 2, 4, 6, 8])>>> torch.eye(3,3)tensor([[1., 0., 0.],        [0., 1., 0.],        [0., 0., 1.]])
复制代码

参考资料


发布于: 刚刚阅读数: 6
用户头像

叶致习

关注

记录CV算法工程师成长之路,分享技术笔记。 2019-04-23 加入

大厂算法工程师,阿里云专家博主,从事视觉算法开发和模型压缩部署工作,终身学习践行者。想要了解更多干货和开源项目,欢迎关注我的公众号-嵌入式视觉。

评论

发布
暂无评论
Pytorch基础-tensor数据结构_Tensor_叶致习_InfoQ写作社区