本篇文章主要是用来学习大工程的构造,具体包括如何进行init和forward,如何层层递进,高层设置输入,传入底层的input中。

从train_val.py中的初始化vgg开始,这里调用了vgg的初始化,嵌套faster_rcnn初始化,再内嵌套调用rpn初始化,调anchor_target_layer/prosal_layer的初始化。

其中faster_rcnn的forward函数中,利用self调用了顶层vgg的函数,如base_feat = self.RCNN_base(im_data),这里返回了基础rcnn之后的共享卷进层。而RCNN_base的定义则是在vgg的_init_modules(self)当中。注意到在train_val.py中应当先是执行了vgg的_init_modules(self),再进行fasterRCNN的传入数据,因为fasterRCNN的forward需要vgg当中的init_modules.


init调用层次

从trian_val.py开始:

fasterRCNN = vgg16(imdb.classes, pretrained=True, class_agnostic=args.class_agnostic)#调用的vgg的init

再看vgg的init,vgg里的self是第一层的self

class vgg16(_fasterRCNN):#因为_fasterRCNN不是一个基类,vgg16涉及三代,不能super,需要单独 init vgg16的父类
  def __init__(self, classes, pretrained=False, class_agnostic=False):
    #没有super
    _fasterRCNN.__init__(self, classes, class_agnostic)#
单独init它的父类 调用了_fasterRCNN的init

再看_fasterRCNN的init,_fasterRCNN里的self是第二层的self

class _fasterRCNN(nn.Module):#nn.Module是基类,直接super初始化_fasterRCNN父类Module
    def __init__(self, classes, class_agnostic):
        super(_fasterRCNN, self).__init__()#
先执行它的父类的init模块的意思 初始化了nn.Module  
        self.RCNN_rpn = _RPN(self.dout_base_model) #初始化_RPN dout_base_model 512 vgg.py
        self.RCNN_proposal_target = _ProposalTargetLayer(self.n_classes) #初始化_ProposalTargetLayer

然后一直初始化下去。


还有一个细节值得注意,就是_fasterRCNN.py中 有self.RCNN_cls_score但是RCNN_cls_score在该python中完全没有定义(在顶层中定义即vgg中),而且_init_modules也是一样都在顶层中定义,总结:顶层的function(self),可以直接在底层中self.function() :比方说是在faster_rcnn.py中

 #权重初始化def _init_weights(self):......normal_init(self.RCNN_rpn.RPN_Conv, 0, 0.01, cfg.TRAIN.TRUNCATED)normal_init(self.RCNN_cls_score, 0, 0.01, cfg.TRAIN.TRUNCATED)#因为该函数是在trian_val中直接调用,RCNN_cls_score是在vgg中定义,是第一层self,所以直接self.RCNN_cls_score。def create_architecture(self):self._init_modules()#顶层的function(self),可以直接在底层中self.function()self._init_weights()#权重初始化

self._init_modules() #模型初始化 _init_modules()的函数不在本py中,而在vgg当中 。这是因为对于不同的模型,比如换成resnet它的模型的初始化就不一样了,所以模型初始化放到了,vgg,resnet这些python当中。而从上一个例子上可以看出来,trian_val的init就是直接用的vgg的,所以vgg里的self就是第一层self,faster_rcnn是第二层,rpn是第三层的。而create_architecture调用,是在 trian_val.py fasterRCNN = vgg16(...)之后,紧接着fasterRCNN.create_architecture(),

同理: cls_score = self.RCNN_cls_score(pooled_feat)也是一样的,RCNN_cls_score在vgg的init当中。


像relu这种不用在init里写,放到forward。forward主要用于计算,forward调用forward的函数,init调用另一模块的init模块。

再看train_val.py文件

数据读取:

  sampler_batch = sampler(train_size, args.batch_size)

  dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                           imdb.num_classes, training=True)

  dataloader = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size,
                            sampler=sampler_batch, num_workers=args.num_workers)

