美文网首页Python中文社区
Pytorch中的nn.Module,__init__和forw

Pytorch中的nn.Module,__init__和forw

作者: 影森数码科技 | 来源:发表于2020-07-26 22:50 被阅读0次

    在本片文章中,会简单的介绍使用Pytorch构建自己的神经网络框架,所必须的Module类以及类中常用的__ init__和forward函数,希望能够帮助困惑的同学理解一些抽象的概念。

    programme

    Pytorch 基础类 torch.nn.Module

      torc.nn.Module是神经网络模块中的的最基础的类,如果你想通过pytorch构建要给自己的网络框架,那么你构造的模型都会是这个类的子类。Modules 也可以包含其他的模型,允许将他们嵌套在一个树形结构中,你可以将子模型分配为常规属性。
      下面是一个使用Module类为基类简单的构造一个网络模型的小例子:

    import torch.nn as nn  # import导入包模块
    import torch.nn.functional as F
    
    class Model_test(nn.Module):  # 将nn.module作为基类
        def __init__(self):  #构造函数
            super(Model,self).__init__()
            self.conv1 = nn.Conv2d(1,20,5)
            self.conv2 = nn.Conv2d(20,20,5)
    
        def forward(self, x):  
             x = F.relu(self.conv1(1))
             return F.relu(self.conv2(x))
    

    super()函数的作用是什么?
      super()函数在面向对象编程语言中时较为常用的,它使你可以在子类中使用从父类中继承来的方法。super()仅仅是返回超类的一个临时的对象(也叫代理对象),然后允许你调用该超类的方法。
      super()函数的常见的用途是通过构建子类来扩展先前构造的类的功能,从而节省重写子类的这些方法的时间。

      以这种方式分配的子模块也将被注册,当调用to()时,也会转换其参数。


    Module类内部的常用函数

      在自己构造网络架构时,会经常用到一些Module类内部的一些方法,如果你不了解这些方法,它们会成为你理解整个框架架构的运行顺序的一个阻碍。下面会简单介绍一下我对这些常用方法的理解。

    __ init__方法

       init方法类似于C++和Java中的构造函数。其中,构造函数时用于初始化对象状态的一种方法,构造函数的任务就是当一个类的实例被创建时,去初始化(分配值)类中的数据成员。与其它方法类似,构造函数还包含在创建对象时执行的语句(即指令)的集合内部。它在实例化类对象后立即运行。

    在这里为了帮助理解,举一个简单的小例子:

    # a sample class with init method
        class Person:
            # init method or constructor
            def __init__(self,name):
                self.name = name
            
            # Sample Method
            def say_hi(self):
                print("Hello, my name is ", self.name)
    p = Person('Fu')  # 实例化Person类
    print(p.say_hi)
    
    

    输出:

    Hello, my name is Fu
    

       在上面的例子中,一个名字叫Fu的人被创建。在创建人时,将“Fu”作为参数传递,而这个参数会通过类Person的__ init__函数初始化Person对象。在__ init__函数内部的 self 表示类的实例,并将属性与给定的参数进行绑定(这里是绑定的self.name与Fu)。同样,可以通过传递不同的名称作为参数创建Person类的多个对象。

    forward (*input)函数

      首先来看一下pytorch官网对forward函数的定义。
    pytorch官网定义:
      定义在每次调用时执行的计算。应该被所有子类所覆盖。

    注意:尽管需要在此函数中定义向前传递的方法,但应随后调用Module实例,而不是调用此方法,因为前者负责运行已经注册的hooks,而后者则静默地忽略它们。

      这里的hooks,在编程中是指一个地方,通常是打包的代码中提供的接口,它允许程序员插入自定义代码。

      实际上,当把创建的网络模型model当作函数调用的时候,在module内部会自动调用"__ call__"方法,而在call方法的内部会调用module的forward方法。

      例如,下面的代码就会自动的调用Model_test()模型内部的forward函数:

    # 这里接上面哪个例子
    model_ins = Model_test()
    output = model_ins()
    

    总结

      在自己构建网络架构中,时常会遇到一些难易解决的问题,但是面对它们是千万不要把它们想的太复杂。只需要将困难的问题认真分解成一个个小问题,然后依次解决,你会发现令人头疼的问题也会迎刃而解。

      学习的路上虽然孤独,但我会坚持前行!

    相关文章

      网友评论

        本文标题:Pytorch中的nn.Module,__init__和forw

        本文链接:https://www.haomeiwen.com/subject/bjsglktx.html