探索PyTorch:张量的创建和数值盘算

[复制链接]
发表于 2026-2-6 11:05:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

目次
1. 张量的创建
1.1 张量的根本概念
1.2 张量的根本创建
1.3 创建线性和随机张量
1.4 创建全01张量
1.5 张量的范例转换
1.6 末节
2. 张量的数值盘算
2.1 张量根本运算
2.2 阿达玛积
2.3 点积运算
2.4 指定装备运算
2.5 末节

前言
PyTorch 是一个 Python 深度学习框架,学习PyTorch在当今深度学习范畴至关告急。PyTorch以其动态盘算图、易于利用的API和强大的社区支持,成为科研职员、数据科学家及工程师的首选框架。它不但简化了模子计划、训练与摆设流程,还极大地进步了实验服从和创新本领。把握PyTorch,可以或许加速科研进度,促进项目落地,是在AI期间保持竞争力的关键技能之一。满满的都是干货,盼望能资助到各人!
1. 张量的创建


1.1 张量的根本概念



  • PyTorch 是一个 Python 深度学习框架,它将数据封装成张量(Tensor)来举行运算。
  • PyTorch 中的张量就是元素为同一种数据范例的多维矩阵。
  • PyTorch 中,张量以 "类" 的情势封装起来,对张量的一些运算、处置惩罚的方法被封装在类中。


1.2 张量的根本创建



  • torch.tensor 根据指定命据创建张量
  • torch.Tensor 根据外形创建张量, 其也可用来创建指定命据的张量
  • torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定范例的张量

  
  1. import torch
  2. import numpy as np
  3. ​
  4. ​
  5. # 1. 根据已有的数据创建张量
  6. def test01():
  7. ​
  8.    # 1.1 创建标量
  9.    data = torch.tensor(10)
  10.    print(data)
  11. ​
  12.    # 1.2 使用numpy数组来创建张量
  13.    data = np.random.randn(2, 3)
  14.    data = torch.tensor(data)
  15.    print(data)
  16. ​
  17.    # 1.3 使用list列表创建张量
  18.    data = [[10., 20., 30.], [40., 50., 60.]]
  19.    data = torch.tensor(data)
  20.    print(data)
  21. ​
  22. ​
  23. # 2. 创建指定形状的张量
  24. def test02():
  25. ​
  26.    # 2.1 创建2行3列的张量
  27.    data = torch.Tensor(2, 3)
  28.    print(data)
  29. ​
  30.    # 2.2 可以创建指定值的张量
  31.    # 注意: 传递列表
  32.    data = torch.Tensor([2, 3])
  33.    print(data)
  34. ​
  35.    data = torch.Tensor([10])
  36.    print(data)
  37. ​
  38. ​
  39. # 3. 创建指定类型的张量
  40. def test03():
  41. ​
  42.    # 前面创建的张量都是使用默认类型或者元素类型
  43.    # 创建一个 int32 类型的张量
  44.    data = torch.IntTensor(2, 3)
  45.    print(data)
  46. ​
  47.    # torch.ShortTensor(2, 3)  # 表示创建的是 int16 张量
  48.    # torch.LongTensor(2, 3)  # 表示创建的是 int32 张量
  49.    # torch.FloatTensor(2, 3)  # 表示创建的是 float32 张量
  50. ​
  51. ​
  52.    # 注意: 如果创建指定类型的张量,但是传递的数据不匹配,会发生类型转换
  53.    data = torch.IntTensor([2.5, 3.5])
  54.    print(data)
  55. ​
  56. ​
  57. if __name__ == '__main__':
  58.    test03()
复制代码


1.3 创建线性和随机张量



  • torch.arange 和 torch.linspace 创建线性张量
  • torch.random.init_seed 和 torch.random.manual_seed 随机种子设置
  • torch.randn 创建随机张量

  
  1. import torch
  2. ​
  3. ​
  4. # 1. 创建线性张量
  5. def test01():
  6. ​
  7.    # 1.1 创建指定步长的张量
  8.    # 第一参数: 开始值
  9.    # 第二参数: 结束值
  10.    # 第三参数: 步长
  11.    data = torch.arange(0, 10, 2)
  12.    print(data)
  13. ​
  14.    # 1.2 在指定区间指定元素个数
  15.    # 第一个参数: 开始值
  16.    # 第二个参数: 结束值
  17.    # 第三个参数: 创建元素的个数
  18.    data = torch.linspace(0, 11, 10)
  19.    print(data)
  20.    
  21. ​
  22. # 2. 创建随机张量
  23. def test02():
  24. ​
  25.    # 固定随机数种子
  26.    torch.random.manual_seed(0)
  27.    
  28.    # 2.1 创建随机张量
  29.    data = torch.randn(2, 3)
  30.    print(data)
  31. ​
  32.    # 2.2 希望能够固定随机数
  33.    print('随机数种子:', torch.random.initial_seed())
  34. ​
  35. ​
  36. if __name__ == '__main__':
  37.    test02()
