【PyTorch入门】 张量的先容及常用函数和数据基础【一】 ...

打印 上一主题 下一主题

主题 808|帖子 808|积分 2424

Hello 今天给大家分享torch的一些基础内容,让大家对pytorch有一些基本的了解。
  在人工智能时代,机器学习技能在不断更新,深度学习更是机器学习范畴中的一个全新的研究范畴和热门方向,深度学习不仅推动了机器学习,更是促进了人工智能时代技能的更迭,已经被成功运用在了语音识别,图像分类识别等范畴,有着巨大的发展价值。
比年来,pytorch更是备受喜好,使用pytorch进行深度学习开辟和研究已经成为主流。
PyTorch 中的底层框架:张量 (Tensor)

PyTorch 中,张量 (Tensor) 是其核心的数据结构之一,几乎所有操纵都与张量密切相关。PyTorch 的张量提供了一个多维数组的基础,类似于 NumPy 数组,但具有更多的功能,特别是在深度学习中与 GPU 盘算的高效配合。
1. 张量 (Tensor) 的界说

在 PyTorch 中,张量(Tensor)是一个多维矩阵的类,可以存储多维的数据,如标量、向量、矩阵或更高维度的数组。张量本质上是一个类(torch.Tensor),与 NumPy 中的 ndarray 相似,但是它支持 GPU 加速。
  1. import torch
  2. # 创建一个 2D 张量(矩阵)
  3. tensor_2d = torch.tensor([[1, 2], [3, 4]])
  4. print(tensor_2d)
复制代码
  1. tensor([[1, 2],
  2.         [3, 4]])
复制代码
2. 张量的基本属性

每个张量都有几个关键的属性:
形状 (Shape):张量的维度(即每一维的巨细)。可以通过 .shape 或 .size() 获取。
数据类型 (dtype):张量中数据的类型,如浮点型(torch.float32)、整型(torch.int64)等。可以通过 .dtype 获取。
设备 (Device):张量存储的位置,可以是 CPU 或 GPU。通过 .device 可以查看当前设备。
  1. # 示例
  2. tensor = torch.tensor([[1, 2], [3, 4]])
  3. print("Shape:", tensor.shape)  # 输出张量的形状
  4. print("dtype:", tensor.dtype)  # 输出张量的数据类型
  5. print("device:", tensor.device)  # 输出张量所在设备
复制代码
  1. Shape: torch.Size([2, 2])
  2. dtype: torch.int64
  3. device: cpu
复制代码
3. 张量的初始化

PyTorch 提供了多种方式来初始化张量,常用的有:
从数据创建张量:可以直接使用 torch.tensor() 来从 Python 列表或 NumPy 数组创建张量。
  1. tensor_from_list = torch.tensor([1, 2, 3])  # 一维张量
复制代码
常见初始化函数:

torch.zeros():创建一个值为零的张量。
torch.ones():创建一个值为一的张量。
torch.randn():创建一个遵照标准正态分布的张量。
torch.arange():创建一个有序的张量。
torch.linspace():创建一个均匀分布的张量。
  1. zeros_tensor = torch.zeros(3, 3)  # 3x3 张量,所有元素为0
  2. ones_tensor = torch.ones(2, 2)  # 2x2 张量,所有元素为1
  3. random_tensor = torch.randn(2, 3)  # 2x3 张量,符合标准正态分布
  4. zeros_tensor, ones_tensor, random_tensor
复制代码
  1. (tensor([[0., 0., 0.],
  2.          [0., 0., 0.],
  3.          [0., 0., 0.]]),
  4. tensor([[1., 1.],
  5.          [1., 1.]]),
  6. tensor([[ 0.3930,  0.4327, -1.3627],
  7.          [ 1.3564,  0.6688, -0.7077]]))
复制代码
4. 张量的类型转换:

PyTorch 答应通过 .to() 或 .type() 方法来转换张量的数据类型。
  1. tensor = torch.tensor([1, 2, 3], dtype=torch.float32)
  2. tensor = tensor.to(torch.int64)  # 转换为整数类型
复制代码
5.张量的设备

PyTorch 张量可以在 CPU 或 GPU 上运行。使用 .to() 方法可以将张量转移到 GPU(条件是你的体系有支持的 GPU)。
  1. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  2. tensor = tensor.to(device)
复制代码
6. 张量的操纵

PyTorch 提供了丰富的张量操纵,包括数学运算、矩阵操纵、线性代数操纵等。这些操纵通常是基于 NumPy 数组的操纵,同时也支持 GPU 加速。
加减

  1. tensor1 = torch.tensor([1, 2])
  2. tensor2 = torch.tensor([3, 4])
  3. sum_tensor = tensor1 + tensor2  # 张量加法
  4. diff_tensor = tensor1 - tensor2  # 张量减法
