PyTorch学习笔记(二)——torch.nn解析

PyTorch 中神经网络库torch.nn的详细介绍 torch.nn是 PyTorch 深度学习框架中的一个核心模块,它为构建和训练神经网络提供了丰富的类库。通过torch.nn,开发者能够快速构建复杂的深度学习模型,并利用 PyTorch 动态计算图特性进行高效训练和推理。此外,该模块还与torch.optim配合,方便地进行权重优化;以及与DataLoader结合以组织和迭代训练数据。 阅读详情

PyTorch提供了方便漂亮的类和模块,来帮助我们创建和训练神经网络,例如 torch.nn, torch.optim 等。
为了更好地理解这些模块的功能和原理,我们在手动搭建的神经网络上,逐步添加这些模块,以显示每部分模块的功能,以及每部分是如何让代码更加灵活简洁的。

1、手动搭建神经网络

使用MNIST数据集,该数据集共有50000个图片,每一图片大小为2828,储存在长度为2828=784的扁平行。

#定义权重和偏执值,需要requires_grad=True,以便自动计算梯度,完成反馈
weights = torch.randn(784, 10,requires_grad=True)
bias = torch.zeros(10, requires_grad=True)

#定义激活函数
def log_softmax(x):
    return x - x.exp().sum(-1).log().unsqueeze(-1)
    
#定义神经网络运算过程,其中@表示点乘
def model(xb):
    return log_softmax(xb @ weights + bias)

#定义代价函数
def nll(input, target):
    return -input[range(target.shape[0]), target].mean()
loss_func = nll

#验证结果的准确性
def accuracy(out, yb):
    preds = torch.argmax(out, dim=1)
    return (preds == yb).float().mean()

#获取一批数据,验证预测的结果:
bs = 64                  # batch size
xb = x_train[0:bs]       # a mini-batch from x
yb = y_train[0:bs]
preds = model(xb)        # predictions
print(preds[0], preds.shape)
print(loss_func(preds, yb))
print(accuracy(preds, yb))
输出:
tensor([-1.7022, -3.0342, -2.4138, -2.6452, -2.7764, -2.0892, -2.2945, -2.5480, -2.3732, -1.8915], grad_fn=<SelectBackward>) torch.Size([64, 10])
tensor(2.3783, grad_fn=<NegBackward>)
tensor(0.0938)
#因为现在的权重和偏置值是随即取得的,所以预测结果并不好

