笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~
pytorch快速入门
简介
PyTorch是一个开源的机器学习框架,它提供了丰富的工具和库,用于构建和训练深度学习模型。下面是一些关于PyTorch的基本信息:
张量(Tensor)操作
:PyTorch中的核心对象是张量,它是一个多维数组。PyTorch提供了广泛的张量操作函数,可以执行各种数学运算和线性代数操作。
自动微分
:PyTorch使用动态图计算的方式,允许用户轻松定义和计算梯度。通过在张量上设置 requires_grad=True,可以跟踪和自动计算梯度。这使得实现反向传播算法变得简单,对于构建和训练深度学习模型非常重要。
模型构建
:PyTorch提供了灵活的模型构建方式。可以通过继承 torch.nn.Module 类来定义自己的模型,并在 forward() 方法中指定前向传播的操作。这样的模型可以由多个层组成,每个层可以是全连接层、卷积层、循环神经网络等。
损失函数
:PyTorch提供了多种常见的损失函数,用于评估模型输出与目标之间的差异。例如,均方误差损失函数用于回归问题,交叉熵损失函数用于分类问题。
优化器
:PyTorch提供了多种优化算法的实现,如随机梯度下降(SGD)、Adam、RMSprop等。这些优化器可以用于更新模型参数,以最小化定义的损失函数。
数据加载和预处理
:PyTorch提供了用于加载和处理数据的工具。可以使用 torchvision 库加载常见的图像数据集,并应用各种数据增强技术来扩充训练数据集。
分布式训练
:PyTorch支持分布式训练,可以在多个GPU或多台机器上并行运行。这有助于加速训练过程,并处理更大规模的数据集和模型。
总的来说,PyTorch提供了一个灵活且易于使用的深度学习框架,使得构建、训练和部署深度学习模型变得简单和高效。它广泛应用于学术界和工业界,并得到了广大开发者的喜爱和支持。
import torch
print("pytorch版本:", torch.__version__)
输出结果为:
pytorch版本: 2.1.0+cpu
张量(Tensor)操作
数据类型:在PyTorch中,Tensor可以是多种数据类型,如float、double、int、long等。这些类型对应于不同的精度和范围。
张量操作:PyTorch提供了大量的张量操作函数,可以进行各种数学运算和线性代数操作。这些函数包括加、减、乘、除、矩阵乘法、向量点积、转置、逆矩阵等等。
自动求导:Tensor可以通过设置 requires_grad=True 来启用自动求导。这允许用户轻松定义和计算梯度,以用于反向传播算法。
Tensor形状:Tensor的形状指的是其各个维度的大小。可以通过 shape 属性来获取Tensor的形状。形状信息对于构建和训练深度学习模型非常重要。
广播机制:在进行张量运算时,如果两个张量的形状不完全相同,PyTorch会自动执行广播机制。这意味着,较小的张量将被自动扩展,以匹配较大张量的形状。
索引和切片:可以使用整数索引和切片操作来访问Tensor中的元素。此外,还可以使用布尔索引和高级索引等功能,进行更复杂的Tensor操作。
GPU加速:在支持CUDA的GPU上,PyTorch可以利用GPU加速Tensor操作,从而实现更快的计算速度。
创建张量
使用 torch.zeros() 或 torch.ones() 函数创建全零或全一张量:
zeros_tensor = torch.zeros(5, 3)
ones_tensor = torch.ones(5, 3)
使用 torch.randn() 函数创建符合标准正态分布的随机数张量:
random_tensor = torch.randn(5, 3)
使用 torch.Tensor() 创建张量:
import torch
# 从 Python 标量创建张量
scalar_tensor = torch.tensor(3.14)
print(scalar_tensor) # 输出 tensor(3.1400)
# 从 Python 列表创建张量
list_tensor = torch.tensor([1, 2, 3])
print(list_tensor) # 输出 tensor([1, 2, 3])
# 从 NumPy 数组创建张量
numpy_array = np.array([4, 5, 6])
numpy_tensor = torch.tensor(numpy_array)
print(numpy_tensor) # 输出 tensor([4, 5, 6], dtype=torch.int32)
# 创建一个指定大小的空张量
empty_tensor = torch.tensor([])
print(empty_tensor) # 输出 tensor([])
# 从其他张量创建张量
x = torch.tensor([1, 2, 3])
y = torch.tensor(x)
print(y) # 输出 tensor([1, 2, 3])
# x 和 y是两个完全独立的张量对象,它们在内存中占据不同的位置。
x[0] = 100
print(x) # tensor([100, 2, 3])
print(y) # tensor([1, 2, 3])
注意,以上三种方法都可以通过添加 .to(device) 方法将张量转移到GPU设备上(如果你的系统支持GPU加速)。
向量拷贝
torch.tensor()、tensor.clone()、tensor.detach()进行数据拷贝,新tensor和原来的数据不再共享内存。
.clone()
和 .detach()
都是用于在 PyTorch 中创建新的张量,但它们在功能和用法上有一些区别:
1..clone()
方法:
功能:.clone()
方法创建一个新的张量,该张量与原始张量具有相同的值、形状和梯度信息。
用法:通常用于需要在计算图中保留梯度信息的情况,比如进行反向传播和优化过程。
示例代码:
import torch
x = torch.tensor([1, 2, 3], requires_grad=True)
y = x.clone()
print(x) # 输出: tensor([1, 2, 3], requires_grad=True)
print(y) # 输出: tensor([1, 2, 3], grad_fn=<CloneBackward>)
在这个例子中,y
是通过 .clone()
方法从原始张量 x
创建的,它保留了 x
的梯度信息。
.detach()
方法:
功能:.detach()
方法创建一个新的张量,该张量与原始张量具有相同的值和形状,但不保留任何梯度信息。
对于整数类型的张量,无法使用 requires_grad 参数。如果您需要在整数类型的张量上进行自动微分,请先将其转换为浮点数类型的张量。
用法:通常用于需要从计算图中分离出张量的梯度信息,以便在不需要梯度的情况下进行计算。
示例代码:
import torch
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x.detach()
print(x) # 输出: tensor([1., 2., 3.], requires_grad=True)
print(y) # 输出: tensor([1., 2., 3.])
在这个例子中,y
是通过 .detach()
方法从原始张量 x
创建的,它不保留 x
的梯度信息。
总结区别:
.clone()
创建一个新的张量,并保留原始张量的梯度信息。.detach()
创建一个新的张量,并且不保留原始张量的梯度信息。
所以如果你想共享内存的话,建议使用torch.from_numpy()或者tensor.detach()来新建一个tensor, 二者共享内存。
张量维度
PyTorch 中,size() 方法返回一个元组,表示张量各个维度的大小。torch.size 是tuple对象的子类,因此它支持tuple的所有操作。
x.size()[0] 和 x.size(0) 都用于获取张量第一个维度的大小,即行数。
x.size()[1] 和 x.size(1) 都用于获取张量第二个维度的大小,即列数。
x = t.rand(5, 3)
print(x.size()) # 查看x的形状
print(x.size()[0]) # 查看行的个数
print(x.size(0)) # 查看行的个数
print(x.size()[1]) # 查看列的个数
print(x.size(1)) # 查看列的个数
输出结果为:
torch.Size([5, 3])
5
5
3
3
张量加法
在 PyTorch 中,可以使用 torch.add()
函数或者张量的 add()
方法进行张量加法。两者的功能是类似的,只是使用方式上有所区别。
- 使用
torch.add()
函数
torch.add()
函数的语法如下:
torch.add(input, other, alpha=1, out=