Python中文社区

Pytorch中的nn.Module,__init__和forw

2020-07-26  本文已影响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()

总结

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

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

上一篇下一篇

猜你喜欢

热点阅读