|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# DenseNet\n",
- "\n",
- "因为 ResNet 提出了跨层链接的思想,这直接影响了随后出现的卷积网络架构,其中最有名的就是 CVPR 2017 的 Best Paper,DenseNet。DenseNet 和 ResNet 不同在于 ResNet 是跨层求和,而 DenseNet 是跨层将特征在通道维度进行拼接,下面可以看看他们两者的图示:\n",
- "\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "第2张图是 ResNet,第3张图是 DenseNet,因为是在通道维度进行特征的拼接,所以底层的输出会保留进入所有后面的层,这能够更好的保证梯度的传播,同时能够使用低维的特征和高维的特征进行联合训练,能够得到更好的结果。\n",
- "\n",
- "DenseNet主要的优点包括:\n",
- "1. 减轻了vanishing-gradient(梯度消失)\n",
- "2. 加强了feature的传递\n",
- "3. 更有效地利用了feature\n",
- "4. 一定程度上较少了参数数量\n",
- "\n",
- "在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,目前很多论文都针对这个问题提出了解决方案,比如ResNet,Highway Networks,Stochastic depth,FractalNets等,尽管这些算法的网络结构有差别,但是核心都在于:**create short paths from early layers to later layers**。延续这个思路,那就是在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来。\n",
- "\n",
- "先放一个dense block的结构图。在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有 **L(L+1)/2** 个连接。简单讲,就是每一层的输入来自前面所有层的输出。如下图:x0是input,H1的输入是x0(input),H2的输入是x0和x1(x1是H1的输出)……\n",
- "\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 1. Dense_Block\n",
- "DenseNet 主要由 Dense Block 构成,下面我们来实现一个 Densen Block"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.113030Z",
- "start_time": "2017-12-22T15:38:30.612922Z"
- },
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import torch\n",
- "from torch import nn\n",
- "from torch.autograd import Variable\n",
- "from torchvision.datasets import CIFAR10\n",
- "from torchvision import transforms as tfs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "首先定义一个卷积块,这个卷积块的顺序是 bn -> relu -> conv"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.121249Z",
- "start_time": "2017-12-22T15:38:31.115369Z"
- },
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def Conv_Block(in_channel, out_channel):\n",
- " layer = nn.Sequential(\n",
- " nn.BatchNorm2d(in_channel),\n",
- " nn.ReLU(True),\n",
- " nn.Conv2d(in_channel, out_channel, 3, padding=1, bias=False)\n",
- " )\n",
- " return layer"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Dense Block 将每次的卷积的输出称为 `growth_rate`,因为如果输入是 `in_channel`,有 n 层,那么输出就是 `in_channel + n * growh_rate`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.145274Z",
- "start_time": "2017-12-22T15:38:31.123363Z"
- },
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "class Dense_Block(nn.Module):\n",
- " def __init__(self, in_channel, growth_rate, num_layers):\n",
- " super(Dense_Block, self).__init__()\n",
- " block = []\n",
- " channel = in_channel\n",
- " for i in range(num_layers):\n",
- " block.append(Conv_Block(channel, growth_rate))\n",
- " channel += growth_rate\n",
- " \n",
- " self.net = nn.Sequential(*block)\n",
- " \n",
- " def forward(self, x):\n",
- " for layer in self.net:\n",
- " out = layer(x)\n",
- " x = torch.cat((out, x), dim=1)\n",
- " return x"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "我们验证一下输出的 channel 是否正确"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.213632Z",
- "start_time": "2017-12-22T15:38:31.147196Z"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "input shape: 3 x 96 x 96\n",
- "output shape: 39 x 96 x 96\n"
- ]
- }
- ],
- "source": [
- "test_net = Dense_Block(3, 12, 3)\n",
- "test_x = Variable(torch.zeros(1, 3, 96, 96))\n",
- "print('input shape: {} x {} x {}'.format(test_x.shape[1], test_x.shape[2], test_x.shape[3]))\n",
- "test_y = test_net(test_x)\n",
- "print('output shape: {} x {} x {}'.format(test_y.shape[1], test_y.shape[2], test_y.shape[3]))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "除了 dense block,DenseNet 中还有一个模块叫过渡层(transition block),因为 DenseNet 会不断地对维度进行拼接, 所以当层数很高的时候,输出的通道数就会越来越大,参数和计算量也会越来越大,为了避免这个问题,需要引入过渡层将输出通道降低下来,同时也将输入的长宽减半,这个过渡层可以使用 1 x 1 的卷积"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.222120Z",
- "start_time": "2017-12-22T15:38:31.215770Z"
- },
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def Transition_Block(in_channel, out_channel):\n",
- " trans_layer = nn.Sequential(\n",
- " nn.BatchNorm2d(in_channel),\n",
- " nn.ReLU(True),\n",
- " nn.Conv2d(in_channel, out_channel, 1),\n",
- " nn.AvgPool2d(2, 2)\n",
- " )\n",
- " return trans_layer"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "验证一下过渡层是否正确"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.234846Z",
- "start_time": "2017-12-22T15:38:31.224078Z"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "input shape: 3 x 96 x 96\n",
- "output shape: 12 x 48 x 48\n"
- ]
- }
- ],
- "source": [
- "test_net = Transition_Block(3, 12)\n",
- "test_x = Variable(torch.zeros(1, 3, 96, 96))\n",
- "print('input shape: {} x {} x {}'.format(test_x.shape[1], test_x.shape[2], test_x.shape[3]))\n",
- "test_y = test_net(test_x)\n",
- "print('output shape: {} x {} x {}'.format(test_y.shape[1], test_y.shape[2], test_y.shape[3]))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 2. DenseNet\n",
- "\n",
- "最后我们定义 DenseNet"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.318822Z",
- "start_time": "2017-12-22T15:38:31.236857Z"
- },
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "class DenseNet(nn.Module):\n",
- " def __init__(self, in_channel, num_classes, growth_rate=32, block_layers=[6, 12, 24, 16]):\n",
- " super(DenseNet, self).__init__()\n",
- " self.block1 = nn.Sequential(\n",
- " nn.Conv2d(in_channels=in_channel, out_channels=64, \n",
- " kernel_size=7, stride=2, padding=3),\n",
- " nn.BatchNorm2d(64),\n",
- " nn.ReLU(True),\n",
- " nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n",
- " )\n",
- " \n",
- " channels = 64\n",
- " block = []\n",
- " for i, layers in enumerate(block_layers):\n",
- " block.append(Dense_Block(channels, growth_rate, layers))\n",
- " channels += layers * growth_rate\n",
- " if i != len(block_layers) - 1:\n",
- " block.append(Transition_Block(channels, channels // 2)) # 通过 transition 层将大小减半,通道数减半\n",
- " channels = channels // 2\n",
- " \n",
- " self.block2 = nn.Sequential(*block)\n",
- " self.block2.add_module('bn', nn.BatchNorm2d(channels))\n",
- " self.block2.add_module('relu', nn.ReLU(True))\n",
- " self.block2.add_module('avg_pool', nn.AvgPool2d(3))\n",
- " \n",
- " self.classifier = nn.Linear(channels, num_classes)\n",
- " \n",
- " def forward(self, x):\n",
- " x = self.block1(x)\n",
- " x = self.block2(x)\n",
- " \n",
- " x = x.view(x.shape[0], -1)\n",
- " x = self.classifier(x)\n",
- " return x"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:31.654182Z",
- "start_time": "2017-12-22T15:38:31.320788Z"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "output: torch.Size([1, 10])\n"
- ]
- }
- ],
- "source": [
- "test_net = DenseNet(3, 10)\n",
- "test_x = Variable(torch.zeros(1, 3, 96, 96))\n",
- "test_y = test_net(test_x)\n",
- "print('output: {}'.format(test_y.shape))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T15:38:32.894729Z",
- "start_time": "2017-12-22T15:38:31.656356Z"
- },
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from utils import train\n",
- "\n",
- "def data_tf(x):\n",
- " im_aug = tfs.Compose([\n",
- " tfs.Resize(96),\n",
- " tfs.ToTensor(),\n",
- " tfs.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])\n",
- " ])\n",
- " x = im_aug(x)\n",
- " return x\n",
- " \n",
- "train_set = CIFAR10('../../data', train=True, transform=data_tf)\n",
- "train_data = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True)\n",
- "test_set = CIFAR10('../../data', train=False, transform=data_tf)\n",
- "test_data = torch.utils.data.DataLoader(test_set, batch_size=128, shuffle=False)\n",
- "\n",
- "net = DenseNet(3, 10)\n",
- "optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n",
- "criterion = nn.CrossEntropyLoss()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-12-22T16:15:38.168095Z",
- "start_time": "2017-12-22T15:38:32.896735Z"
- },
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[ 0] Train:(L=1.398217, Acc=0.485654), Valid:(L=1.140475, Acc=0.589102), T: 00:01:27\n",
- "[ 1] Train:(L=0.977232, Acc=0.655091), Valid:(L=0.878000, Acc=0.688192), T: 00:01:27\n",
- "[ 2] Train:(L=0.765218, Acc=0.732537), Valid:(L=0.722094, Acc=0.746242), T: 00:01:27\n",
- "[ 3] Train:(L=0.622742, Acc=0.782649), Valid:(L=0.603473, Acc=0.791337), T: 00:01:27\n",
- "[ 4] Train:(L=0.516785, Acc=0.818095), Valid:(L=0.558635, Acc=0.809434), T: 00:01:27\n",
- "[ 5] Train:(L=0.429744, Acc=0.849984), Valid:(L=0.562023, Acc=0.815961), T: 00:01:27\n",
- "[ 6] Train:(L=0.353802, Acc=0.876559), Valid:(L=0.590441, Acc=0.806369), T: 00:01:27\n",
- "[ 7] Train:(L=0.287238, Acc=0.900715), Valid:(L=0.549039, Acc=0.826642), T: 00:01:27\n",
- "[ 8] Train:(L=0.234364, Acc=0.916980), Valid:(L=0.518194, Acc=0.841278), T: 00:01:27\n",
- "[ 9] Train:(L=0.182421, Acc=0.935422), Valid:(L=0.522031, Acc=0.850376), T: 00:01:27\n",
- "[10] Train:(L=0.147457, Acc=0.948170), Valid:(L=0.577835, Acc=0.840289), T: 00:01:27\n",
- "[11] Train:(L=0.111591, Acc=0.960938), Valid:(L=0.541511, Acc=0.856903), T: 00:01:27\n",
- "[12] Train:(L=0.096760, Acc=0.965933), Valid:(L=0.598660, Acc=0.848991), T: 00:01:27\n",
- "[13] Train:(L=0.085699, Acc=0.968810), Valid:(L=0.690155, Acc=0.839992), T: 00:01:27\n",
- "[14] Train:(L=0.064518, Acc=0.976303), Valid:(L=0.695370, Acc=0.847409), T: 00:01:27\n",
- "[15] Train:(L=0.067802, Acc=0.976063), Valid:(L=0.747289, Acc=0.837421), T: 00:01:27\n",
- "[16] Train:(L=0.060445, Acc=0.978760), Valid:(L=0.713599, Acc=0.842366), T: 00:01:27\n",
- "[17] Train:(L=0.055962, Acc=0.980259), Valid:(L=0.711125, Acc=0.848101), T: 00:01:27\n",
- "[18] Train:(L=0.049886, Acc=0.982816), Valid:(L=0.731038, Acc=0.842662), T: 00:01:28\n",
- "[19] Train:(L=0.037981, Acc=0.986693), Valid:(L=0.734789, Acc=0.855419), T: 00:01:38\n"
- ]
- }
- ],
- "source": [
- "res = train(net, train_data, test_data, 20, optimizer, criterion)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "\n",
- "plt.plot(res[0], label='train')\n",
- "plt.plot(res[2], label='valid')\n",
- "plt.xlabel('epoch')\n",
- "plt.ylabel('Loss')\n",
- "plt.legend(loc='best')\n",
- "plt.savefig('fig-res-densenet-train-validate-loss.pdf')\n",
- "plt.show()\n",
- "\n",
- "plt.plot(res[1], label='train')\n",
- "plt.plot(res[3], label='valid')\n",
- "plt.xlabel('epoch')\n",
- "plt.ylabel('Acc')\n",
- "plt.legend(loc='best')\n",
- "plt.savefig('fig-res-densenet-train-validate-acc.pdf')\n",
- "plt.show()\n",
- "\n",
- "# save raw data\n",
- "import numpy\n",
- "numpy.save('fig-res-densenet_data.npy', res)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "DenseNet 将残差连接改为了特征拼接,使得网络有了更稠密的连接"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 参考\n",
- "* [DenseNet算法详解](https://blog.csdn.net/u014380165/article/details/75142664)\n",
- "* [DenseNet详解](https://zhuanlan.zhihu.com/p/43057737)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.4"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
|