构建神经网络的基类: torch.nn.Module && Pytorch笔记(十)

(1)本文涉及函数的列表(具体用法和注释在代码之中)

  1. import torch.nn as nn                         # 导入所需的第三方库的模块
  2. nn.Module                                            # 被继承的基类
  3. nn.Conv2d                                           # 定义卷积
  4. self.add_module                                 # 添加卷积(类似于nn.Conv2d)
  5. model.children()                                  # 返回子模块的迭代器
  6. model.modules()                                 # 返回当前模型所有模块的迭代器
  7. model.named_children()                     # 返回子模块名字和模块本身的迭代器
  8. model.named_modules()                    # 返回模块名和模块本身的迭代器
  9. model.parameters()                             # 返回模型所有参数的迭代器

 >>>nn.Module官方注释截图

注:

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

其中,nn.Conv2d 的输入参数解释如下:

  • in_channels(int) – 输入信号的通道
  • out_channels(int) – 卷积产生的通道
  • kerner_size(int or tuple) - 卷积核的尺寸
  • stride(int or tuple, optional) - 卷积步长
  • padding(int or tuple, optional) - 输入的每一条边补充 0 的层数
  • dilation(int or tuple, optional) – 卷积核元素之间的间距
  • groups(int, optional) – 从输入通道到输出通道的阻塞连接数
  • bias(bool, optional) - 如果 bias=True,添加偏置

groups: 控制输入和输出之间的连接, group=1,输出是所有的输入的卷积;group=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这 两个输出连接起来。

 (2)代码示例(含注释)

import torch.nn as nn


# Containers(容器):
# class torch.nn.Module: 所有网络的基类。你的模型也应该继承这个类。
# Modules 也可以包含其它 Modules,允许使用树结构嵌入他们。你可以将子模块赋值给模型属性。
class Model1(nn.Module):
    def __init__(self):
        super(Model1, self).__init__()
        # 定义卷积
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=20, kernel_size=(1, 2))
        self.conv2 = nn.Conv2d(in_channels=20, out_channels=20, kernel_size=(1, 2))


# 通过上面方式赋值的 submodule 会被注册。当调用 .cuda() 的时候,submodule 的参数也会转换为 cuda  Tensor。
model1 = Model1()
print("*"*20, "model1", "*"*20, "\n", model1)


class Model2(nn.Module):
    def __init__(self):
        super(Model2, self).__init__()
        self.add_module("conv3", nn.Conv2d(10, 20, (2, 4)))
        self.add_module("conv4", nn.Conv2d(5, 10, (2, 2)))
        # 等价于 add_module,但是这个是父类,如果重新定义,则会覆盖子类的卷积信息
        # self.conv3 = nn.Conv2d(10, 40, (4, 4))


model2 = Model2()
print("*"*20, "model2", "*"*20, "\n", model2)

# .children(): 返回当前模型 子模块 的迭代器。
print("*"*20, "children", "*"*20)
for sub_module in model2.children():
    print("\n", sub_module)

# .modules(): 返回一个包含 当前模型 所有模块的迭代器,即返回 模型信息 和 所有子模块。
# 注意:重复的模块只被返回一次(children()也是)。
print("*"*20, "all", "*"*20)
for module in model2.modules():
    print("\n", module)

# 返回 包含 模型当前子模块 的迭代器,产生模块名字和模块本身。
print("*"*20, "named_children", "*"*20)
for name, module1 in model2.named_children():
    print("\n", name, module1)

# 返回包含网络中所有模块的迭代器, 产生(yielding)模块名和模块本身。
x, y = [], []
for index, nm in model2.named_modules():
    x.append(index)
    y.append(nm)
print("*"*20, "named_modules", "*"*20, "\n", x, "\n", y)

# 返回一个 包含模型所有参数 的迭代器。
# 随机生成指定尺寸的张量。
print("*"*20, "parameters", "*"*20)
for param in model2.parameters():
    print(type(param.data), "\n", param.size())

>>>output

******************** model1 ******************** 
 Model1(
  (conv1): Conv2d(1, 20, kernel_size=(1, 2), stride=(1, 1))
  (conv2): Conv2d(20, 20, kernel_size=(1, 2), stride=(1, 1))
)


******************** model2 ******************** 
 Model2(
  (conv3): Conv2d(10, 20, kernel_size=(2, 4), stride=(1, 1))
  (conv4): Conv2d(5, 10, kernel_size=(2, 2), stride=(1, 1))
)


******************** children ********************

 Conv2d(10, 20, kernel_size=(2, 4), stride=(1, 1))

 Conv2d(5, 10, kernel_size=(2, 2), stride=(1, 1))