复制代码
元素级乘除

  1. product_tensor = tensor1 * tensor2  # 乘法
  2. div_tensor = tensor1 / tensor2  # 除法
复制代码
矩阵乘法

使用torch.matmul(mat1, mat2)
  1. mat1 = torch.randn(2, 3)
  2. mat2 = torch.randn(3, 4)
  3. result = torch.matmul(mat1, mat2)  # 矩阵乘法
复制代码
转置和改变形状

  1. tensor = torch.randn(2, 3)
  2. transposed_tensor = tensor.T  # 转置
  3. reshaped_tensor = tensor.view(3, 2)  # 改变形状
复制代码
聚合操纵:

PyTorch 提供了对张量的求和、求均匀、最大值、最小值等操纵。
  1. sum_val = tensor.sum()  # 求和
  2. mean_val = tensor.mean()  # 求均值
  3. max_val = tensor.max()  # 最大值
复制代码
7. 自动求导 (Autograd)

PyTorch 具有自动求导机制,可以大概盘算张量的梯度。这是深度学习中反向传播的核心。通过 requires_grad=True 来启用张量的梯度盘算。
  1. x = torch.tensor([2.0], requires_grad=True)
  2. y = x**2 + 3*x + 1
  3. y.backward()  # 计算梯度
  4. print(x.grad)  # 输出梯度值
复制代码
  1. tensor([7.])
复制代码
在这个例子中,y.backward() 会自动盘算 y 关于 x 的梯度,并保存在 x.grad 中。
8. 与 NumPy 的关系

PyTorch 的张量与 NumPy 的数组非常相似,它们之间可以无缝转换。通过 torch.tensor() 可以将 NumPy 数组转换为张量,通过 .numpy() 方法可以将张量转换为 NumPy 数组。
  1. import numpy as np
  2. # NumPy 数组转张量
  3. np_array = np.array([1, 2, 3])
  4. tensor_from_np = torch.tensor(np_array)
  5. # 张量转 NumPy 数组
  6. tensor = torch.tensor([4, 5, 6])
  7. np_from_tensor = tensor.numpy()
复制代码
  1. array([4, 5, 6], dtype=int64)
复制代码
pytorch中的重要函数

1. seed()

  1. import torch
  2. torch.seed()
复制代码
  1. 61439807463810
  2. 0
复制代码
用于生成不确定的随机数,返回64位数值。
参数:无
2. manual_seed()

  1. torch.manual_seed(10
  2. )
复制代码
  1. <torch._C.Generator at 0x20c67010
  2. 830>
复制代码
设定生成的随机数种子,返回一个Generator 对象。初始化 PyTorch 所有随机数生成操纵的种子,确保在差异的运行中可以大概生成相同的随机数序列,从而使得实行的效果可复现。
举个例子

  1. # 设置随机数种子torch.manual_seed(10
  2. )
  3. # 生成一个随机张量x = torch.rand(3, 3)print(x)
复制代码
  1. tensor([[0.4581, 0.4829, 0.3125],
  2.         [0.6150, 0.2139, 0.4118],
  3.         [0.6938, 0.9693, 0.6178]])
复制代码
每次运行效果得到的张量是一样的,因为设置了随机数种子。
3.initial_seed()

  1. torch.initial_seed()
复制代码
  1. 10
复制代码
这个函数可以返回你刚刚设置的随机数种子。
4.get_rng_state()

  1. torch.get_rng_state()
复制代码
  1. tensor([10
  2. ,  0,  0,  ...,  0,  0,  0], dtype=torch.uint8)
复制代码
用来获取当前随机数生成器(RNG,Random Number Generator)的状态的函数。它返回一个包含当前状态的张量,可以用来在未来恢复相同的随机数生成器状态,从而使得随机数生成的过程可复现。
5.get_rng_state()

  1. torch.get_rng_state()
复制代码
用来 获取当前随机数生成器(RNG)状态 的函数。它返回一个张量,代表当前随机数生成器的内部状态信息。通过获取这个状态,您可以在未来的某个时间点恢复这个状态,从而确保生成的随机数序列保持一致,确保实行的可复现性。
  1. # 设置随机种子torch.manual_seed(42)# 生成一个随机张量x1 = torch.rand(3, 3)print("原始随机张量:")print(x1)# 获取当前随机数生成器的状态rng_state = torch.get_rng_state()
  2. # 更改种子,生成另一个随机张量torch.manual_seed(123)x2 = torch.rand(3, 3)print("新的随机张量:")print(x2)# 恢复原始的随机数生成器状态torch.set_rng_state(rng_state)# 生成一个新的随机张量,它应该与x1相同x3 = torch.rand(3, 3)print("Tensor after restoring RNG state:")print(x3)# 观察效果,x1 和 x3 应该是相同的