复制代码


1.4 创建全01张量



  • torch.ones 和 torch.ones_like 创建全1张量
  • torch.zeros 和 torch.zeros_like 创建全0张量
  • torch.full 和 torch.full_like 创建全为指定值张量

  
  1. import torch
  2. ​
  3. ​
  4. # 1. 创建全为0的张量
  5. def test01():
  6. ​
  7.    # 1.1 创建指定形状全为0的张量
  8.    data = torch.zeros(2, 3)
  9.    print(data)
  10. ​
  11.    # 1.2 根据其他张量的形状去创建全0张量
  12.    data = torch.zeros_like(data)
  13.    print(data)
  14. ​
  15. ​
  16. # 2. 创建全为1的张量
  17. def test02():
  18. ​
  19.    # 2.1 创建指定形状全为1的张量
  20.    data = torch.ones(2, 3)
  21.    print(data)
  22. ​
  23.    # 2.2 根据其他张量的形状去创建全1张量
  24.    data = torch.ones_like(data)
  25.    print(data)
  26. ​
  27. ​
  28. # 3. 创建全为指定值的张量
  29. def test03():
  30. ​
  31.    # 3.1 创建形状为2行3列,值全部为10的张量
  32.    data = torch.full([2, 3], 100)
  33.    print(data)
  34. ​
  35.    # 3.2 创建一个形状和data一样,但是值全部为200的张量
  36.    data = torch.full_like(data, 200)
  37.    print(data)
  38. ​
  39. ​
  40. if __name__ == '__main__':
  41.    test03()
复制代码


1.5 张量的范例转换


  • tensor.type(torch.DoubleTensor)
  • torch.double()

  
  1. import torch
  2. ​
  3. ​
  4. # 1. type 函数进行转换
  5. def test01():
  6. ​
  7.    data = torch.full([2, 3], 10)
  8.    print(data.dtype)
  9. ​
  10.    # 注意: 返回一个新的类型转换过的张量
  11.    data = data.type(torch.DoubleTensor)
  12.    print(data.dtype)
  13. ​
  14. ​
  15. # 2. 使用具体类型函数进行转换
  16. def test02():
  17. ​
  18.    data = torch.full([2, 3], 10)
  19.    print(data.dtype)
  20. ​
  21.    # 转换成 float64 类型
  22.    data = data.double()
  23.    print(data.dtype)
  24. ​
  25.    data = data.short()   # 将张量元素转换为 int16 类型
  26.    data = data.int()   # 将张量转换为 int32 类型
  27.    data = data.long()  # 将张量转换为 int64 类型
  28.    data = data.float()  # 将张量转换为 float32
  29. ​
  30. ​
  31. if __name__ == '__main__':
  32.    test02()
复制代码


1.6 末节


在本末节中,我们重要学习了以下内容:

  • 创建张量的方式

    • torch.tensor 根据指定命据创建张量
    • torch.Tensor 根据外形创建张量, 其也可用来创建指定命据的张量
    • torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定范例的张量

  • 创建线性和随机张量

    • torch.arange 和 torch.linspace 创建线性张量
    • torch.random.init_seed 和 torch.random.manual_seed 随机种子设置
    • torch.randn 创建随机张量

  • 创建01张量

    • torch.ones 和 torch.ones_like 创建全1张量
    • torch.zeros 和 torch.zeros_like 创建全0张量
    • torch.full 和 torch.full_like 创建全为指定值张量

  • 张量元素范例转换

    • tensor.type(torch.DoubleTensor)
    • torch.double()

2. 张量的数值盘算

2.1 张量根本运算