******************** all ********************

 Model2(
  (conv3): Conv2d(10, 20, kernel_size=(2, 4), stride=(1, 1))
  (conv4): Conv2d(5, 10, kernel_size=(2, 2), stride=(1, 1))
)

 Conv2d(10, 20, kernel_size=(2, 4), stride=(1, 1))

 Conv2d(5, 10, kernel_size=(2, 2), stride=(1, 1))


******************** named_children ********************

 conv3 Conv2d(10, 20, kernel_size=(2, 4), stride=(1, 1))

 conv4 Conv2d(5, 10, kernel_size=(2, 2), stride=(1, 1))


******************** named_modules ******************** 
 ['', 'conv3', 'conv4'] 
 [Model2(
  (conv3): Conv2d(10, 20, kernel_size=(2, 4), stride=(1, 1))
  (conv4): Conv2d(5, 10, kernel_size=(2, 2), stride=(1, 1))
), Conv2d(10, 20, kernel_size=(2, 4), stride=(1, 1)), Conv2d(5, 10, kernel_size=(2, 2), stride=(1, 1))]


******************** parameters ********************
<class 'torch.Tensor'> 
 torch.Size([20, 10, 2, 4])
<class 'torch.Tensor'> 
 torch.Size([20])
<class 'torch.Tensor'> 
 torch.Size([10, 5, 2, 2])
<class 'torch.Tensor'> 
 torch.Size([10])

    >>>如有疑问,欢迎评论区一起探讨 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 第1关:torch.nn.module torch.nn.modulePyTorch中的一个基类,用于定义神经网络模型。它提供了许多有用的方法和属性,例如parameters()和zero_grad(),可以方便地管理模型的参数和梯度。我们可以通过继承torch.nn.module来定义自己的神经网络模型,并在训练过程中使用它们。 ### 回答2: 第1关:torch.nn.module torch.nn.modulePyTorch 中用于构建神经网络模型的基类。每个神经网络模型都是由多个层(layer)组成的,每个层都是由不同的参数(如权重和偏置)构成的,并且需要进行训练以优化这些参数,以使其在给定任务上表现最佳。 torch.nn.module 提供了各种方法和属性来管理这些网络层和参数,使得模型的设计、构建、训练和评估变得非常简单。在这个基类中,所有的子层都可以通过访问 nn.Module 的属性和方法来获取和访问其参数,同时也可以轻松地控制它们的训练过程。 在构建神经网络时,你需要继承 nn.Module 并定义模型的前向传递函数 forward。在 forward 函数中,你可以将网络的多个层连接在一起来执行特定的计算,从而生成模型的输出。同时,你还需要在 __init__ 函数中定义所有层和参数,并将它们设置为 nn.Parameter 或 nn.ModuleList 对象。这将使你可以使用 nn.Module 的方法来访问、管理和训练它们。 对于每次前向传递,nn.Module 的对象都会自动调用各个层的 forward 函数,并沿着网络的方向反向传播误差,以更新参数和优化模型。在训练过程中,你还可以指定不同的优化方法和损失函数来优化模型的性能,以使模型可以更高效地学习并适应数据。 总之,torch.nn.modulePyTorch构建深度神经网络模型的基础,提供了一种非常灵活和易用的方式来设计、构建、训练和评估神经网络,在实现复杂的模型时非常实用。 ### 回答3: PyTorch中的torch.nn.module深度学习中常见的模型组件,它是构建神经网络的基本组件。torch.nn.modulePyTorch中被广泛使用,可以用于创建各种深度学习模型,如卷积神经网络、循环神经网络、transformer等。 torch.nn.module的主要作用是简化神经网络构建过程。它对于神经网络构建提供了更高层次的抽象,可以仅使用少量的代码来搭建复杂的神经网络。使用torch.nn.module可以更加方便地管理网络中的参数、权重以及偏置项。 当使用torch.nn.module的时候,需要将每个层或者组件写成一个继承自nn.ModulePython类。每个继承自nn.Module的类都必须实现init函数和forward函数。init函数用于初始化模型层的参数,forward函数定义了模型的前向传播过程。 除了init和forward函数,nn.Module还具有其他常用的方法和属性。其中包括paramters方法,它可以用于获取所有模型层的权重和偏置项;zero_grad方法,用于将所有的梯度清零;还包括train和eval方法,可以用于控制模型处于训练或者评估状态。 总之,torch.nn.modulePyTorch中非常重要的组件,在深度学习中被广泛应用。它的抽象级别可以使得深度学习构建变得更加简单和快捷,同时还提供了方便的参数管理和训练流程管理方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Flying Bulldog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值