chainer-图像分类-ResNext【附源码】

文章目录

  • 前言
  • 一、ResNext网络结构
  • 二、代码实现
    • 1.引入必须要的库库
    • 2.模型构建
      • 1.设置残差卷积块
      • 2.残差块的堆叠
      • 3.ResNext网络结构的构建
      • 3.结合之前构建的分类框架调用
  • 三、训练效果展示
    • 1.resnext50训练结果展示
  • 总结


前言

  本文与resnet网络结构类似,这里主要是实现resnext的网络结构
主题框架链接,需要配合使用:主题框架博客介绍


一、ResNext网络结构

  resnext与resnet只有残差卷积块的不同
chainer-图像分类-ResNext【附源码】_第1张图片

二、代码实现

1.引入必须要的库库

import numpy as np
import chainer,sys
import chainer.functions as F
from chainer import initializers
import chainer.links as L

2.模型构建

1.设置残差卷积块

chainer-图像分类-ResNext【附源码】_第2张图片
注意:
  h += residual就是残差重点;
  se参数说明可以理解为做特征压缩与激发的意思,也就是人们常说的se-resnet,这里不会用新篇描述此网络结果。
group:32,这里就是与resnet不同的地方

2.残差块的堆叠

这里以没压缩图像为一个模块来构建,也就是上边图中显示resnet50:3、4、6、3;resnet101:3,4,23,3;resnet152:3,8,36,3
在这里插入图片描述
这里的for循环就是对应:3,4,6,3

3.ResNext网络结构的构建

  这里构建的时候直接resnet101、resnet152同时构建,根据参数n_layer决定网络的选择,代码如下:

class SEResNeXt(PickableSequentialChain):
    _blocks = {
        50: [3, 4, 6, 3],
        101: [3, 4, 23, 3],
    }

    def __init__(self, n_layer, n_class=None,alpha=1, zeroInit=False, fc_kwargs={}):
        self.alpha=alpha
        blocks = self._blocks[n_layer]
        if zeroInit:
            initialW = initializers.constant.Zero()
            fc_kwargs['initialW'] = initializers.constant.Zero()
        else:
            initialW = initializers.HeNormal(scale=1., fan_option='fan_out')
        fc_kwargs['initialW'] = initializers.Normal(scale=0.01)
        kwargs = {
            'groups': 32, 'initialW': initialW, 'stride_first': False,
            'add_seblock': True}

        super(SEResNeXt, self).__init__()
        with self.init_scope():
            self.conv1 = Conv2DBNActiv(None, 64//self.alpha, 7, 2, 3, nobias=True, initialW=initialW)
            self.pool1 = lambda x: F.max_pooling_2d(x, ksize=3, stride=2)
            self.res2 = ResBlock(blocks[0], None, 128//self.alpha, 256//self.alpha, 1, **kwargs)
            self.res3 = ResBlock(blocks[1], None, 256//self.alpha, 512//self.alpha, 2, **kwargs)
            self.res4 = ResBlock(blocks[2], None, 512//self.alpha, 1024//self.alpha, 2, **kwargs)
            self.res5 = ResBlock(blocks[3], None, 1024//self.alpha, 2048//self.alpha, 2, **kwargs)
            self.pool5 = lambda x: F.average(x, axis=(2, 3))
            self.fc6 = L.Linear(None, n_class, **fc_kwargs)
            self.prob = F.softmax

这里的参数需要解释一下:
n_class:类别个数
n_layer:设置选择50,101,152
alpha:根据自己电脑自身情况修改通道数

3.结合之前构建的分类框架调用

self.extractor = ResNext(n_layer=101, n_class=14, alpha=1)
self.model = Classifier(self.extractor)
if self.gpu_devices >= 0:
    self.model.to_gpu()

三、训练效果展示

1.resnext50训练结果展示

chainer-图像分类-ResNext【附源码】_第3张图片
chainer-图像分类-ResNext【附源码】_第4张图片

备注:因为代码是以前训练,所以没有验证集的可视化。不过效果也是可以通过loss和acc可以得到


总结

  本次使用ResNext网络结构以及对应他的一些不同深度的结构进行测试,效果对比,调用只需要在图像分类框架篇中替换model即可。
源码:chainer-resnext网络结构源码

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