笔记 | PyTorch张量Tensor的一些必备操作

小白学视觉

共 5234字,需浏览 11分钟

 ·

2021-09-14 15:34

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

张量是什么?

  • 标量:0维张量;比如一个单独的数字1

  • 向量:1维张量;比如一组排列好的数:1,2,3,4,5,6

  • 矩阵:2为张量;比如一个灰度图矩阵

  • 3维张量;比如一个彩色图RGB

  • n维张量

张量是一个多维数组,它是标量、向量、矩阵的高维扩展


Variable是PyTorch0.4.0之前的内容,现在并入Tensor了!

Variable是torch.autograd中的数据类型,后来并入了Tensor,主要目的是为了封装求导

五个属性:

  • data:被包装的Tensor

  • grad:data的梯度

  • grad_fn:创建Tensor的Func,记录比如操作加法还是乘法

  • requires_grad:是否需要求梯度

  • is_leaf:是否是叶子结点(张量)

后来Variable就并入了Tensor中

现在是8个属性:

  • dtype:张量的数据类型,如torch.FloatTensor,torch.cuda.FloatTensor

  • shape:张量的形状

  • device:张量所在的设备,GPU还是CPU


那么张量有哪些必备的创建方法值得学习?


这些代码王博Kings都一个一个敲打注释的,可以直接运行


import numpy as np
import torch


通过torch.tensor创建张量

    arr = np.ones((3,3))    print("由np.ones生成的数据:\n",arr)    print("ndarray的数据类型:",arr.dtype,"\n")
#t = torch.tensor(arr, device='cuda') t = torch.tensor(arr)
print("torch.tensor创建好的Tensor:\n",t)


输出结果:

由np.ones生成的数据: [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]ndarray的数据类型:float64 
torch.tensor创建好的Tensor: tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=torch.float64)
Process finished with exit code 0


通过torch.from_numpy创建张量

    arr = np.array([[1,2,3],[4,5,6]])    print("由np.array生成的数据:\n",arr)    t = torch.from_numpy(arr)    print("torch.from_numpy创建好的Tensor:\n",t)
# 由from_numpy创建的Tensor是共享内存空间 # 修改numpy中的一个数字,看看tensor有没有变化 print("\n=======================\n修改arr") arr[0,0]=9 print("由np.array生成的数据:\n",arr) t = torch.from_numpy(arr) print("torch.from_numpy创建好的Tensor:\n",t)
# 由from_numpy创建的Tensor是共享内存空间 # 修改tensor中的一个数字,看看numpy有没有变化 print("\n=======================\n修改t") t[0,0]=-9 print("由np.array生成的数据:\n",arr) t = torch.from_numpy(arr) print("torch.from_numpy创建好的Tensor:\n",t)

运行结果

由np.array生成的数据: [[1 2 3] [4 5 6]]torch.from_numpy创建好的Tensor: tensor([[1, 2, 3],        [4, 5, 6]], dtype=torch.int32)
=======================修改arr由np.array生成的数据: [[9 2 3] [4 5 6]]torch.from_numpy创建好的Tensor: tensor([[9, 2, 3], [4, 5, 6]], dtype=torch.int32)
=======================修改t由np.array生成的数据: [[-9 2 3] [ 4 5 6]]torch.from_numpy创建好的Tensor: tensor([[-9, 2, 3], [ 4, 5, 6]], dtype=torch.int32)
Process finished with exit code 0


通过torch.zeros创建张量

    out_t = torch.tensor(([1]))
t = torch.zeros((3,3), out=out_t)
print("t的值:\n",t,"\n out_t的值\n",out_t) print("看一下t和out_t的id位置号\n",id(t),"\n",id(out_t))


输出结果

t的值: tensor([[0, 0, 0],        [0, 0, 0],        [0, 0, 0]])  out_t的值 tensor([[0, 0, 0],        [0, 0, 0],        [0, 0, 0]])看一下t和out_t的id位置号 1819528746952  1819528746952
Process finished with exit code 0


通过torch.full创建全相同的张量

    t = torch.full((3,3),10)    print("torch.full((3,3),10)的输出结果\n",t)

输出结果

torch.full((3,3),10)的输出结果 tensor([[10., 10., 10.],        [10., 10., 10.],        [10., 10., 10.]])


通过torch.arange创建等差数列张量

    t = torch.arange(2,10,2)    print("torch.arange(2,10,2)的输出结果\n",t)

输出结果

torch.arange(2,10,2)的输出结果 tensor([2, 4, 6, 8])


通过torch.linspace创建均分数列 张量

步长=(Start - end)/(Steps - 1)

    t = torch.linspace(2,10,5)    print("torch.linspace(2,10,5)的输出结果\n",t)    t = torch.linspace(2,10,6)    print("torch.linspace(2,10,6)的输出结果\n",t)

输出结果

torch.linspace(2,10,5)的输出结果 tensor([ 2.,  4.,  6.,  8., 10.])torch.linspace(2,10,6)的输出结果 tensor([ 2.0000,  3.6000,  5.2000,  6.8000,  8.4000, 10.0000])


通过torch.eye创建单位对角矩阵

    t = torch.eye(3)    print("torch.eye(3)的输出结果\n",t)

输出结果

torch.eye(3)的输出结果 tensor([[1., 0., 0.],        [0., 1., 0.],        [0., 0., 1.]])


通过torch.normal()创建概率分布的张量

    # mean:张量 std: 张量    print("-----------mean:张量 std: 张量---------")    mean = torch.arange(1, 5, dtype=torch.float)    std = torch.arange(1, 5, dtype=torch.float)    print("mean是:",mean,"\n std是:",std)    t_normal = torch.normal(mean, std)    print("t_normal是\n",t_normal)
# mean:标量 std: 标量 print("-----------mean:标量 std: 标量---------") t_normal = torch.normal(0., 1., size=(5,)) print("torch.normal(0., 1., size=5,))输出\n",t_normal)
# mean:张量 std: 标量 print("-----------mean:张量 std: 标量---------") mean = torch.arange(1, 5, dtype=torch.float) std = 1 print("mean是:",mean,"\n std是:",std) t_normal = torch.normal(mean, std) print("t_normal是\n",t_normal)

输出结果:

-----------mean:张量 std: 张量---------mean是:tensor([1., 2., 3., 4.])  std是:tensor([1., 2., 3., 4.])t_normal是 tensor([ 1.0527,  2.8746,  5.1393, -2.5108])-----------mean:标量 std: 标量---------torch.normal(0., 1., size=5,))输出 tensor([-0.7771, -0.7684,  0.8846,  0.5542,  1.3451])-----------mean:张量 std: 标量---------mean是:tensor([1., 2., 3., 4.])  std是:1t_normal是 tensor([0.5560, 1.9777, 2.9634, 2.7911])
Process finished with exit code 0


好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报