前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【PyTorch入门】 张量的介绍及常用函数和数据基础【一】

【PyTorch入门】 张量的介绍及常用函数和数据基础【一】

作者头像
机器学习司猫白
修改2025-02-10 09:24:40
修改2025-02-10 09:24:40
14300
代码可运行
举报
文章被收录于专栏:机器学习实战机器学习实战
运行总次数:0
代码可运行

Hello 今天给大家分享torch的一些基础内容,让大家对pytorch有一些基本的了解。

在人工智能时代,机器学习技术在不断更新,深度学习更是机器学习领域中的一个全新的研究领域和热点方向,深度学习不仅推动了机器学习,更是促进了人工智能时代技术的更迭,已经被成功运用在了语音识别,图像分类识别等领域,有着巨大的发展价值。

近年来,pytorch更是备受喜爱,使用pytorch进行深度学习开发和研究已经成为主流。

PyTorch 中的底层框架:张量 (Tensor)

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

1. 张量 (Tensor) 的定义

在 PyTorch 中,张量(Tensor)是一个多维矩阵的类,可以存储多维的数据,如标量、向量、矩阵或更高维度的数组。张量本质上是一个类(torch.Tensor),与 NumPy 中的 ndarray 相似,但是它支持 GPU 加速。

代码语言:javascript
代码运行次数:0
复制
import torch

# 创建一个 2D 张量(矩阵)
tensor_2d = torch.tensor([[1, 2], [3, 4]])

print(tensor_2d)
代码语言:javascript
代码运行次数:0
复制
tensor([[1, 2],
        [3, 4]])
2. 张量的基本属性

每个张量都有几个关键的属性:

形状 (Shape):张量的维度(即每一维的大小)。可以通过 .shape 或 .size() 获取。 数据类型 (dtype):张量中数据的类型,如浮点型(torch.float32)、整型(torch.int64)等。可以通过 .dtype 获取。 设备 (Device):张量存储的位置,可以是 CPU 或 GPU。通过 .device 可以查看当前设备。

代码语言:javascript
代码运行次数:0
复制
# 示例
tensor = torch.tensor([[1, 2], [3, 4]])

print("Shape:", tensor.shape)  # 输出张量的形状
print("dtype:", tensor.dtype)  # 输出张量的数据类型
print("device:", tensor.device)  # 输出张量所在设备
代码语言:javascript
代码运行次数:0
复制
Shape: torch.Size([2, 2])
dtype: torch.int64
device: cpu
3. 张量的初始化

PyTorch 提供了多种方式来初始化张量,常用的有:

从数据创建张量:可以直接使用 torch.tensor() 来从 Python 列表或 NumPy 数组创建张量。

代码语言:javascript
代码运行次数:0
复制
tensor_from_list = torch.tensor([1, 2, 3])  # 一维张量
常见初始化函数:

torch.zeros():创建一个值为零的张量。 torch.ones():创建一个值为一的张量。 torch.randn():创建一个遵循标准正态分布的张量。 torch.arange():创建一个有序的张量。 torch.linspace():创建一个均匀分布的张量。

代码语言:javascript
代码运行次数:0
复制
zeros_tensor = torch.zeros(3, 3)  # 3x3 张量,所有元素为0
ones_tensor = torch.ones(2, 2)  # 2x2 张量,所有元素为1
random_tensor = torch.randn(2, 3)  # 2x3 张量,符合标准正态分布
zeros_tensor, ones_tensor, random_tensor
代码语言:javascript
代码运行次数:0
复制
(tensor([[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]]),
 tensor([[1., 1.],
         [1., 1.]]),
 tensor([[ 0.3930,  0.4327, -1.3627],
         [ 1.3564,  0.6688, -0.7077]]))
4. 张量的类型转换:

PyTorch 允许通过 .to() 或 .type() 方法来转换张量的数据类型。

代码语言:javascript
代码运行次数:0
复制
tensor = torch.tensor([1, 2, 3], dtype=torch.float32)
tensor = tensor.to(torch.int64)  # 转换为整数类型
5.张量的设备

