【代码阅读】机器学习和人工智能相关代码阅读笔记(持续更新)

torch.nn

在 PyTorch 中,torch.nn 模块是神经网络构建的核心模块之一,它提供了构建神经网络模型所需的各种工具和类。nn 是 “neural networks” 的缩写,这个模块包含了各种神经网络层、损失函数、优化器以及一些用于模型构建和训练的辅助函数。

常用的类和函数

使用 torch.nn 模块可以方便地构建、训练和评估各种类型的神经网络模型,是 PyTorch 中非常重要的一个组成部分。
下面是一些 torch.nn 模块中常用的类和函数:

神经网络层(Layers)

线性层(torch.nn.Linear)
卷积层(torch.nn.Conv2d、torch.nn.ConvTranspose2d 等)
循环神经网络层(torch.nn.RNN、torch.nn.LSTM、torch.nn.GRU 等)
池化层(torch.nn.MaxPool2d、torch.nn.AvgPool2d 等)

激活函数(Activation Functions)

ReLU(torch.nn.ReLU)
Sigmoid(torch.nn.Sigmoid)
Tanh(torch.nn.Tanh)

损失函数(Loss Functions)

均方误差(torch.nn.MSELoss)
交叉熵(torch.nn.CrossEntropyLoss)
负对数似然(torch.nn.NLLLoss)

优化器(Optimizers)

随机梯度下降(torch.optim.SGD)
Adam(torch.optim.Adam)
RMSProp(torch.optim.RMSprop

模型容器(Model Containers)

torch.nn.Sequential,它可以按顺序将多个层组合成一个神经网络模型。

torch.optim

在 PyTorch 中,torch.optim 模块提供了各种优化算法的实现,用于训练神经网络模型时更新模型参数。优化算法在神经网络训练中起着至关重要的作用,帮助模型在训练过程中逐步优化以降低损失函数的值。
使用 torch.optim 模块可以方便地应用各种优化算法来训练神经网络模型,从而提高模型在任务上的性能。

常见的优化算法

torch.optim 模块中包含了许多常用的优化器,常见的优化算法包括:

随机梯度下降(SGD)

torch.optim.SGD

带动量的随机梯度下降(SGD with momentum)

torch.optim.SGD 中设置 momentum 参数

Adam

torch.optim.Adam

AdaGrad

torch.optim.Adagrad

RMSprop

torch.optim.RMSprop

AdamW

torch.optim.AdamW(Adam 的一种变体,加入了权重衰减)

L-BFGS

torch.optim.LBFGS(Limited-memory BFGS,适用于较小规模的问题)

每个优化器都有自己的一组参数,例如学习率、动量系数、权重衰减等。在使用优化器时,通常需要传入模型的参数和相应的参数设置。

torch.autograd

在 PyTorch 中,torch.autograd 模块提供了自动求导(automatic differentiation)的功能,这是 PyTorch 的核心特性之一。自动求导使得在神经网络的训练过程中能够自动计算梯度,从而可以使用梯度下降等优化算法来更新模型参数。

torch.autograd 模块中的核心类是 torch.Tensor,它是 PyTorch 中表示张量的主要数据结构。当你对一个张量进行操作时,PyTorch 会自动构建一个计算图(computation graph),记录所有的计算操作。然后,通过调用张量的 .backward() 方法,可以自动计算所有叶子节点(leaf nodes)的梯度,并将梯度存储在相应的张量的 .grad 属性中。

主要功能

自动求导功能使得 PyTorch 成为了一个非常灵活和易用的深度学习框架,简化了神经网络模型的开发和调试过程。
torch.autograd 的主要功能包括:

计算图(Computation Graph)

PyTorch 使用动态计算图,每次前向传播时都会构建一个新的计算图。这使得可以使用控制流(如条件语句、循环)来构建复杂的模型。

梯度计算(Gradient Computation)

调用 .backward() 方法可以自动计算叶子节点的梯度,并将梯度存储在相应的张量的 .grad 属性中。

梯度累积(Gradient Accumulation)

可以多次调用 .backward() 方法来累积梯度,通常在训练循环中使用。

禁用梯度跟踪(Disable Gradient Tracking)

通过将代码块包装在 torch.no_grad() 上下文管理器中,可以禁用梯度跟踪,使得在该代码块中的计算不会被记录到计算图中,从而节省内存和计算资源。

torch.autograd.Variable

在旧版本的 PyTorch 中,torch.autograd.Variable 类是自动求导机制的核心组件之一。它是一个包装了张量(Tensor)的容器,同时包含了张量的梯度信息。Variable 在 PyTorch 0.4.0 之后已经被废弃,不再推荐使用,而是直接使用张量(Tensor)对象。

在旧版本的 PyTorch 中,你可以将张量通过 Variable 进行包装,然后对 Variable 进行操作,自动求导会跟踪这些操作并计算梯度。例如:

import torch
from torch.autograd import Variable

# 创建一个张量
tensor = torch.tensor([2.0], requires_grad=True)

# 将张量包装成 Variable
variable = Variable(tensor)

# 进行一些操作
result = variable * 3

# 反向传播,计算梯度
result.backward()

# 输出梯度
print(tensor.grad)

在上面的例子中,tensor.grad 将会输出对应的梯度值。

然而,从 PyTorch 0.4.0 开始,Variable 被标记为过时(deprecated),而直接使用张量对象即可实现同样的自动求导功能。所以在新版本的 PyTorch 中,不再需要使用 Variable,而是直接使用张量对象即可。

torch.device

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

这行代码是用来创建一个 PyTorch 的设备对象(device object)。它的作用是根据系统中是否有可用的 CUDA 设备(NVIDIA 的 GPU)来选择将张量放置在 GPU 上还是 CPU 上。

具体来说,这行代码做了以下几件事情:

  1. torch.cuda.is_available() 函数用来检查系统中是否有可用的 CUDA 设备(GPU)。
  2. 如果有可用的 CUDA 设备,则创建一个 CUDA 设备对象,并将其赋值给 device 变量;否则,创建一个 CPU 设备对象,并将其赋值给 device 变量。

这样做的目的是为了方便在不同的硬件环境中运行 PyTorch 代码,以实现更快的计算速度。通常情况下,如果你有一块 NVIDIA 的 GPU,并且安装了 CUDA 工具包和相应的 GPU 驱动,那么 torch.cuda.is_available() 将返回 True,代码将使用 GPU 进行计算;否则,将使用 CPU 进行计算。

一旦创建了设备对象 device,你可以将张量移动到该设备上,例如:

# 创建一个张量,并将其移动到设备上
tensor = torch.tensor([1, 2, 3]).to(device)

这样,张量 tensor 就被放置在了根据系统情况选择的设备(GPU 或 CPU)上进行计算。

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bosenya12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值