PyTorch中的Tensor

发布于:2025-03-27 ⋅ 阅读:(29) ⋅ 点赞:(0)

        PyTorch中的Tensor‌ 是核心数据结构,类似于 NumPy 的多维数组,但具备 GPU 加速和自动求导等深度学习特性。

一、基本概念

  1. 核心数据结构

    • Tensor 是存储和操作数据的基础单元,支持标量(0D)、向量(1D)、矩阵(2D)及更高维数组‌。
    • 与 NumPy 的 ndarray 类似,但支持动态计算图和自动梯度计算‌。
  2. 关键特性

    • GPU 加速‌:可存储在 CPU 或 GPU 中,GPU 计算显著提升性能‌。
    • 自动求导‌:通过 requires_grad=True 启用梯度计算,支持反向传播‌。

二、创建方式

  1. 直接创建

    • 从 Python 列表或元组初始化:
      a = torch.tensor([1, 2, 3])          # 1D Tensor(向量)
      b = torch.tensor([[1.0, 2.0], [3.0, 4.0]])  # 2D Tensor(矩阵)‌
      
    • 指定数据类型(如 dtype=torch.float32)和设备(如 device='cuda')‌。
  2. 初始化方法

    • 全零/全一张量:
      zeros_tensor = torch.zeros((2, 3))   # 2x3 全零张量
      ones_tensor = torch.ones((2, 3))     # 2x3 全一张量‌
      
    • 随机张量:
      rand_tensor = torch.rand((2, 3))     # 值在 [0,1) 的均匀分布‌
  3. 从其他数据结构转换

    • 从 NumPy 数组转换:

       使用 torch.from_numpy(),Tensor 与 NumPy 数组共享内存(修改一方会影响另一方)

      numpy_arr = np.array([1, 2, 3])
      tensor = torch.from_numpy(numpy_arr)  # 共享内存‌

      使用 torch.tensor() 复制数据,生成独立 Tensor:

      tensor = torch.tensor(numpy_arr)  # 不共享内存‌
    • 从图片转换:
      使用 torchvision.transforms
      将 NumPy 格式的图片(HWC 格式,值域 [0, 255])转换为 Tensor(CHW 格式,值域 [0.0, 1.0]):
      from PIL import Image
      from torchvision import transforms
      
      img = Image.open("image.jpg")  # PIL.Image 对象 (H,W,C)
      tensor_trans = transforms.ToTensor()
      tensor_img = tensor_trans(img)  # 转为 Tensor (C, H, W)
      

三、维度与形状

  1. 常见维度类型

    • 0D 张量‌:标量(如 torch.tensor(5))‌。
    • 1D 张量‌:向量(如时间序列数据)‌。
    • 2D 张量‌:矩阵(如表格数据)‌。
    • 3D 张量‌:多通道图像(形状 (C, H, W))‌。
    • 4D 张量‌:批量图像(形状 (N, C, H, W)N 为批量大小)‌。
    • 5D 张量‌:视频或体积数据(如医疗图像)‌。
  2. 形状操作

    • 调整形状:reshape() 或 view()(需保证元素总数不变)‌。
    • 转置:tensor.T 或 transpose()‌。

四、运算与操作

  1. 数学运算

    • 逐元素运算(如 +*torch.sin())‌。
    • 矩阵乘法:torch.matmul() 或 @ 运算符‌。
  2. 索引与切片

    • 类似 NumPy 的索引方式:
      tensor = torch.rand(3, 4)
      row = tensor[0, :]          # 第一行
      column = tensor[:, 1]       # 第二列‌
      
  3. 自动求导

    • 启用梯度跟踪:
      x = torch.tensor(2.0, requires_grad=True)
      y = x**2
      y.backward()                # 计算梯度
      print(x.grad)               # 输出 4.0‌
      

五、其他特性

  1. 数据类型

    • 支持多种类型(如 torch.float32torch.int64),可通过 dtype 参数指定‌。
    • 通过 .float()、.int() 等方法改变 Tensor 的数据类型。
      tensor = torch.tensor([1, 2]).float()  # 转为 float32‌
  2. 设备切换

    • 使用 .to('cuda') 或 .cpu() 在 CPU 和 GPU 间移动张量‌。
      tensor_cpu = torch.tensor([1, 2])
      tensor_gpu = tensor_cpu.to("cuda")  # 转为 GPU Tensor‌

网站公告

今日签到

点亮在社区的每一天
去签到