#定义更新权值的训练函数
def fit():
	lr = 0.5 
	epochs = 2 
	for epoch in range(epochs):
	  for i in range((n - 1) // bs + 1):
	     #set_trace()
	      start_i = i * bs
	      end_i = start_i + bs
	      xb = x_train[start_i:end_i]
	      yb = y_train[start_i:end_i]
	      pred = model(xb)
	      loss = loss_func(pred, yb)
	
	      loss.backward()
	      with torch.no_grad():
	          weights -= weights.grad * lr
	          bias -= bias.grad * lr
	          #每次迭代之后,需要将梯度还原为零,否则loss.backward() 将梯度增加到已经存在的值上,而不是替代它
	          weights.grad.zero_()
	          bias.grad.zero_()

fit()
print(loss_func(model(xb), yb), accuracy(model(xb), yb))
输出:
tensor(0.0806, grad_fn=<NegBackward>) tensor(1.)
#准确度明显提高

现在已经手动定义了一个小型的神经网络,每次迭代,将会进行以下几件事情:

  • 选择一批数据(mini-batch)
  • 使用模型进行预测
  • 计算损失 loss.backward()
  • 更新模型的梯度,即权重和偏置

2、使用 torch.nn.functional重构代码

我们现在来重构代码,代码的功能和前边的一样,我们只是利用PyTorch 的 nn 类来使得代码更简洁和灵活。
torch.nn.functional 中的函数可以替代我们手工编写的激活函数和损失函数来缩短代码。
该模块包含 torch.nn 库中所有的函数(而库的其他部分还包含类)。
除了各种损失函数和激活函数,在还模块中你还可以发现许多用于创建神经网络的方便的函数,如池化函数等。

如果使用了负对数似然损失函数和 log softnax 激活函数,那么 Pytorch 提供的torch.nn.functional.cross_entropy 结合了两者。
所以我们甚至可以从我们的模型中移除激活函数。

#传统写法:
#定义激活函数
def log_softmax(x):
    return x - x.exp().sum(-1).log().unsqueeze(-1)   
#定义神经网络运算过程,其中@表示点乘
def model(xb):
    return log_softmax(xb @ weights + bias)
#定义代价函数
def nll(input, target):
    return -input[range(target.shape[0]), target].mean()
loss_func = nll

#优化写法:
import torch.nn.functional as F
loss_func = F.cross_entropy
def model(xb):
    return xb @ weights + bias

注意,在 model 函数中我们不再需要调用 log_softmax。让我们确认一下,损失和精确度与前边计算的一样:

print(loss_func(model(xb), yb), accuracy(model(xb), yb))
tensor(0.0806, grad_fn=<NllLossBackward>) tensor(1.)

3、使用 nn.Module 重构代码

可以通过继承 nn.Module(它本身是一个类并且能够跟踪状态)建立神经网络。
我们想要建立一个包含权重、偏置和前向传播的方法的类。
nn.Module 拥有许多我们将会使用的属性和方法(例如:.parameters() 和.zero_grad())

#之前写法:
#定义权重和偏执值,需要requires_grad=True,以便自动计算梯度,完成反馈
weights = torch.randn(784, 10,requires_grad=True)
bias = torch.zeros(10, requires_grad=True)
#定义激活函数
def log_softmax(x):
    return x - x.exp().sum(-1).log().unsqueeze(-1)   
#定义神经网络运算过程,其中@表示点乘
def model(xb):
    return log_softmax(xb @ weights + bias)
#定义代价函数
def nll(input, target):
    return -input[range(target.shape[0]), target].mean()
loss_func = nll

优化写法:
from torch import nn
import torch.nn.functional as F
loss_func = F.cross_entropy
class Mnist_Logistic(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(784, 10))
        self.bias = nn.Parameter(torch.zeros(10))
    def forward(self, xb):
        return xb @ self.weights + self.bias
#之前需要按名字更新每个参数的值,并且手动将每个参数的梯度归零:
loss.backward()
with torch.no_grad():
    weights -= weights.grad * lr
    bias -= bias.grad * lr
    #每次迭代之后,需要将梯度还原为零,否则loss.backward() 将梯度增加到已经存在的值上,而不是替代它
    weights.grad.zero_()
    bias.grad.zero_()

#可以利用 model.paremeters() 和 model.zero_grad() 使得这些步骤更简洁
model = Mnist_Logistic()
loss.backward()
with torch.no_grad():
    for p in model.parameters(): p -= p.grad * lr
    model.zero_grad()

4、使用 nn.Linear 重构代码

使用PyTorch 的 nn.Linear 类建立一个线性层,以替代手动定义和初始化 self.weights 和 self.bias、计算 xb @ self.weights + self.bias 等工作

#之前写法:
class Mnist_Logistic(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(784, 10))
        self.bias = nn.Parameter(torch.zeros(10))
    def forward(self, xb):
        return xb @ self.weights + self.bias

#优化写法:
class Mnist_Logistic(nn.Module):
    def __init__(self):
        super().__init__()
        self.lin = nn.Linear(784, 10)
    def forward(self, xb):
        return self.lin(xb)

5、使用 optim 重构代码

PyTorch还有一个包含各种优化算法的包 torch.optim 。
我们可以使用优化器中的 step 方法来执行训练更新参数的步骤,而不是手动更新参数。

#之前写法:
for epoch in range(epochs):
	for i in range((n - 1) // bs + 1):
	    start_i = i * bs
	    end_i = start_i + bs
	    xb = x_train[start_i:end_i]
	    yb = y_train[start_i:end_i]
	    pred = model(xb)
	    loss = loss_func(pred, yb)
	
	    loss.backward()
	    with torch.no_grad():
	        for p in model.parameters():
	            p -= p.grad * lr
	        model.zero_grad()

优化写法:
for epoch in range(epochs):
    for i in range((n - 1) // bs + 1):
        start_i = i * bs
        end_i = start_i + bs
        xb = x_train[start_i:end_i]
        yb = y_train[start_i:end_i]
        pred = model(xb)
        loss = loss_func(pred, yb)

        loss.backward()
        opt.step()
        opt.zero_grad()

参考博文https://blog.youkuaiyun.com/Spring_24/article/details/100128412

PyTorch `nn.functional` 模块详解:探索神经网络的魔法工具箱 欢迎来到这篇关于PyTorch 模块的博客!如果你正在学习深度学习或者对于如何更好地构建神经网络感到好奇,那么你来对地方了。本文将深入探讨 模块的作用、常用的函数以及如何在PyTorch中使用它们来构建和定制神经网络。 是PyTorch中一个重要的模块,它包含了许多用于构建神经网络的函数。与 不同, 中的函数不具有可学习的参数。这些函数通常用于执行各种非线性操作、损失函数、激活函数等。这个模块的主要优势是它的计算效率和灵活性,因为它允许你以函数的方式直接调用这些操作,而不需要创建额外的层。在接下来的部分中 阅读详情

相关推荐

torch.nn

torch.nn是 PyTorch 提供的一个模块化工具集,专为构建和训练神经网络设计。模块化:通过nn.Module基类,用户可以像搭积木一样组合各种层、激活函数和损失函数,构建复杂模型。动态计算图:PyTorch 的动态计算图(eager execution)允许在运行时定义和修改网络结构,适合研究和快速原型开发。灵活性与控制力:用户可以轻松自定义层、损失函数或前向传播逻辑,同时保留对底层张量操作的访问权限。易用性。

Rhett_Butler0922的博客 1907

pytorch深度学习框架—torch.nn模块(一)

torch.nn模块中包括了pytorch中已经准备好的层,方便使用者调用构建的网络。包括了卷积层,池化层,激活函数层,循环层,全连接层。

xiaoxu的博客 4864

pytorch中的torch.nn.Unfold和torch.nn.Fold

pytorch中的torch.nn.Unfold和torch.nn.Fold目的Unfold 目的 平时使用卷积操作时,既卷积核滑动窗口操作,对于pytorch,以二维图像为例,调用nn.Conv2d就能完成对输入(feature maps)的卷积操作。 但有时,maybe要探究卷积核对应的某一channel的单个窗口的卷积操作,或显式地进行卷积操作。此时,就需要nn.Unfold和nn.Fold。前段时间引起较大争议的BagNet(Bag of local feature net)的分块卷积操作既由此函数

春笋的博客 2万+

机器学习&&深度学习——torch.nn模块

机器学习&&深度学习——torch.nn模块

m0_52380556的博客 3040

Pytorch torch.nn库以及nn与nn.functional有什么区别?

Pytorch torch.nn库以及nn与nn.functional有什么区别?

算法工程师 1084

ANSYS Discovery 2023R1 保姆级教程:手把手教你玩转几何模型参数化(附避坑指南)

本文提供ANSYS Discovery 2023R1几何模型参数化的全面教程,涵盖基础环境搭建、核心操作解析及高级应用场景。重点讲解参数化建模中的常见问题与避坑方案,帮助用户高效掌握Workbench与Discovery的协同使用技巧,提升工程仿真效率。

weixin_29204205的博客 749

Pytorch笔记 之 torch.nn 模块简介

参考翻译 [What is torch.nn really?](https://pytorch.org/tutorials/beginner/nn_tutorial.html) 主要是对 PyTorch 框架的各模块进行简要介绍 一定程度上是 PyTorch 的入门笔记 假设已经对神经网络相关基础知识有了一定了解 (或实现过机器学习梯度下降相关代码)

子耶 6万+

Social-Auto-Upload实战:如何用Python+Playwright实现抖音/B站/小红书一键三连发?

本文详细介绍了如何使用Python和Playwright框架构建Social-Auto-Upload自动化上传工具,实现抖音、B站、小红书等平台的一键多发布。通过模拟真实用户操作和Cookie管理技术,该工具能有效解决内容创作者跨平台发布的重复劳动问题,提升工作效率。

day7的博客 1400

深入理解 TORCH.NN

原文地址:WHAT IS TORCH.NN REALLY? 本人英语学渣,如有错误请及时指出以便更正 pytorch提供了许多优雅的类和模块帮助我们构建与训练网络,比如 torch.nn, torch.optim,Dataset等。为了充分利用这些模块的功能,灵活操作它们解决各种不同的问题,我们需要更好地理解当我们调用这些模块时它们到底干了些什么,为此,我们首先不调用这些模块实现MNIST手写字...

我的学习笔记 3万+

二阶高通滤波器硬件设计:5种RC到有源方案对比与选型

在传感器前端和音频信号调理中,二阶高通滤波器是抑制直流偏移与低频干扰的关键模块。其设计核心围绕截止频率、品质因数Q、增益与噪声四个指标展开,其中Q值决定滤波器在转折频率附近的响应形状,如Butterworth最大平坦响应需Q=0.707。从纯无源RC电路到引入运放的有源拓扑,演变逻辑在于解决负载效应、提供增益并借助反馈提升Q值。实际工程中,RC级联、VCVS(Sallen-Key)、状态变量及回转器模拟电感等方案各有适用场景:RC电路简单但Q值受限,Sallen-Key单运放即可实现高Q,状态变量适合Q值独

weixin_32770423的博客 97

【高等数值分析】Krylov子空间方法

文章目录1. 预备理论1.1 Krylov 子空间1.2 最佳逼近1.2.1 方法一:最佳平方逼近1.2.2 方法二:假设 AAA 对称正定1.2.3 方法三:残差2范数2. 基底正交化2.1 Arnoldi 过程(CGS)2.2 改进 Arnoldi 过程(MGS)2.3 Lanczos过程3. 方程组求解3.1 全正交方法 (FOM)3.2 D-Lanczos方法3.3 广义极小残量法(GMRES)3.4 MINRES 方法 1. 预备理论 现在需要求解一个大规模稀疏方程组 Ax=bAx=bAx=b,可

Glooow的博客 1万+

PyTorch 笔记(16)— torch.nn.Sequential、torch.nn.Linear、torch.nn.RelU

PyTorch 中的 torch.nn 包提供了很多与实现神经网络中的具体功能相关的类,这些类涵盖了深度神经网络模型在搭建和参数优化过程中的常用内容,比如神经网络中的卷积层、池化层、全连接层这类层次构造的方法、防止过拟合的参数归一化方法、Dropout 方法,还有激活函数部分的线性激活函数、非线性激活函数相关的方法,等等。 下面使用 PyTorch 的 torch.nn 包来简化我们之前的代码,开始部分的代码变化不大,如下所示: import torch as t batch_n = 100 input_

wohu1104的专栏 1万+

Python RPA 流程自动化快速上手

Python RPA 流程自动化快速上手

看花容易绣花难 1万+

PyTorch中的torch.nn.Parameter() 详解

PyTorch中的torch.nn.Parameter() 详解 今天来聊一下PyTorch中的torch.nn.Parameter()这个函数,笔者第一次见的时候也是大概能理解函数的用途,但是具体实现原理细节也是云里雾里,在参考了几篇博文,做过几个实验之后算是清晰了,本文在记录的同时希望给后来人一个参考,欢迎留言讨论。 分析 先看其名,parameter,中文意为参数。我们知道,使用PyTorch训练神经网络时,本质上就是训练一个函数,这个函数输入一个数据(如CV中输入一张图像),输出一个预测(如输出这张

weixin_44966641的博客 8万+

三极管特性曲线看不懂?手把手教你用Multisim仿真分析放大电路频率响应

本文针对模拟电路初学者,详细讲解如何利用Multisim软件进行电路仿真,将抽象的三极管特性曲线与放大电路频率响应分析变得直观可视。通过手把手教学,指导读者从导入三极管SPICE模型、仿真输出特性曲线,到分析动态工作点,最终使用波特图仪深入分析频率响应并进行补偿设计,有效帮助理解电路原理并指导实践调试。

weixin_29230059的博客 122

VMware Horizon 8 2111 部署系列(九)创建即时克隆桌面池

即时克隆桌面池是在 vCenter Server 中使用 vmFork 技术(称为即时克隆 API)从最佳配置映像创建的自动桌面池。即时克隆共享同一个基础映像虚拟机,使用基础映像虚拟机的快照创建的,它使用的存储空间也少于完整虚拟机。 即时克隆始终保持开机状态,并在注销后从当前发布的映像重新创建。...

白昼的技术专栏 4042

torch.nn.Parameter理解

Pytorch官网对torch.nn.Parameter()的解释: torch.nn.Parameter是继承自torch.Tensor的子类,其主要作用是作为nn.Module中的参数使用。它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,即加入到parameter()这个迭代器中去;而module中非nn.Parameter()得普通te...

Stoneplay 4万+

2025年华为杯中国研究生数学建模竞赛C题 围岩裂隙精准识别与三维模型重构 思路+代码

report += f"**位置 {i+1}**: ({loc[0]:.1f}, {loc[1]:.1f}, {loc[2]:.1f})\n"# ==================== 高级U-Net模型 ====================# ==================== 数据预处理与增强 ====================# ==================== 采样方法比较分析 ====================

YOLO 1527

torch.nn到底是什么?

PyTorch提供了设计优雅的模块和类:torch.nn,torch.optim,Dateset和DataLoader,以帮助你创建和训练神经网络。为了充分利用它们的功能并且为你的问题定制它们,你需要正真理解它们在做什么。为了逐渐理解,我们首先在MNIST数据集上训练基本的神经网络,而不使用这些模块的任何特征。最初只会使用最基本的PyTorch tensor功能。然后,我们逐步添加来自torch....

Spring_24的博客 2万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Pytorch之torch.nn.functional.pad函数详解

torch.nn.functional.pad函数是PyTorch内置的矩阵填充函数 (1).tensor进行padding torch.nn.functional.pad(input, pad, mode,value ) Args: """ input:四维或者五维的tensor Variabe pad:不同Tensor的填充方式 1.四维Tensor:传入四元素tuple(pad_...

sinat_36618660的博客 4万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【pytorch】torch.nn 与 torch.nn.functional 的区别

在初学Pytorch 创建模型的时候,总会出现不知道要把layer放在 __init__下还是 torch.nn torch.nn 这个大模块下面存的主要是 Module类, 也就是说 torch.nn.Conv2d这种其实是个 Module类,在类中初始化了 torch.nn.functional ...

One Way的博客 9819

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

PyTorch里面的torch.nn.Parameter()

PyTorch里面的torch.nn.Parameter() 在看过很多博客的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),首先可以把这个函数理解为类型转换函数,将一个不可训练的类型Tensor转换成可以训练的类型parameter并将这个parameter绑定到这个module里面(net.param...

qq_36955294的博客 4万+

pytorch的自定义拓展之(一)——torch.nn.Module和torch.autograd.Function

前言:pytorch的灵活性体现在它可以任意拓展我们所需要的内容,前面讲过的自定义模型、自定义层、自定义激活函数、自定义损失函数都属于pytorch的拓展,这里有三个重要的概念需要事先明确。要实现自定义拓展,有两种方式, (1)方式一:通过继承torch.nn.Module类来实现拓展。这也是我们前面的例子中所用到的,它最大的特点是以下几点: 包装torch普通函数和torch.nn...

MIss-Y的博客 1万+

torch.nn到底是什么?(精简版)

此文为《torch.nn到底是什么?》的总结版。 首先创建基本的神经网络,然后逐步添加torch.nn,torch.optim,Dateset 和 DataLoader的功能,以显示每一部分的具体作用。 1、设置MNIST数据 使用经典的 MNIST 数据集,该数据集由手写数字(0-9)的黑白图像组成。 使用 pathlib 来处理路径(Python3标准库的一部分),用 requests 下载数...

Spring_24的博客 1万+

【pytorch】torch.nn.Linear详解

在学习transformer时,遇到过非常频繁的nn.Linear()函数,这里对nn.Linear进行一个详解。 参考:https://pytorch.org/docs/stable/_modules/torch/nn/modules/linear.html 概要 1. nn.Linear的原理:2. nn.Linear的使用:3. nn.Linear的源码定义:4. nn.Linear的官方源码: 1. nn.Linear的原理: 从名称就可以看出来,nn.Linear表示的是线性变换,原型就是初级数学

sazass的博客 6万+

深度学习之pytorch 中 torch.nn介绍

pytorch 中必用的包就是 torch.nn,torch.nn 中按照功能分,主要如下有几类:1. Layers(层):包括全连接层、卷积层、池化层等。2. Activation Functions(激活函数):包括ReLU、Sigmoid、Tanh等。3. Loss Functions(损失函数):包括交叉熵损失、均方误差等。4. Optimizers(优化器):包括SGD、Adam、RMSprop等。

qinbaby的专栏 2892
上一篇: Python学习笔记(一)——super()函数
下一篇: Python学习笔记(二)——enumerate()函数
Candyerer
博客等级 码龄7年 20粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值