初始化数据:

  # initilize the tensor holder here.
  im_data = torch.FloatTensor(1)
  im_info = torch.FloatTensor(1)
  num_boxes = torch.LongTensor(1)
  gt_boxes = torch.FloatTensor(1)

  # ship to cuda
  if args.cuda:
    im_data = im_data.cuda()
    im_info = im_info.cuda()
    num_boxes = num_boxes.cuda()
    gt_boxes = gt_boxes.cuda()

  # make variable
  im_data = Variable(im_data)
  im_info = Variable(im_info)
  num_boxes = Variable(num_boxes)
  gt_boxes = Variable(gt_boxes)

  if args.cuda:
    cfg.CUDA = True

初始化模型:

fasterRCNN = vgg16(imdb.classes, pretrained=True, class_agnostic=args.class_agnostic)

fasterRCNN.create_architecture()#初始化权重和模型

加载模型参数:

params = []
  for key, value in dict(fasterRCNN.named_parameters()).items():
    if value.requires_grad:
      if 'bias' in key:
        params += [{'params':[value],'lr':lr*(cfg.TRAIN.DOUBLE_BIAS + 1), \
                'weight_decay': cfg.TRAIN.BIAS_DECAY and cfg.TRAIN.WEIGHT_DECAY or 0}]
      else:
        params += [{'params':[value],'lr':lr, 'weight_decay': cfg.TRAIN.WEIGHT_DECAY}]

定义优化器:

optimizer = torch.optim.SGD(params, momentum=cfg.TRAIN.MOMENTUM)

数据迭代:

  for epoch in range(args.start_epoch, args.max_epochs + 1):
    # setting to train mode
    fasterRCNN.train()
    loss_temp = 0
    start = time.time()

    data_iter = iter(dataloader)
    for step in range(iters_per_epoch):
      data = next(data_iter)
      im_data.data.resize_(data[0].size()).copy_(data[0])
      im_info.data.resize_(data[1].size()).copy_(data[1])
      gt_boxes.data.resize_(data[2].size()).copy_(data[2])
      num_boxes.data.resize_(data[3].size()).copy_(data[3])

      fasterRCNN.zero_grad()
      rois, cls_prob, bbox_pred, \
      rpn_loss_cls, rpn_loss_box, \
      RCNN_loss_cls, RCNN_loss_bbox, \
      rois_label = fasterRCNN(im_data, im_info, gt_boxes, num_boxes)

      loss = rpn_loss_cls.mean() + rpn_loss_box.mean() \
           + RCNN_loss_cls.mean() + RCNN_loss_bbox.mean()
      loss_temp += loss.item()

      # backward
      optimizer.zero_grad()
      loss.backward()
      optimizer.step()

      if step % args.disp_interval == 0:
        end = time.time()
        if step > 0:
          loss_temp /= args.disp_interval
        loss_rpn_cls = rpn_loss_cls.item()
        loss_rpn_box = rpn_loss_box.item()
        loss_rcnn_cls = RCNN_loss_cls.item()
        loss_rcnn_box = RCNN_loss_bbox.item()
        fg_cnt = torch.sum(rois_label.data.ne(0))
        bg_cnt = rois_label.data.numel() - fg_cnt

