MASK_RCNN解读6-网络误差反向向传播总体流程

MASK_RCNN解读6-网络误差反向向传播总体流程

从train_net.py的def main():函数进入,读取参数、初始化日志后进入def train(cfg, local_rank, distributed):函数,进行模型加载。通过下列代码读取模型权重值:
checkpointer = DetectronCheckpointer(
cfg, model, optimizer, scheduler, output_dir, save_to_disk
)
extra_checkpoint_data = checkpointer.load(cfg.MODEL.WEIGHT)
arguments.update(extra_checkpoint_data)
读取完成后,我们可以看到,除了ResNet的网络结构外,,其他层的的tensor的requires_grad被标记为TRUE,这个字段表示该tensor是否需要在被反向误差传递,主要的列表如下:

1)FPN网络(Feature Pyramid Networks,含金字塔)模块:
model.backbone.fpn.fpn_inner1
model.backbone.fpn.fpn_inner2
model.backbone.fpn.fpn_inner3
model.backbone.fpn.fpn_inner4
model.backbone.fpn.fpn_layer1
model.backbone.fpn.fpn_layer2
model.backbone.fpn.fpn_layer3
model.backbone.fpn.fpn_layer4

2)rpn 网络:
RegionProposalNetwork
model.rpn.head.bbox_pred
model.rpn.head.cls_logits
model.rpn.head.conv

3)roi_heads网络:
model.roi_heads.box.feature_extractor.fc6
model.roi_heads.box.feature_extractor.fc7
model.roi_heads.box.predictor.bbox_pred
model.roi_heads.box.predictor.cls_score

model.roi_heads.mask.feature_extractor.mask_fcn1
model.roi_heads.mask.feature_extractor.mask_fcn2
model.roi_heads.mask.feature_extractor.mask_fcn3
model.roi_heads.mask.feature_extractor.mask_fcn4
model.roi_heads.mask.predictor.conv5_mask
model.roi_heads.mask.predictor.mask_fcn_logits

在def do_train()函数里的for iteration, (images, targets, _) in enumerate(data_loader, start_iter):进行训练,Mask_RCNN程序里的训练工作和一般上的神经网络训练存在差异,一般上的神经网络训练训练,先epoch训练几轮,再step按minibatch喂数据进行训练。
Mask_RCNN程序里的训练只进行一轮的epoch,step的minibatch=1。
神经网络的训练,旨在找到“输入”和“输出”的关系,并将这种关系固化在网络结构和参数里。
所以,我们先看“输入”在程序里是images和targets两个变量,images就是这张图片的数据,

targets:就是图片中标记物体的框和类别,主要数据结构如下:
bbox:矩形框
tensor([[327.0016, 112.4719],
    [306.2500, 471.8750],
    [858.1188, 304.0906],
    [503.1250, 541.6666]], device='cuda:0')
extra_fields:
    'labels':类型
    'masks':polygons,就是masks的连线画出来的多边形框。
通过这个函数得到误差:    
loss_dict = model(images, targets)
主要分为四个部分
loss_dict['loss_classifier']:最终分类结果
loss_dict['loss_box_reg']:最终回归结果,矩形框。
loss_dict['loss_mask']:最终回归结果,多边形框。
loss_dict['loss_objectness']:RPN输出的是否为物体的二分类。
loss_dict['loss_rpn_box_reg']:RPN输出的物体的矩形框。
通过losses = sum(loss for loss in loss_dict.values())函数,对数据进行汇总。
通过:
    
    with amp.scale_loss(losses, optimizer) as scaled_losses:
        scaled_losses.backward()
    optimizer.step()
    scheduler.step()
进行训练。    

至此从大框架完成了训练,下一步研究loss_dict = model(images, targets),如何返回loss_dict的。

你可能感兴趣的:(人工智能,深度学习)