【深度学习】pytorch——神经网络工具箱nn

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~

深度学习专栏链接:
http://t.csdnimg.cn/dscW7

简介

PyTorch神经网络工具箱nn是一个用于构建深度学习模型的核心模块。它提供了一组简单而灵活的API,可以轻松地定义、训练和评估各种类型的神经网络。

nn模块中包含了许多预定义的模块和方法,如线性层、卷积层、循环神经网络、损失函数等,可以直接调用这些模块来构建深度学习模型。以下是nn模块的主要功能:

  1. 定义神经网络模型:可以使用nn模块定义各种类型的神经网络。通过继承nn.Module类,可以创建一个自己的神经网络类,并在其中定义各个层的结构和参数。

  2. 易于使用的层:nn模块提供了各种类型的层,如线性层、卷积层、池化层、归一化层等。这些层已经默认实现了前向传播和反向传播的过程,可以直接使用。

  3. 非线性激活函数:nn模块提供了常见的激活函数,如ReLU、Sigmoid、Tanh等,可以在层之间添加非线性变换。

  4. 自动求导:nn模块基于PyTorch的自动求导机制,可以自动计算梯度并进行反向传播。这使得用户可以更加专注于模型的设计和实现,而不必手动计算梯度。

  5. 训练和优化:可以使用nn模块中的优化器(如SGD、Adam等)来训练模型,并使用预定义的损失函数(如交叉熵、均方误差等)来评估模型的性能。

  6. 序列化和保存:可以使用nn模块中的API将模型序列化为文件,并在需要时恢复模型。

PyTorch神经网络工具箱nn提供了一组简单而灵活的API,可以方便地定义、训练和评估各种类型的神经网络。同时也支持用户自定义的模型和层,使得用户可以根据自己的需求和应用场景创建更加复杂的深度学习模型。

nn.Module

nn.Module是PyTorch中所有神经网络模型的基类。所有用户自定义的神经网络模型都应该继承自nn.Module类,并实现其中的方法。

nn.Module提供了一些重要的属性和方法,使得用户可以方便地定义神经网络的结构和参数,并进行正向传播和反向传播的计算。

以下是nn.Module类的一些重要属性和方法:

  1. __init__(self):构造函数,用于初始化模型的结构和参数。在这个方法中,用户可以定义模型中的各个层,并指定它们的参数。

  2. forward(self, input):前向传播方法。在这个方法中,用户定义了模型的正向传播过程。通过调用各个层的前向传播方法,并对它们的输出进行组合和变换,最终生成模型的输出。

  3. parameters(self):返回模型中所有可学习的参数。这个方法返回一个迭代器,可以用于遍历模型中的所有参数,并进行优化和更新。

  4. to(self, device):将模型移动到指定的设备上,如CPU或GPU。通过这个方法,可以方便地将模型加载到合适的设备上进行计算。

  5. state_dict(self)load_state_dict(self, state_dict):这两个方法用于序列化和加载模型的状态。state_dict()方法返回一个包含模型所有状态的字典,可以将其保存到文件中。而load_state_dict()方法则从给定的字典中加载模型的状态。

  6. train()eval():这两个方法用于设置模型的训练模式和评估模式。在训练模式下,模型会保留一些特定的操作,如Dropout层,在评估模式下会关闭这些操作。

通过继承nn.Module类,并重写其中的方法,用户可以方便地定义自己的神经网络模型。同时,nn.Module还提供了一些实用的方法和功能,如参数管理、设备移动和状态保存等,使得模型的训练和部署变得更加简单和高效。

nn.Module实现全连接层

用nn.Module实现全连接层。全连接层,又名仿射层,输出 y \textbf{y} y和输入 x \textbf{x} x满足 y=Wx+b \textbf{y=Wx+b} y=Wx+b W \textbf{W} W b \textbf{b} b是可学习的参数。

import torch as t
from torch import nn

class Linear(nn.Module): # 继承nn.Module
    def __init__(self, in_features, out_features):
        super(Linear, self).__init__() # 等价于nn.Module.__init__(self)
        self.w = nn.Parameter(t.randn(in_features, out_features))
        self.b = nn.Parameter(t.randn(out_features))
    
    def forward(self, x):
        x = x.mm(self.w) # x.@(self.w)
        return x + self.b.expand_as(x)
    
    
layer = Linear(4,3)
input = t.randn(2,4)
output = layer(input)
print(output)

for name, parameter in layer.named_parameters():
    print(name, parameter) # w and b 

代码解释:
这段代码定义了一个自定义的线性层Linear,它继承自nn.Module类,并重写了其中的__init__forward方法。该层的输入维度为in_features,输出维度为out_features

class Linear(nn.Module): 
    def __init__(self, in_features, out_features):
        super(Linear, self).__init__() 
        self.w = nn.Parameter(t.randn(in_features, out_features))
        self.b = nn.Parameter(t.randn(out_features))
    
    def forward(self, x):
        x = x.mm(self.w) 
        return x + self.b.expand_as(x)

__init__方法中,首先调用父类的构造函数来初始化模型,然后定义了两个参数self.wself.b,它们分别对应于该层的权重矩阵和偏置向量,并将它们标记为可学习的参数。

forward方法中,首先将输入张量x与权重矩阵self.w相乘,然后加上偏置向量self.b,最终得到该层的输出。

接下来,代码创建了一个Linear对象layer,并传入了输入的维度4和输出的维度3。然后定义了一个随机输入张量input,其形状为(2, 4)

layer = Linear(4,3)
input = t.randn(2,4)

最后,将输入张量传入layer对象的forward方法中,得到输出张量output

output = layer(input)

通过print(output)语句打印输出张量output的值,可以查看模型对给定输入的计算结果。

print(output)

此外,代码还使用named_parameters方法遍历了layer对象中的所有参数,并打印了它们的名称和值。可以获取到wb两个参数。

for name, parameter in layer.named_parameters():
    print(name, parameter)

nn.Module实现多层感知机

在这里插入图片描述

import torch as t
from torch import nn

class Linear(nn.Module): # 继承nn.Module
    def __init__(self, in_features, out_features):
        super(Linear, self).__init__() # 等价于nn.Module.__init__(self)
        self.w = nn.Parameter(t.randn(in_features, out_features))
        self.b = nn.Parameter(t.randn(out_features))
    
    def forward(self, x):
        x = x.mm(self.w) # x.@(self.w)
        return x + self.b.expand_as(x)

class Perceptron(nn.Module):
    def __init__(self, in_features, hidden_features, out_features):
        nn.Module.__init__(self)
        self.layer1 = Linear(in_features, hidden_features) # 此处的Linear是自定义的全连接层
        self.layer2 = Linear(hidden_features, out_features)
    def forward(self,x):
        x = self.layer1(x)
        x = t.sigmoid(x)
        return self.layer2(x)
    
perceptron = Perceptron(3,4,1)
for name, param in perceptron.named_parameters():
    print(name, param.size())

代码解释:

首先,定义了一个名为Linear的类,它继承自nn.Module。这个类代表了一个线性层,包含权重参数w和偏置参数b

class Linear(nn.Module):
    def __init__(self, in_features, out_features):
        super(Linear, self).__init__()
        self.w = nn.Parameter(t.randn(in_features, out_features))
        self.b = nn.Parameter(t.randn(out_features))
    
    def forward(self,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zz的学习笔记本

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

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

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

打赏作者

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

抵扣说明:

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

余额充值