PyTorch 张量可以在 CPU 或 GPU 上运行。使用 .to() 方法可以将张量转移到 GPU(前提是你的系统有支持的 GPU)。

代码语言:javascript
代码运行次数:0
复制
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tensor = tensor.to(device)
6. 张量的操作

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

加减
代码语言:javascript
代码运行次数:0
复制
tensor1 = torch.tensor([1, 2])
tensor2 = torch.tensor([3, 4])
sum_tensor = tensor1 + tensor2  # 张量加法
diff_tensor = tensor1 - tensor2  # 张量减法
元素级乘除
代码语言:javascript
代码运行次数:0
复制
product_tensor = tensor1 * tensor2  # 乘法
div_tensor = tensor1 / tensor2  # 除法
矩阵乘法

使用torch.matmul(mat1, mat2)

代码语言:javascript
代码运行次数:0
复制
mat1 = torch.randn(2, 3)
mat2 = torch.randn(3, 4)
result = torch.matmul(mat1, mat2)  # 矩阵乘法
转置和改变形状
代码语言:javascript
代码运行次数:0
复制
tensor = torch.randn(2, 3)
transposed_tensor = tensor.T  # 转置
reshaped_tensor = tensor.view(3, 2)  # 改变形状
聚合操作:

PyTorch 提供了对张量的求和、求平均、最大值、最小值等操作。

代码语言:javascript
代码运行次数:0
复制
sum_val = tensor.sum()  # 求和
mean_val = tensor.mean()  # 求均值
max_val = tensor.max()  # 最大值
7. 自动求导 (Autograd)

PyTorch 具有自动求导机制,能够计算张量的梯度。这是深度学习中反向传播的核心。通过 requires_grad=True 来启用张量的梯度计算。

代码语言:javascript
代码运行次数:0
复制
x = torch.tensor([2.0], requires_grad=True)
y = x**2 + 3*x + 1
y.backward()  # 计算梯度

print(x.grad)  # 输出梯度值
代码语言:javascript
代码运行次数:0
复制
tensor([7.])

在这个例子中,y.backward() 会自动计算 y 关于 x 的梯度,并保存在 x.grad 中。

8. 与 NumPy 的关系

PyTorch 的张量与 NumPy 的数组非常相似,它们之间可以无缝转换。通过 torch.tensor() 可以将 NumPy 数组转换为张量,通过 .numpy() 方法可以将张量转换为 NumPy 数组。

代码语言:javascript
代码运行次数:0
复制
import numpy as np

# NumPy 数组转张量
np_array = np.array([1, 2, 3])
tensor_from_np = torch.tensor(np_array)

# 张量转 NumPy 数组
tensor = torch.tensor([4, 5, 6])
np_from_tensor = tensor.numpy()
代码语言:javascript
代码运行次数:0
复制
array([4, 5, 6], dtype=int64)

pytorch中的主要函数

1. seed()
代码语言:javascript
代码运行次数:0
复制
import torch
torch.seed()
代码语言:javascript
代码运行次数:0
复制
614398074638100

用于生成不确定的随机数,返回64位数值。 参数:无

2. manual_seed()
代码语言:javascript
代码运行次数:0
复制
torch.manual_seed(10)
代码语言:javascript
代码运行次数:0
复制
<torch._C.Generator at 0x20c67010830>

设定生成的随机数种子,返回一个Generator 对象。初始化 PyTorch 所有随机数生成操作的种子,确保在不同的运行中能够生成相同的随机数序列,从而使得实验的结果可复现。

举个例子
代码语言:javascript
代码运行次数:0
复制
# 设置随机数种子
torch.manual_seed(10)

# 生成一个随机张量
x = torch.rand(3, 3)
print(x)
代码语言:javascript
代码运行次数:0
复制
tensor([[0.4581, 0.4829, 0.3125],
        [0.6150, 0.2139, 0.4118],
        [0.6938, 0.9693, 0.6178]])

每次运行结果得到的张量是一样的,因为设置了随机数种子。

3.initial_seed()
代码语言:javascript
代码运行次数:0
复制
torch.initial_seed()
代码语言:javascript
代码运行次数:0
复制
10