继承nn.Module后的 init与forward函数【trian_val、vgg16、faster_rcnn、rpn】.py 学习 文件结构 大工程安排相关推荐

  1. 神经网络模型中class的forward函数何时调用_总结深度学习PyTorch神经网络箱使用...

    ↑ 点击蓝字 关注极市平台来源丨计算机视觉联盟编辑丨极市平台 极市导读 本文介绍了Pytorch神经网络箱的使用,包括核心组件.神经网络实例.构建方法.优化器比较等内容,非常全面.>>加入 ...

  2. Pytorch的自定义拓展:torch.nn.Module和torch.autograd.Function

    参考链接:pytorch的自定义拓展之(一)--torch.nn.Module和torch.autograd.Function_LoveMIss-Y的博客-CSDN博客_pytorch自定义backw ...

  3. pytorch ——模型创建与nn.Module

    1.网络模型创建步骤 模型模块中分为两个部分,模型创建和权值初始化: 模型创建又分为两部分,构建网络层和拼接网络层:网络层有卷积层,池化层,激活函数等:构建网络层后,需要进行网络层的拼接,拼接成LeN ...

  4. PyTorch 入坑七:模块与nn.Module学习

    PyTorch 入坑七 模型创建概述 PyTorch中的模块 torch模块 torch.Tensor模块 torch.sparse模块 torch.cuda模块 torch.nn模块 torch.n ...

  5. PyTorch 源码解读之 nn.Module:核心网络模块接口详解

    目录 0 设计 1 nn.Module 实现 1.1 常用接口 1.1.1 __init__ 函数 1.1.2 状态的转换 1.1.3 参数的转换或转移 1.1.4 Apply 函数 1.2 属性的增 ...

  6. 43_pytorch nn.Module,模型的创建,构建子模块,API介绍,Sequential(序号),ModuleList,ParameterList,案例等(学习笔记)

    1.40.PyTorch nn.Module 1.40.1.模型的创建 1.40.2.构建子模块 1.40.3.nn.Module API介绍 1.40.3.1.核心功能 1.40.3.2.查看模块 ...

  7. pytorch教程之nn.Module类详解——使用Module类来自定义网络层

    前言:前面介绍了如何自定义一个模型--通过继承nn.Module类来实现,在__init__构造函数中申明各个层的定义,在forward中实现层之间的连接关系,实际上就是前向传播的过程. 事实上,在p ...

  8. PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard

    文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...

  9. PyTorch 笔记(14)— nn.module 实现简单感知机和多层感知机

    autograd 实现了自动微分系统,然而对深度学习来说过于底层,而本节将介绍 nn 模块,是构建于 autograd 之上的神经网络模块. 1. 简单感知机 使用 autograd 可实现深度学习模 ...

最新文章

  1. 深圳大学计算机暑期学校,The First Day-深度学习暑期学校
  2. 用dmidecode - 查看硬件信息
  3. Android性能优化典范笔记(1)-GPU绘制性能优化
  4. 训练、标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通...
  5. 我在实际工作中用的最多的 git 命令
  6. 网工路由基础(3)RIP原理与配置
  7. 深入理解javascript原型和闭包(3)——prototype原型
  8. 树莓派Raspberry命令行配置无线网络连接
  9. 给 OpenPOP.Net 加一个小功能,可用于收取邮件时监测数据流量!
  10. servlet下载文件(注意文件名字必须是英文)
  11. 【剑指offer】面试题35:复杂链表的复制(Java)
  12. 2015二级java真题及答案_2015计算机二级《JAVA》考前模拟操作和应用题及答案
  13. 修改QtCreator的默认pro工程文件,添加assert.h条件切换
  14. 此男因为什么被送进医院?
  15. SuperMap GIS 10i大数据GIS 技术白皮书
  16. 下百度文库要券?来用 Python 自动下
  17. 手写字体研究-matlab
  18. 女生专属树洞,树懒APP内测(附下载)
  19. Python的dataframe_image使用报错
  20. 帝国cms7.2密码修改

热门文章

  1. windows中的SC命令
  2. App-UI自动化测试(Airtest+Pycharm)
  3. 字符对应的URL编码值集合
  4. JavaFX开发教程-什么是JavaFX?
  5. java 车牌号归属地_本地化JavaAnpr用于本地的车牌
  6. Contest3121 - 2021级新生个人训练赛第26场_问题 F: 乐乐的数字
  7. 儿子于靖洋180天的照片
  8. mDNS原理的简单理解
  9. 组合逻辑设计中的毛刺现象
  10. matlab 剪毛刺,MATLAB消除曲线毛刺Outlier Detection and Removal [hampel]