复制代码
  1. 原始随机张量:tensor([[0.8823, 0.9150, 0.3829],        [0.9593, 0.3904, 0.6009],        [0.2566, 0.7936, 0.9408]])新的随机张量:tensor([[0.2961, 0.5166, 0.2517],        [0.6886, 0.0740, 0.8665],        [0.1366, 0.10
  2. 25, 0.1841]])Tensor after restoring RNG state:tensor([[0.1332, 0.9346, 0.5936],        [0.8694, 0.5677, 0.7411],        [0.4294, 0.8854, 0.5739]])
复制代码
微分基础

微分是数学中的概念,是对函数局部变革率的线性形貌,pytorch可以实现自动微分。
  1. import torch
  2. # 定义张量w和x
  3. w = torch.tensor([1.], requires_grad=True)
  4. x = torch.tensor([2.], requires_grad=True)
  5. #  定义 a 和 b
  6. a = torch.add(x, w)
  7. b = torch.add(w, 1)
  8. y = torch.mul(a, b)
  9. # 反向传播
  10. y.backward()
  11. print(w.grad)
复制代码
  1. tensor([5.])
复制代码

  • w 和 x 都是张量(标量形式),它们的值分别是 1.0 和 2.0。requires_grad=True 表示这两个张量需要盘算梯度。PyTorch 会追踪这些张量的操纵,以便我们可以盘算它们在某个盘算图中的梯度。
  • a = x + w 盘算了 a,即 a = 2.0 + 1.0 = 3.0。
    b = w + 1 盘算了 b,即 b = 1.0 + 1.0 = 2.0。
    y = a * b 盘算了 y,即 y = 3.0 * 2.0 = 6.0。
  • y.backward() 盘算 y 关于所有要求梯度的张量(在这个例子中是 w 和 x)的梯度。这个操纵会触发 PyTorch 自动微分引擎来根据盘算图中的操纵盘算梯度。
    在这个例子中,我们需要盘算的是 w 的梯度,因为 w.requires_grad=True。
梯度盘算过程

如何盘算 w 的梯度

我们可以通过链式法则来手动推导 w 的梯度:

  • 盘算 y 关于 a 和 b 的偏导数
    由于 y = a * b,所以根据乘法法则,有:
                                                                ∂                                  y                                                      ∂                                  a                                                 =                            b                                     和                                                            ∂                                  y                                                      ∂                                  b                                                 =                            a                                  \frac{\partial y}{\partial a} = b \quad \text{和} \quad \frac{\partial y}{\partial b} = a                     ∂a∂y​=b和∂b∂y​=a

  • 盘算 a 和 b 关于 w 的偏导数

    • a = x + w,所以:
                                                                                           ∂                                           a                                                                     ∂                                           w                                                                =                                     1                                              \frac{\partial a}{\partial w} = 1                              ∂w∂a​=1
    • b = w + 1,所以:
                                                                                           ∂                                           b                                                                     ∂                                           w                                                                =                                     1                                              \frac{\partial b}{\partial w} = 1                              ∂w∂b​=1

  • 使用链式法则盘算 y 关于 w 的梯度
    通过链式法则,我们可以盘算 y 相对于 w 的梯度:
                                                                                  ∂                                        y                                                                ∂                                        w                                                           =                                                             ∂                                        y                                                                ∂                                        a                                                           ⋅                                                             ∂                                        a                                                                ∂                                        w                                                           +                                                             ∂                                        y                                                                ∂                                        b                                                           ⋅                                                             ∂                                        b                                                                ∂                                        w                                                                   \frac{\partial y}{\partial w} = \frac{\partial y}{\partial a} \cdot \frac{\partial a}{\partial w} + \frac{\partial y}{\partial b} \cdot \frac{\partial b}{\partial w}                           ∂w∂y​=∂a∂y​⋅∂w∂a​+∂b∂y​⋅∂w∂b​
    代入已知的值:
                                                                                  ∂                                        y                                                                ∂                                        w                                                           =                                  b                                  ⋅                                  1                                  +                                  a                                  ⋅                                  1                                          \frac{\partial y}{\partial w} = b \cdot 1 + a \cdot 1                           ∂w∂y​=b⋅1+a⋅1
    由于 a = 3.0 和 b = 2.0,所以:
                                                                                  ∂                                        y                                                                ∂                                        w                                                           =                                  2.0                                  ⋅                                  1                                  +                                  3.0                                  ⋅                                  1                                  =                                  2.0                                  +                                  3.0                                  =                                  5.0                                          \frac{\partial y}{\partial w} = 2.0 \cdot 1 + 3.0 \cdot 1 = 2.0 + 3.0 = 5.0                           ∂w∂y​=2.0⋅1+3.0⋅1=2.0+3.0=5.0
    因此,w.grad 将是 5.0。
== 今天的分享就竣事了,希望小伙伴们可以开端的了解张量。==

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表