这个函数可以返回你刚刚设置的随机数种子。

4.get_rng_state()
代码语言:javascript
代码运行次数:0
复制
torch.get_rng_state()
代码语言:javascript
代码运行次数:0
复制
tensor([10,  0,  0,  ...,  0,  0,  0], dtype=torch.uint8)

用来获取当前随机数生成器(RNG,Random Number Generator)的状态的函数。它返回一个包含当前状态的张量,可以用来在将来恢复相同的随机数生成器状态,从而使得随机数生成的过程可复现。

5.get_rng_state()
代码语言:javascript
代码运行次数:0
复制
torch.get_rng_state()

用来 获取当前随机数生成器(RNG)状态 的函数。它返回一个张量,代表当前随机数生成器的内部状态信息。通过获取这个状态,您可以在将来的某个时间点恢复这个状态,从而确保生成的随机数序列保持一致,确保实验的可复现性。

代码语言:javascript
代码运行次数:0
复制
# 设置随机种子
torch.manual_seed(42)

# 生成一个随机张量
x1 = torch.rand(3, 3)
print("原始随机张量:")
print(x1)

# 获取当前随机数生成器的状态
rng_state = torch.get_rng_state()

# 更改种子,生成另一个随机张量
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 应该是相同的
代码语言:javascript
代码运行次数:0
复制
原始随机张量:
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.1025, 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可以实现自动微分。

代码语言:javascript
代码运行次数:0
复制
import torch
# 定义张量w和x
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
#  定义 a 和 b
a = torch.add(x, w)
b = torch.add(w, 1)
y = torch.mul(a, b)

# 反向传播
y.backward()

print(w.grad)
代码语言:javascript
代码运行次数:0
复制
tensor([5.])
  1. w 和 x 都是张量(标量形式),它们的值分别是 1.0 和 2.0。requires_grad=True 表示这两个张量需要计算梯度。PyTorch 会追踪这些张量的操作,以便我们可以计算它们在某个计算图中的梯度。
  2. 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。
  3. y.backward() 计算 y 关于所有要求梯度的张量(在这个例子中是 w 和 x)的梯度。这个操作会触发 PyTorch 自动微分引擎来根据计算图中的操作计算梯度。 在这个例子中,我们需要计算的是 w 的梯度,因为 w.requires_grad=True。
梯度计算过程
如何计算 w 的梯度

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

  1. 计算 y 关于 ab 的偏导数: 由于 y = a * b,所以根据乘法法则,有:
\frac{\partial y}{\partial a} = b \quad \text{和} \quad \frac{\partial y}{\partial b} = a
  1. 计算 ab 关于 w 的偏导数
    • a = x + w,所以:
    \frac{\partial a}{\partial w} = 1
    • b = w + 1,所以:
    \frac{\partial b}{\partial w} = 1
  2. 使用链式法则计算 y 关于 w 的梯度: 通过链式法则,我们可以计算 y 相对于 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}

代入已知的值:

\frac{\partial y}{\partial w} = b \cdot 1 + a \cdot 1

由于 a = 3.0b = 2.0,所以:

\frac{\partial y}{\partial w} = 2.0 \cdot 1 + 3.0 \cdot 1 = 2.0 + 3.0 = 5.0

因此,w.grad 将是 5.0

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PyTorch 中的底层框架:张量 (Tensor)
    • 1. 张量 (Tensor) 的定义
    • 2. 张量的基本属性
    • 3. 张量的初始化
    • 常见初始化函数:
    • 4. 张量的类型转换:
    • 5.张量的设备
    • 6. 张量的操作
      • 加减
      • 元素级乘除
      • 矩阵乘法
      • 转置和改变形状
      • 聚合操作:
    • 7. 自动求导 (Autograd)
    • 8. 与 NumPy 的关系
  • pytorch中的主要函数
    • 1. seed()
    • 2. manual_seed()
      • 举个例子
    • 3.initial_seed()
    • 4.get_rng_state()
    • 5.get_rng_state()
  • 微分基础
    • 梯度计算过程
      • 如何计算 w 的梯度
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档