pytorch 中的重要模块化接口nn.Module的使用


Posted in Python onApril 02, 2020

torch.nn 是专门为神经网络设计的模块化接口,nn构建于autgrad之上,可以用来定义和运行神经网络
nn.Module 是nn中重要的类,包含网络各层的定义,以及forward方法

查看源码

初始化部分:

def __init__(self):
  self._backend = thnn_backend
  self._parameters = OrderedDict()
  self._buffers = OrderedDict()
  self._backward_hooks = OrderedDict()
  self._forward_hooks = OrderedDict()
  self._forward_pre_hooks = OrderedDict()
  self._state_dict_hooks = OrderedDict()
  self._load_state_dict_pre_hooks = OrderedDict()
  self._modules = OrderedDict()
  self.training = True

属性解释:

  • _parameters:字典,保存用户直接设置的 Parameter
  • _modules:子 module,即子类构造函数中的内容
  • _buffers:缓存
  • _backward_hooks与_forward_hooks:钩子技术,用来提取中间变量
  • training:判断值来决定前向传播策略

方法定义:

def forward(self, *input):
 raise NotImplementedError

没有实际内容,用于被子类的 forward() 方法覆盖

且 forward 方法在 __call__ 方法中被调用:

def __call__(self, *input, **kwargs):
 for hook in self._forward_pre_hooks.values():
    hook(self, input)
  if torch._C._get_tracing_state():
    result = self._slow_forward(*input, **kwargs)
  else:
    result = self.forward(*input, **kwargs)
  ...
  ...

对于自己定义的网络,需要注意以下几点:

1)需要继承nn.Module类,并实现forward方法,只要在nn.Module的子类中定义forward方法,backward函数就会被自动实现(利用autograd机制)
2)一般把网络中可学习参数的层放在构造函数中__init__(),没有可学习参数的层如Relu层可以放在构造函数中,也可以不放在构造函数中(在forward函数中使用nn.Functional)
3)在forward中可以使用任何Variable支持的函数,在整个pytorch构建的图中,是Variable在流动,也可以使用for,print,log等
4)基于nn.Module构建的模型中,只支持mini-batch的Variable的输入方式,如,N*C*H*W

代码示例:

class LeNet(nn.Module):
  def __init__(self):
    # nn.Module的子类函数必须在构造函数中执行父类的构造函数
    super(LeNet, self).__init__() # 等价与nn.Module.__init__()

    # nn.Conv2d返回的是一个Conv2d class的一个对象,该类中包含forward函数的实现
    # 当调用self.conv1(input)的时候,就会调用该类的forward函数
    self.conv1 = nn.Conv2d(1, 6, (5, 5)) # output (N, C_{out}, H_{out}, W_{out})`
    self.conv2 = nn.Conv2d(6, 16, (5, 5))
    self.fc1 = nn.Linear(256, 120)
    self.fc2 = nn.Linear(120, 84)
    self.fc3 = nn.Linear(84, 10)

  def forward(self, x):
    # F.max_pool2d的返回值是一个Variable, input:(10,1,28,28) ouput:(10, 6, 12, 12)
    x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
    # input:(10, 6, 12, 12)  output:(10,6,4,4)
    x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))
    # 固定样本个数,将其他维度的数据平铺,无论你是几通道,最终都会变成参数, output:(10, 256)
    x = x.view(x.size()[0], -1)
    # 全连接
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = F.relu(self.fc3(x))

    # 返回值也是一个Variable对象
    return x


def output_name_and_params(net):
  for name, parameters in net.named_parameters():
    print('name: {}, param: {}'.format(name, parameters))


if __name__ == '__main__':
  net = LeNet()
  print('net: {}'.format(net))
  params = net.parameters() # generator object
  print('params: {}'.format(params))
  output_name_and_params(net)

  input_image = torch.FloatTensor(10, 1, 28, 28)

  # 和tensorflow不一样,pytorch中模型的输入是一个Variable,而且是Variable在图中流动,不是Tensor。
  # 这可以从forward中每一步的执行结果可以看出
  input_image = Variable(input_image)

  output = net(input_image)
  print('output: {}'.format(output))
  print('output.size: {}'.format(output.size()))

到此这篇关于pytorch 中的重要模块化接口nn.Module的使用的文章就介绍到这了,更多相关pytorch nn.Module内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 字符串split的用法分享
Mar 23 Python
使用Python程序抓取新浪在国内的所有IP的教程
May 04 Python
Python字符串替换实例分析
May 11 Python
Python调用C++程序的方法详解
Jan 24 Python
Python3.5.3下配置opencv3.2.0的操作方法
Apr 02 Python
利用Python如何生成便签图片详解
Jul 09 Python
实例介绍Python中整型
Feb 11 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
深入了解Python iter() 方法的用法
Jul 11 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
python字典的元素访问实例详解
Jul 21 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
Apr 02 #Python
PyTorch中的C++扩展实现
Apr 02 #Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 #Python
Python运行提示缺少模块问题解决方案
Apr 02 #Python
Pycharm配置PyQt5环境的教程
Apr 02 #Python
Python无头爬虫下载文件的实现
Apr 02 #Python
linux 下selenium chrome使用详解
Apr 02 #Python
You might like
相对路径转化成绝对路径
2007/04/10 PHP
YII路径的用法总结
2014/07/09 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
jquery 回车事件实现代码
2011/08/23 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
Vue动态获取width的方法
2018/08/22 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
大学生优秀的自我评价分享
2013/10/22 职场文书
出生公证书样本
2014/04/04 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书