根本运算中,包罗 add、sub、mul、div、neg 等函数, 以及这些函数的带下划线的版本 add_、sub_、mul_、div_、neg_,此中带下划线的版本为修改原数据。

  
  1. import torch
  2. ​
  3. ​
  4. # 1. 不修改原数据的计算
  5. def test01():
  6. ​
  7.    # 第一个参数: 开始值
  8.    # 第二个参数: 结束值
  9.    # 第三个参数: 形状
  10.    data = torch.randint(0, 10, [2, 3])
  11.    print(data)
  12. ​
  13.    # 计算完成之后,会返回一个新的张量
  14.    data = data.add(10)
  15.    print(data)
  16. ​
  17.    # data.sub()  # 减法
  18.    # data.mul()  # 乘法
  19.    # data.div()  # 除法
  20.    # data.neg()  # 取相反数
  21. ​
  22. ​
  23. # 2. 修改原数据的计算(inplace方式的计算)
  24. def test02():
  25. ​
  26.    data = torch.randint(0, 10, [2, 3])
  27.    print(data)
  28. ​
  29.    # 带下划线的版本的函数直接修改原数据,不需要用新的变量保存
  30.    data.add_(10)
  31.    print(data)
  32. ​
  33.    # data.sub_()  # 减法
  34.    # data.mul_()  # 乘法
  35.    # data.div_()  # 除法
  36.    # data.neg_()  # 取相反数
  37. ​
  38. ​
  39. if __name__ == '__main__':
  40.    test02()
复制代码


2.2 阿达玛积


阿达玛积指的是矩阵对应位置的元素相乘. 可以利用乘号运算符、也可以利用 mul 函数来完成盘算。

  
  1. import torch
  2. ​
  3. ​
  4. # 1. 使用 mul 函数
  5. def test01():
  6. ​
  7.    data1 = torch.tensor([[1, 2], [3, 4]])
  8.    data2 = torch.tensor([[5, 6], [7, 8]])
  9. ​
  10.    data = data1.mul(data2)
  11.    print(data)
  12. ​
  13. ​
  14. # 2. 使用 * 号运算符
  15. def test02():
  16. ​
  17.    data1 = torch.tensor([[1, 2], [3, 4]])
  18.    data2 = torch.tensor([[5, 6], [7, 8]])
  19. ​
  20.    data = data1 * data2
  21.    print(data)
  22. ​
  23. ​
  24. if __name__ == '__main__':
  25.    test01()
  26.    test02()
复制代码

2.3 点积运算


点积运算要求第一个矩阵 shape: (n, m),第二个矩阵 shape: (m, p), 两个矩阵点积运算 shape 为: (n, p)。

  • 运算符 @ 用于举行两个矩阵的点乘运算
  • torch.mm 用于举行两个矩阵点乘运算, 要求输入的矩阵为2维
  • torch.bmm 用于批量举行矩阵点乘运算, 要求输入的矩阵为3维
  • torch.matmul 对举行点乘运算的两矩阵外形没有限定.

    • 对于输入都是二维的张量相当于 mm 运算.
    • 对于输入都是三维的张量相当于 bmm 运算
    • 对数输入的 shape 差别的张量, 对应的末了几个维度必须符合矩阵运算规则


  
  1. import torch
  2. ​
  3. ​
  4. # 1. 使用 @ 运算符
  5. def test01():
  6. ​
  7.    # 形状为: 3行2列
  8.    data1 = torch.tensor([[1, 2],
  9.                          [3, 4],
  10.                          [5, 6]])
  11.    # 形状为: 2行2列
  12.    data2 = torch.tensor([[5, 6],
  13.                          [7, 8]])
  14.    data = data1 @ data2
  15.    print(data)
  16. ​
  17. ​
  18. # 2. 使用 mm 函数
  19. def test02():
  20. ​
  21.    # 要求输入的张量形状都是二维
  22.    # 形状为: 3行2列
  23.    data1 = torch.tensor([[1, 2],
  24.                          [3, 4],
  25.                          [5, 6]])
  26.    # 形状为: 2行2列
  27.    data2 = torch.tensor([[5, 6],
  28.                          [7, 8]])
  29. ​
  30.    data = torch.mm(data1, data2)
  31.    print(data)
  32. ​
  33. ​
  34. # 3. 使用 bmm 函数
  35. def test03():
  36. ​
  37.    # 第一个维度: 表示批次
  38.    # 第二个维度: 多少行
  39.    # 第三个维度: 多少列
  40.    data1 = torch.randn(3, 4, 5)
  41.    data2 = torch.randn(3, 5, 8)
  42.    
  43.    data = torch.bmm(data1, data2)
  44.    print(data.shape)
  45. ​
  46. ​
  47. # 4. 使用 matmul 函数
  48. def test04():
  49. ​
  50.    # 对二维进行计算
  51.    data1 = torch.randn(4, 5)
  52.    data2 = torch.randn(5, 8)
  53.    print(torch.matmul(data1, data2).shape)
  54.    
  55.    # 对三维进行计算
  56.    data1 = torch.randn(3, 4, 5)
  57.    data2 = torch.randn(3, 5, 8)
  58.    print(torch.matmul(data1, data2).shape)
  59. ​
  60.    data1 = torch.randn(3, 4, 5)
  61.    data2 = torch.randn(5, 8)
  62.    print(torch.matmul(data1, data2).shape)
  63. ​
  64. ​
  65. if __name__ == '__main__':
  66.    test04()
