Pytorch

2024-09-24  本文已影响0人  阿凡提说AI

一、基本操作

在 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 提供了一系列常用的数学函数,如下所示:

示例:

# 求平方根
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 以确保数据类型正确。

注意事项

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

二、线性代数

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

1. 标量

2. 向量

3. 矩阵

4. 张量

5. 降维

6. 点积

7. 矩阵-向量积

8. 矩阵-矩阵乘法

9. 范数

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

三、微积分

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

1. 导数与微分

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

2. 偏导数

在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=[∂f/∂x1,∂f/∂x2,...,∂f/∂xn]    #需要注意这个是列向量

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

4. 链式法则

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

总结

五、概率论

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()}")
上一篇下一篇

猜你喜欢

热点阅读