• Caffe 议事(一):从零开始搭建 ResNet 之 残差网络结构介绍和数据准备


    声明:Caffe 系列文章是我们实验室 黄佳斌 大神所写的内部学习文档,已经获得他的授权允许。

    本参考资料是在 Ubuntu14.04 版本下进行,并且默认 Caffe 所需的环境已经配置好,下面教大家如何搭建 KaiMing He 的 Residual Network(残差网络)。

    Cite: He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 770-778.. Cited by 1330.

    1.ResNet结构介绍:

      ResNet 的结构如下:

     Fig 1 34-layer ResNet

      上图显示了网络主体框架,可以看到一个残差模块(Fig 2)是由两层卷积再加一个恒等映射组成的。相同颜色块之间的 feature map 的大小是一样的,因此残差模块的输入输出的维度大小也是一样,可以直接进行相加(如 Fig 1中的实曲线)网络延伸到不同颜色块时都要经过2倍下采样或者是 stride=2 的卷积,那么这时 feature map 的大小都会减半,但是卷积核的数量会增加一倍,这样是为了保持时间的复杂度,那么残差模块的输入和输出大小不一样的时应该要怎么办?这里采用论文中的 B 方法:用 1X1 的卷积核来映射到跟输出一样的维度(如 Fig 1中的虚曲线)。ResNet 的大体结构是还是参照 VGG 网络。

    Fig 2 残差模块

      本参考资料是搭建论文中 CIFAR10 实验的 ResNet,总共 20 层。结构如下:

    Layer_name

    Output_size

    20-layer ResNet

    Conv1

    32 X 32

    Kernel_size=3 X 3

    Num_output = 16

    Stride = 1

    Pad = 1

    Conv2_x

    32 X 32

     {3X3,16; 3X3,16} X 3

    Conv3_x

    16 X 16

     {3X3,16; 3X3,16} X 3

    Conv4_x

    8 X 8

     {3X3,16; 3X3,16} X 3

    InnerProduct

    1 X 1

    Average pooling

    10-d fc

      每个 Convx_x 中都含有 3 个残差模块,每个模块的卷积核都是 3X3 大小的,pad 为 1,stride 为 1。Con4_x 的输出通过 global_average_pooling 映射到 64 个 1X1 大小的 feature map,最后再通过含有 10 个神经元的全连接层输出分类结果。

    2.数据准备

      CIFAR10 数据库介绍:

      CIFAR10 数据库中的图片大小为 3 X 32 X 32(通道数 X 图像高度 X 图像宽度),训练数据为 50000 张,测试数据为 10000 张。此外还有 CIFAR100,那是分 100 类的图像数据库。

     Fig 3 CIFAR10 数据库

      我们先在 /home/your_name/ 下建立一个文件夹叫 ResNet,再把 caffe-master 放进去解压,然后按照如下步骤

     Fig 4 把 caffe-maste r放入 ResNet 然后解压

     

      步骤1:

      在 caffe-master (caffe 的根目录)中找到 Makefile.config.example,复制一份为 Makefile.config。

     Fig 5 复制一份Makefile.config

      在这个复制好的 Makefile.config 文件中设置好一些参数。由于每个电脑环境不一样,在这里贴出本实验方案的设置参数,仅供参考:(仅仅是把 “#” 注释给去掉)

      # USE_CUDNN := 1          变为  USE_CUDNN := 1 
    
      # WITH_PYTHON_LAYER := 1      变为  WITH_PYTHON_LAYER := 1

      步骤2:

      在 caffe-master (caffe 的根目录)中打开终端,先输入 make clean(清除之前编译的文件,虽然还没编译过),然后再输入 make all(重新编译 caffe),这个过程会很漫长,如果想要加快速度,输入 make all -j8(j 后面的数字代表加速的倍数,可以是 2,4,8,16 等),最后再输入 make pycaffe(之后本参考资料会用 python 搭建残差网络,因此要生成供 python 调用的接口文件)。

     

     Fig 6 make clean & make all & make pycaffe

     

      步骤3:

      在 caffe 的示例程序中有 CIFAR10 的 demo,里面有获取 CIFAR10 数据程序。在 caffe-master (caffe 的根目录)中打开终端,输入:

      $./data/cifar10/get_cifar10.sh

       为什么要在 caffe 的根目录里面输入这个,因为只有在根目录才有 data 文件,才能按照路径找到文件,打了指令后会出现下载界面,如下:

    Fig 7 下载CIFAR10界面

      下载完成后,会在 $(caffe 根目录)/data/cifar10/ 中生成许多数据 batch,不过这些都是二进制文件,我们需要转换为 LMDB 格式。

     

    Fig 8 下载后的二进制数据batch

     

      步骤4:

      同样在 caffe-master (caffe 的根目录)中打开终端,输入:  

      $./examples/cifar10/create_cifar10.sh

      这样就把上面的二进制文件转换成 LMDB 数据,同时生成了训练数据 (cifar10_train_lmdb) 的均值文件 mean.binaryproto。均值文件的计算方式是计算每个样本不同维度上的均值,拿 CIFAR10 做例子,训练数据有 5000 X 3 X 32 X 32 (样本个数 X 图像通道数 X 图像高度 X 图像宽度),那么均值文件的维度是 3 X 32 X 32。

    Fig 9 生成的测试数据,训练数据,还有均值文件

      这样我们就已经生成数据了,接下来我们就要用 python 来搭建网络。

  • 相关阅读:
    gateway 实现接口日志保存
    Spring Boot应用的Controller返回的集合类数据是XML格式的可能原因
    json 转list
    观察者模式
    Quartz定时任务整理
    java通过word模板生成word文档
    基于mysql的单据号生成(前缀+日期+自增id+后缀)
    Rabbitmq详解
    java.sql.SQLException: connection holder is null 问题处理
    为什么要用消息队列或消息队列的优缺点
  • 原文地址:https://www.cnblogs.com/Charles-Wan/p/6442294.html
Copyright © 2020-2023  润新知