Pytorch中的nn.Module,__init__和forw
在本片文章中,会简单的介绍使用Pytorch构建自己的神经网络框架,所必须的Module类以及类中常用的__ init__和forward函数,希望能够帮助困惑的同学理解一些抽象的概念。
![](https://img.haomeiwen.com/i24130302/0a1517e2a0310b0d.jpeg)
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()
总结
在自己构建网络架构中,时常会遇到一些难易解决的问题,但是面对它们是千万不要把它们想的太复杂。只需要将困难的问题认真分解成一个个小问题,然后依次解决,你会发现令人头疼的问题也会迎刃而解。
学习的路上虽然孤独,但我会坚持前行!