Pytorch

作者: 阿凡提说AI | 来源:发表于2024-09-24 00:53 被阅读0次

    一、基本操作

    在 PyTorch 中,有多种方法和函数用于创建和操作张量(tensor)。以下是你提到的几个函数和属性的简要说明及用法示例:

    1. torch.arange

    用于创建一个一维张量,包含一个给定范围内的等间隔值。

    import torch
    
    # 创建从0到9的张量
    a = torch.arange(0, 10)  # 结果: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    

    2. torch.shape

    这是一个属性,用于获取张量的形状(即每个维度的大小)。

    b = torch.randn(2, 3)  # 创建一个2x3的随机张量
    shape = b.shape  # 结果: torch.Size([2, 3])
    

    3. torch.Size

    这是 shape 的返回类型,用于表示张量的维度。

    size = torch.Size((2, 3))
    print(size)  # 结果: torch.Size([2, 3])
    

    4. torch.numel

    用于返回张量中的元素总数。

    num_elements = b.numel()  # 结果: 6,因为2x3=6
    

    5. torch.reshape

    用于重新调整张量的形状,但不改变其数据。

    c = b.reshape(3, 2)  # 将2x3的张量变为3x2
    

    6. torch.zeros

    用于创建指定形状的全零张量。

    zeros_tensor = torch.zeros(2, 3)  # 创建一个2x3的全零张量
    

    7. torch.ones

    用于创建指定形状的全一张量。

    ones_tensor = torch.ones(2, 3)  # 创建一个2x3的全一张量
    

    8. torch.randn

    用于创建指定形状的张量,元素值来自标准正态分布(均值为0,方差为1)。

    random_tensor = torch.randn(2, 3)  # 创建一个2x3的随机张量
    

    9. torch.tensor

    用于从 Python 列表或其他数组创建一个新的张量。

    list_data = [1, 2, 3]
    tensor_from_list = torch.tensor(list_data)  # 结果: tensor([1, 2, 3])
    

    综合示例

    将上述功能结合在一起的一个简单示例:

    import torch
    
    # 使用 arange 创建张量
    arr = torch.arange(10)
    
    # 获取形状
    print("Shape:", arr.shape)
    
    # 获取元素数量
    print("Number of elements:", arr.numel())
    
    # 重新塑形
    reshaped_arr = arr.reshape(2, 5)
    print("Reshaped Array:\n", reshaped_arr)
    
    # 创建全零和全一的张量
    zeros_tensor = torch.zeros(2, 3)
    ones_tensor = torch.ones(2, 3)
    print("Zeros Tensor:\n", zeros_tensor)
    print("Ones Tensor:\n", ones_tensor)
    
    # 创建随机张量
    random_tensor = torch.randn(2, 3)
    print("Random Tensor:\n", random_tensor)
    
    # 从列表创建张量
    list_data = [1, 2, 3]
    tensor_from_list = torch.tensor(list_data)
    print("Tensor from List:", tensor_from_list)
    

    通过这些示例,你可以看到如何使用 PyTorch 的这些功能来创建和操作张量。

    10.数学运算

    PyTorch 是一个广泛使用的深度学习框架,具有强大的数学运算能力,尤其在张量(tensor)操作上。接下来,我将介绍 PyTorch 中的一些常用数学运算以及示例。

    1. 导入 PyTorch

    首先,需要导入 PyTorch:

    import torch
    

    2. 创建张量

    使用torch.tensor()torch.zeros()torch.ones()等创建张量:

    # 创建一个张量
    a = torch.tensor([[1, 2], [3, 4]])
    b = torch.tensor([[5, 6], [7, 8]])
    

    3. 基本数学运算

    3.1 加法

    # 加法
    c = a + b   # 或者使用 torch.add(a, b)
    print("Addition:\n", c)
    

    输出

    Addition:
     tensor([[ 6,  8],
            [10, 12]])
    

    3.2 减法

    # 减法
    d = a - b   # 或者使用 torch.sub(a, b)
    print("Subtraction:\n", d)
    

    输出

    Subtraction:
     tensor([[-4, -4],
            [-4, -4]])
    

    3.3 乘法

    # 元素级乘法
    e = a * b   # 或者使用 torch.mul(a, b)
    print("Element-wise Multiplication:\n", e)
    

    输出

    Element-wise Multiplication:
     tensor([[ 5, 12],
            [21, 32]])
    

    3.4 矩阵乘法

    # 矩阵乘法
    f = torch.mm(a, b)  # 或者使用 a @ b
    print("Matrix Multiplication:\n", f)
    

    输出

    Matrix Multiplication:
     tensor([[19, 22],
            [43, 50]])
    

    4. 常用数学函数

    PyTorch 提供了一系列常用的数学函数,如下所示:

    • 平方根torch.sqrt()
    • 指数torch.exp()
    • 对数torch.log()
    • 求和torch.sum()
    • 平均值torch.mean()
    • 最大值torch.max()

    示例:

    # 求平方根
    sqrt_tensor = torch.sqrt(a.float())
    print("Square Root:\n", sqrt_tensor)
    
    # 求和
    sum_tensor = torch.sum(a)
    print("Sum:", sum_tensor)
    
    # 平均值
    mean_tensor = torch.mean(a.float())
    print("Mean:", mean_tensor)
    

    5. 广播机制

    PyTorch 支持广播机制,使不同形状的张量能够在数学运算中兼容。

    示例:

    # 创建一个一维张量
    b = torch.tensor([10, 20])
    # 广播加法
    result = a + b  # 会自动扩展 b 的形状
    print("Broadcasting Addition:\n", result)
    

    6. 张量操作

    PyTorch 还支持许多其他张量操作,如转置、重塑等:

    # 转置
    transposed = a.t()
    print("Transposed:\n", transposed)
    
    # 重塑
    reshaped = a.view(4)  # 转换为一维张量
    print("Reshaped:\n", reshaped)
    

    7. GPU 加速

    如果你使用的是支持 CUDA 的 GPU,可以将张量移动到 GPU 上进行加速:

    # 将张量转移到 GPU
    if torch.cuda.is_available():
        a = a.to('cuda')
        b = b.to('cuda')
        c = a + b
        print("Addition on GPU:\n", c)
    

    总结

    以上是 PyTorch 中常用的数学运算,包括基本的加减乘除、各种数学函数、张量操作以及广播机制。掌握这些操作能够帮助你更加高效地进行深度学习和科学计算。

    11.索引和切片

    在 PyTorch 中,索引和切片是处理张量的重要工具。与 NumPy 类似,PyTorch 支持多种类型的索引和切片操作,允许你方便地访问张量的各个部分。下面是一些常用的索引和切片技巧及其示例。

    1. 导入 PyTorch

    首先,确保导入 PyTorch:

    import torch
    

    2. 创建张量

    创建一个示例张量:

    # 创建一个 3x4 的张量
    tensor = torch.tensor([[1, 2, 3, 4],
                            [5, 6, 7, 8],
                            [9, 10, 11, 12]])
    

    3. 基本索引

    3.1 单个元素索引

    使用标准的括号和逗号索引访问单个元素:

    # 访问第一行第二列的元素
    elem = tensor[0, 1]
    print("Element at (0, 1):", elem)  # 输出 2
    

    3.2 行或列索引

    访问整行或整列:

    # 访问第一行
    row = tensor[0]
    print("First row:", row)
    
    # 访问第二列
    column = tensor[:, 1]
    print("Second column:", column)
    

    4. 切片

    切片允许你提取张量的一部分。

    4.1 行切片

    可以使用冒号 : 进行行切片:

    # 访问前两行
    rows_slice = tensor[:2]
    print("First two rows:\n", rows_slice)
    

    4.2 列切片

    同样,可以使用 : 进行列切片:

    # 访问前两列
    columns_slice = tensor[:, :2]
    print("First two columns:\n", columns_slice)
    

    5. 多维切片

    可以同时切片多维张量。

    # 访问前两行和前两列
    slice_2d = tensor[:2, :2]
    print("Slice of first two rows and columns:\n", slice_2d)
    

    6. 高级索引

    6.1 使用整型列表或张量进行索引

    可以使用整型列表或张量访问特定的行或列:

    # 访问第一行和第三行
    advanced_index = tensor[[0, 2]]
    print("Advanced index (rows 0 and 2):\n", advanced_index)
    
    # 访问第二列和第四列
    column_advanced_index = tensor[:, [1, 3]]
    print("Advanced index (columns 1 and 3):\n", column_advanced_index)
    

    7. 布尔索引

    布尔索引允许根据条件选择元素:

    # 获取大于5的所有元素
    bool_mask = tensor > 5
    filtered_tensor = tensor[bool_mask]
    print("Elements greater than 5:", filtered_tensor)
    

    8. 修改张量

    可以使用索引和切片直接修改张量的内容:

    # 修改第一行的所有元素
    tensor[0] = torch.tensor([10, 20, 30, 40])
    print("Modified tensor:\n", tensor)
    
    # 修改第二列的所有元素
    tensor[:, 1] = 0
    print("Modified tensor with second column set to 0:\n", tensor)
    

    9. 视图与切片

    切片操作返回的是张量的视图,因此对切片结果的修改会影响原始张量:

    # 对切片进行修改
    slice_view = tensor[:2, :2]
    slice_view[0, 0] = 99
    print("Original tensor after modifying slice:\n", tensor)
    

    总结

    理解和掌握 PyTorch 的索引和切片功能是高效进行张量操作的关键。无论是基本索引、切片,还是更复杂的高级索引和布尔索引,这些功能都让你可以灵活地访问和操作数据。
    在 PyTorch 中,使用切片操作可以修改原始张量的部分内容,而不会重新分配内存。这是因为切片操作返回的是原始张量的视图,而不是一个新的副本。这使得在操作大量数据时更加节省内存。

    12.转化为其他Python对象

    在 PyTorch 和 NumPy 中,处理张量和数组的转换是一个常见的操作。以下是如何在这两个库之间进行转换以及将大小为 1 的张量转换为标量的方式。

    1. NumPy 与 PyTorch 张量转换

    从 NumPy 数组转换为 PyTorch 张量

    使用 torch.from_numpy() 函数:

    import numpy as np
    import torch
    
    # 创建一个 NumPy 数组
    numpy_array = np.array([[1, 2], [3, 4]])
    
    # 转换为 PyTorch 张量
    tensor_from_numpy = torch.from_numpy(numpy_array)
    print("Tensor from NumPy:\n", tensor_from_numpy)
    

    从 PyTorch 张量转换为 NumPy 数组

    使用 .numpy() 方法:

    # 创建一个 PyTorch 张量
    tensor = torch.tensor([[1, 2], [3, 4]])
    
    # 转换为 NumPy 数组
    numpy_array_from_tensor = tensor.numpy()
    print("NumPy array from Tensor:\n", numpy_array_from_tensor)
    

    2. 将大小为 1 的张量转换为标量

    在 PyTorch 中,您可以使用 .item() 方法将大小为 1 的张量(即单个元素)转换为标量(Python 数值)。示例如下:

    # 创建一个大小为 1 的张量
    single_value_tensor = torch.tensor([5.0])
    
    # 将其转换为标量
    scalar_value = single_value_tensor.item()
    print("Converted scalar value:", scalar_value)
    float(single_value_tensor)
    int(single_value_tensor)
    

    二、数据预处理

    使用 Pandas 读取数据集并处理缺失值,然后转换为 PyTorch 张量格式的过程可以分为几个步骤。下面是一个完整的示例,包括读取数据、处理缺失值和转换为张量。

    步骤概述

    1. 读取数据集:使用 Pandas 读取 CSV 或 Excel 文件。
    2. 处理缺失值:可以选择填充缺失值或删除含有缺失值的行。
    3. 转化为张量格式:使用 PyTorch 将处理后的数据转换为张量格式。

    示例代码

    以下是一个针对这些步骤的示例代码:

    import pandas as pd
    import torch
    
    # 1. 读取数据集
    # 假设我们有一个名为 'data.csv' 的数据文件
    # data = pd.read_csv('data.csv')  # 读取数据集
    data = pd.DataFrame({
        'A': [1, 2, None, 4],
        'B': [None, 5, 6, 7],
        'C': [8, 9, 10, None]
    })
    
    print("Original DataFrame:")
    print(data)
    
    # 2. 处理缺失值
    # 例子中选择填充缺失值(使用列的平均值),也可以选择删除含缺失值的行
    data.fillna(data.mean(), inplace=True)
    
    print("\nDataFrame after filling missing values:")
    print(data)
    
    # 3. 转化为张量格式
    # 将 DataFrame 转换为 NumPy 数组,然后转换为 PyTorch 张量
    tensor_data = torch.tensor(data.values, dtype=torch.float32)
    
    print("\nTensor format:")
    print(tensor_data)
    

    解析

    1. 读取数据集

      • 使用 pd.read_csv() 函数读取CSV格式的文件。如果您在使用Excel文件,可以使用 pd.read_excel()
      • 在这个示例中,我创建了一个简单的 DataFrame 作为示例。
    2. 处理缺失值

      • 使用 fillna() 方法可以用平均值填充缺失值,data.mean()会计算每一列的平均值。
      • 当然,您也可以选择使用其他方法来处理缺失值,如 dropna() 删除含有缺失值的行。
    3. 转换为张量格式

      • 数据框的 .values 属性将其转换为 NumPy 数组。
      • 使用 torch.tensor() 将 NumPy 数组转换为 PyTorch 张量,指定 dtypetorch.float32 以确保数据类型正确。

    注意事项

    • 数据类型:在转换为张量时,请确保数据类型是你所期望的类型。
    • 缺失值策略:根据具体的数据集和应用场景,选择合适的缺失值处理策略,例如用均值、中位数、众数填充,或删除含缺失值的行。
    • PyTorch 张量的大小:确保张量的大小符合后续处理的要求。

    这样,就可以完成 Pandas 数据集的读取、缺失值处理和转换为张量格式的操作。

    二、线性代数

    在PyTorch中,标量、向量、矩阵和张量是数据的不同表示方式。以下是关于它们的简单介绍以及相关操作的说明:

    1. 标量

    • 定义:标量是一个单一的数值,可以是整数或浮点数。
    • 在PyTorch中
      import torch
      scalar = torch.tensor(3.14)
      

    2. 向量

    • 定义:向量是一维数组,包含多个元素(通常是数字)。
    • 在PyTorch中
      vector = torch.tensor([1, 2, 3])
      

    3. 矩阵

    • 定义:矩阵是二维数组,包含行和列,例如 ( m \times n ) 维。
    • 在PyTorch中
      matrix = torch.tensor([[1, 2], [3, 4]])
      

    4. 张量

    • 定义:张量是多维数组,包含任意数量的维度。标量、向量和矩阵都是张量的特殊情况。
    • 在PyTorch中
      tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])  # 2x3 的张量
      

    5. 降维

    • 定义:降维是将高维数据转换为低维数据的过程。
    • 在PyTorch中,可以使用 torch.squeeze() 来去掉维度为1的维度:
      tensor = torch.tensor([[1], [2], [3]])
      squeezed_tensor = torch.squeeze(tensor)  # 变为一维张量
      

    6. 点积

    • 定义:点积是两个向量相对应元素相乘并求和的结果。
    • 在PyTorch中
      vector1 = torch.tensor([1, 2, 3])
      vector2 = torch.tensor([4, 5, 6])
      dot_product = torch.dot(vector1, vector2)  # 结果为 1*4 + 2*5 + 3*6
      

    7. 矩阵-向量积

    • 定义:矩阵对向量的乘法,生成新的向量。
    • 在PyTorch中
      matrix = torch.tensor([[1, 2], [3, 4]])
      vector = torch.tensor([5, 6])
      mat_vec_product = torch.matmul(matrix, vector)  # 结果为新的向量
      

    8. 矩阵-矩阵乘法

    • 定义:将两个矩阵相乘,生成一个新的矩阵。
    • 在PyTorch中
      matrix1 = torch.tensor([[1, 2], [3, 4]])
      matrix2 = torch.tensor([[5, 6], [7, 8]])
      mat_mat_product = torch.matmul(matrix1, matrix2)  # 结果为新的矩阵
      

    9. 范数

    • 定义:范数是对向量或张量的一种度量,常用来描述其大小或长度。
    • 在PyTorch中,可以使用 torch.norm()
      vector = torch.tensor([1, 2, 3])
      vector_norm = torch.norm(vector)  # 计算L2范数
      

    这些是PyTorch中处理基本线性代数操作的基础知识。如果还有其他问题或者需要更详细的解释,请随时告诉我!

    三、微积分

    在PyTorch中,导数和微分、偏导数、梯度以及链式法则是深度学习和优化中非常重要的概念。下面分别介绍这些概念,以及如何在PyTorch中使用它们。

    1. 导数与微分

    • 导数:导数描述了一个函数在某一点的变化率。具体而言,给定一个函数 f(x) ,导数 f'(x) 衡量在点 x 附近的函数输出变化的速率。

    • 微分:微分是导数的一个推广,强调是函数在某点的线性近似。通过微分形式,可以表示一个小变化 dx 对应的函数变化 df ,通常写作 df = f'(x)dx 。

    在PyTorch中,可以使用 torch.autograd 自动计算导数和微分。

    2. 偏导数

    • 偏导数是指在多元函数中固定所有变量后的一个变量的导数。给定一个函数 f(x1, x2,..., xn) ,偏导数 ∂f/∂xi 表示当其他变量保持不变时, xi 对函数输出的影响。

    在PyTorch中,偏导数通常通过反向传播来计算:

    import torch
    
    # 创建一个标量函数
    x = torch.tensor([1.0, 2.0], requires_grad=True)  # 设置requires_grad=True以便自动求导
    y = x[0]**2 + x[1]**2
    
    # 反向传播
    y.backward()
    
    # 查看偏导数
    print(x.grad)  # 输出 [2.0, 4.0],对应于偏导数 ∂y/∂x[0] 和 ∂y/∂x[1]
    

    3. 梯度

    • 梯度是一个向量,包含了多元函数的所有偏导数。它指示了函数在某一点的最陡上升方向。对于一个函数 f(x1, x2, ..., xn) ,其梯度表示为 ∇ f ,即:
    ∇f=[∂f/∂x1,∂f/∂x2,...,∂f/∂xn]    #需要注意这个是列向量
    

    在前面的示例中, x.grad 就是梯度的输出。

    4. 链式法则

    • 链式法则是导数的一种法则,允许计算复合函数的导数。若 ( z = f(g(x)) ),则其导数为:
    dz/dx = dz/dg·dg/dx
    

    在PyTorch中,从输出到输入反向传播的过程中会自动应用链式法则。

    import torch
    
    # 定义一个嵌套的函数
    def f(x):
        return x**2
    
    def g(x):
        return 3*x + 1
    
    # 复合函数
    x = torch.tensor(2.0, requires_grad=True)
    z = f(g(x))
    
    # 反向传播
    z.backward()
    print(x.grad)  # 输出对应于 z 对 x 的导数
    

    总结

    在PyTorch中,利用 torch.autograd 模块可以方便、自动地计算梯度和导数。这些概念在优化算法(例如梯度下降)中至关重要,因为它们帮助我们更新模型参数,以减小损失函数。

    四、自动微分

    在PyTorch中,自动微分是一项强大的功能,用于计算梯度。它使得用户能够通过简单的前向计算来自动获得相应的梯度。以下是关于自动微分、非标量变量的反向传播、分离计算以及 Python 控制流中梯度计算的详细说明。

    1. 自动微分

    自动微分(Autograd)是 PyTorch 的核心特性之一,它可以自动计算张量的导数。任何张量只要 requires_grad 属性设置为 True,在向其调用 .backward() 方法时,PyTorch 会自动进行反向传播,并计算与该张量有关的所有梯度。

    import torch
    
    # 创建需要计算梯度的张量
    x = torch.tensor(2.0, requires_grad=True)
    y = x ** 2
    
    # 进行反向传播
    y.backward()
    
    # 获取梯度
    print(x.grad)  # 输出 4.0,因为 d(y)/d(x) = 2*x = 2*2
    

    2. 非标量变量的反向传播

    对于非标量输出(即形状不为一的张量)的情况,进行反向传播时需要提供一个额外的参数 gradient。这个参数对应于输出的梯度。例如:

    # 创建需要计算梯度的张量
    x = torch.tensor([2.0, 3.0], requires_grad=True)
    y = x ** 2
    
    # y 是一个张量,所以反向传播需要提供梯度
    grad_output = torch.tensor([1.0, 1.0])  # 针对每个元素的梯度
    y.backward(grad_output)
    
    # 获取梯度
    print(x.grad)  # 输出 [4.0, 6.0],对应于 d(y)/d(x)
    

    3. 分离计算(Detach)

    在某些情况下,我们可能希望从计算图中隔离某个张量,使其不再追踪历史。这可以通过 .detach() 方法实现。这一操作在需要阻止梯度计算时非常有用,例如当执行某些评估或优化步骤时:

    x = torch.tensor(2.0, requires_grad=True)
    y = x ** 2
    
    # 计算梯度
    y.backward()
    
    # 直接获取梯度
    print(x.grad)  # 输出 4.0
    
    # 使用 detach
    with torch.no_grad():
        detached_y = y.detach()
        print(detached_y)  # 输出 y 的值,但不在计算图中
    
    # 继续进行一些计算(例如更新)
    z = detached_y + 1
    

    4. Python 控制流的梯度计算

    在 Python 中,可以使用控制流语句(如 iffor)来动态调整计算图。PyTorch 的自动微分可以处理这些控制流;即使在循环内,PyTorch 也能够正确进行反向传播。

    示例:

    x = torch.tensor(2.0, requires_grad=True)
    y = 0
    
    for i in range(3):
        if i < 2:
            y += x ** 2
        else:
            y += x
    
    y.backward()
    
    print(x.grad)  # 结果是 8.0,因为 (2*2 + 2*2) = 8
    

    总结

    • 自动微分:PyTorch 提供了自动计算梯度的能力,通过设置 requires_grad 和调用 .backward() 实现。
    • 非标量变量的反向传播:反向传播一个非标量变量时,需要提供一个与它形状相同的梯度。
    • 分离计算:使用 .detach() 可以从计算图中分离张量,防止梯度被计算。
    • 控制流中的梯度计算:PyTorch 能够处理动态的控制流,允许在计算图内根据条件动态调整计算。

    五、概率论

    1.计算期望
    E[X]= ∑ x i⋅p(x i )

    import torch
    
    # 示例:假设我们有一个离散随机变量的取值和对应的概率
    values = torch.tensor([0, 1, 2, 3, 4])
    probabilities = torch.tensor([0.1, 0.2, 0.4, 0.2, 0.1])  # 确保这些概率的和为1
    
    # 计算期望
    expected_value = torch.sum(values * probabilities)
    print(f"期望 E[X]: {expected_value.item()}")
    

    2.计算方差
    Var(X)=E[X的平方]−(E[X])的平方

    # 计算 E[X^2]
    expected_value_squared = torch.sum((values ** 2) * probabilities)
    
    # 计算方差
    variance = expected_value_squared - (expected_value ** 2)
    print(f"方差 Var(X): {variance.item()}")
    

    3.计算协方差
    Cov(X,Y)=E[XY]−E[X]E[Y]

    # 假设 X 和 Y 是独立的随机变量
    values_x = torch.tensor([0, 1, 2])
    probabilities_x = torch.tensor([0.5, 0.5, 0.0])
    
    values_y = torch.tensor([0, 1])
    probabilities_y = torch.tensor([0.7, 0.3])
    
    # 计算期望
    expected_x = torch.sum(values_x * probabilities_x)
    expected_y = torch.sum(values_y * probabilities_y)
    
    # 计算 E[XY]
    expected_xy = torch.sum(torch.outer(values_x, values_y) * torch.outer(probabilities_x, probabilities_y).flatten())
    
    # 计算协方差
    covariance = expected_xy - (expected_x * expected_y)
    print(f"协方差 Cov(X, Y): {covariance.item()}")
    

    相关文章

      网友评论

          本文标题:Pytorch

          本文链接:https://www.haomeiwen.com/subject/kkotrjtx.html