Pytorch实现DenseNet

本文主要将Pytorch实现的DenseNet用于自己制作的数据集进行图像分类,如果要复现DenseNet在经典数据集如Cifar10上的性能请移步github,另外本文不会涉及详细的论文解读。

本文主要讲解如何利用Pytorch实现DenseNet,并且将Pytorch实现的DenseNet用于自己制作的数据集进行图像分类,以并以17 Flowers(17 Category Flower Dataset)为案例进行实战。
本案例主要取 Daffodil、LilyValley、Snowdrop三个类别进行分类,每个类别前10张图片作为验证集,后70张图片作为训练集。(这一篇博客讲解了如何组织数据集)
Pytorch实现DenseNet_第1张图片

0. 理论回顾

  1. 什么是Bottleneck(DenseNet-B)? It has been noted in [37, 11] that a 1×1 convolution can be introduced as bottleneck layer before each 3×3 convolution to reduce the number of input feature-maps. 所以Bottleneck只是3×3卷积层前面用于降低维度的1×1卷积层,但这个代码中将两个卷积合并放在Bottleneck类中了。
  2. 什么是Compress(DenseNet-C)? If a dense block contains m feature-maps, we let the following transition layer generate θ*m output feature-maps, where 0 <θ ≤1 is referred to as the compression factor. 所以Compress只是为了在Transition层减少channels数量。
  3. 如何计算DenseNet网络结构中的层?每个Bottleneck包含了两个卷积层,每个Transition包含一个卷积层,总共有4+4+4+4=16个Bottleneck和3个transition,也就是35个卷积层,再加上最前面的卷积层和最后的全连接层,最后总共有37层。(那么自定义层数改动 nblocks 参数就可以了)

1. 项目架构

先看项目架构:
Pytorch实现DenseNet_第2张图片

2. 文件说明

文件 功能
data /train 存放训练集图片(70)
data / test 存放验证集图片(10)
model.py 定义了 DenseNet 的网络结构
main.py 项目的主程序,包含训练与评估过程

3. 训练过程

直接运行 main.py 文件即可
Pytorch实现DenseNet_第3张图片
Pytorch实现DenseNet_第4张图片

注:本文只对数据集进行了粗糙的处理(裁剪成3 * 32 * 32),如果想进一步提高分类性能,需要读者自行对数据集进行一些优化的预处理操作。

4. 项目源码

https://github.com/dhuQChen/DenseNet

你可能感兴趣的:(DeepLearning)