复制代码



2.4 指定装备运算

PyTorch 默认会将张量创建在 CPU 控制的内存中, 即: 默认的运算装备为 CPU。我们也可以将张量创建在 GPU 上, 可以或许利用对于矩阵盘算的上风加速模子训练。将张量移动到 GPU 上有两种方法:

  • 利用 cuda 方法
  • 直接在 GPU 上创建张量
  • 利用 to 方法指定装备

  
  1. import torch
  2. ​
  3. ​
  4. # 1. 使用 cuda 方法
  5. def test01():
  6. ​
  7.    data = torch.tensor([10, 20, 30])
  8.    print('存储设备:', data.device)
  9. ​
  10.    # 将张量移动到 GPU 设备上
  11.    data = data.cuda()
  12.    print('存储设备:', data.device)
  13. ​
  14.    # 将张量从GPU再移动到CPU
  15.    data = data.cpu()
  16.    print('存储设备:', data.device)
  17. ​
  18. ​
  19. # 2. 直接将张量创建在指定设备上
  20. def test02():
  21. ​
  22.    data = torch.tensor([10, 20, 30], device='cuda:0')
  23.    print('存储设备:', data.device)
  24. ​
  25.    # 把张量移动到cpu设备上
  26.    data = data.cpu()
  27.    print('存储设备:', data.device)
  28. ​
  29. ​
  30. # 3. 使用 to 方法
  31. def test03():
  32. ​
  33.    data = torch.tensor([10, 20, 30])
  34.    print('存储设备:', data.device)
  35. ​
  36.    # 使用 to 方法移动张量到指定设备
  37.    data = data.to('cuda:0')
  38.    print('存储设备:', data.device)
  39. ​
  40. ​
  41. ​
  42. # 4. 注意: 存储在不同设备上的张量不能够直接运算
  43. def test04():
  44. ​
  45.    data1 = torch.tensor([10, 20, 30])
  46.    data2 = torch.tensor([10, 20, 30], device='cuda:0')
  47. ​
  48.    # RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
  49.    # 下面代码会报错
  50. ​
  51.    # 如果你的电脑上安装 pytorch 不是 gpu 版本的,或者电脑本身没有 gpu (nvidia)设备环境
  52.    # 否则下面的调用 cuda 函数的代码会报错
  53.    data1 = data1.cuda()
  54. ​
  55.    data = data1 + data2
  56.    print(data)
  57. ​
  58. ​
  59. if __name__ == '__main__':
  60.    test04()
复制代码


2.5 末节


在本末节中,我们重要学习的重要内容如下:

  • 张量根本运算函数 add、sub、mul、div、neg 等函数, add、sub、mul、div、neg_ 等 inplace 函数
  • 张量的阿达玛积运算 mul 和运算符 * 的用法
  • 点积运算:

    • 运算符 @ 用于举行两个矩阵的点乘运算
    • torch.mm 用于举行两个矩阵点乘运算, 要求输入的矩阵为2维
    • torch.bmm 用于批量举行矩阵点乘运算, 要求输入的矩阵为3维
    • torch.matmul 对举行点乘运算的两矩阵外形没有限定.

      • 对于输入都是二维的张量相当于 mm 运算.
      • 对于输入都是三维的张量相当于 bmm 运算
      • 对数输入的 shape 差别的张量, 对应的末了几个维度必须符合矩阵运算规则


  • 将变量移动到 GPU 装备的方法,比方: cuda 方法、直接在 GPU 上创建张量、利用 to 方法指定装备

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表