12 個 CNN 經典模型論文整理與 PyTorch 實現!

2021-03-02 深度學習專欄

點擊上方「深度學習專欄」,選擇「置頂」公眾號

重磅乾貨,第一時間送達

最近發現了一份不錯的原始碼,作者使用 PyTorch 實現了如今主流的卷積神經網絡 CNN 框架,包含了 12 中模型架構。所有代碼使用的數據集是 CIFAR。

項目地址:

https://github.com/BIGBALLON/CIFAR-ZOO

該項目實現的是主流的 CNN 模型,涉及的論文包括:

1. CNN 模型(12 篇)

(lenet) LeNet-5, convolutional neural networks

論文地址:http://yann.lecun.com/exdb/lenet/

(alexnet) ImageNet Classification with Deep Convolutional Neural Networks

論文地址:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks

(vgg) Very Deep Convolutional Networks for Large-Scale Image Recognition

論文地址:https://arxiv.org/abs/1409.1556

(resnet) Deep Residual Learning for Image Recognition

論文地址:https://arxiv.org/abs/1512.03385

(preresnet) Identity Mappings in Deep Residual Networks

論文地址:https://arxiv.org/abs/1603.05027

(resnext) Aggregated Residual Transformations for Deep Neural Networks

論文地址:https://arxiv.org/abs/1611.05431

(densenet) Densely Connected Convolutional Networks

論文地址:https://arxiv.org/abs/1608.06993

(senet) Squeeze-and-Excitation Networks

論文地址:https://arxiv.org/abs/1709.01507

(bam) BAM: Bottleneck Attention Module

論文地址:https://arxiv.org/abs/1807.06514

(cbam) CBAM: Convolutional Block Attention Module

論文地址:https://arxiv.org/abs/1807.06521

(genet) Gather-Excite: Exploiting Feature Context in Convolutional Neural Networks

論文地址:https://arxiv.org/abs/1810.12348

(sknet) SKNet: Selective Kernel Networks

論文地址:https://arxiv.org/abs/1903.06586

https://arxiv.org/abs/1903.06586

2. 正則化(3 篇)

(shake-shake) Shake-Shake regularization

論文地址:https://arxiv.org/abs/1705.07485

(cutout) Improved Regularization of Convolutional Neural Networks with Cutout

論文地址:https://arxiv.org/abs/1708.04552

(mixup) mixup: Beyond Empirical Risk Minimization

論文地址:https://arxiv.org/abs/1710.09412

3. 學習速率調度器(2 篇)

(cos_lr) SGDR: Stochastic Gradient Descent with Warm Restarts

論文地址:https://arxiv.org/abs/1608.03983

(htd_lr) Stochastic Gradient Descent with Hyperbolic-Tangent Decay on Classification

論文地址:https://arxiv.org/abs/1806.01593

1. 需求

運行所有代碼的開發環境需求為:

作者提供了一鍵安裝、配置開發環境的方法:

pip install -r requirements.txt

2. 模型代碼

作者將所有的模型都存放在 model 文件夾下,我們來看一下 PyTorch 實現的 ResNet 網絡結構:


import math

import torch
import torch.nn as nn
import torch.nn.functional as F

__all__ = ['resnet20', 'resnet32', 'resnet44',
'resnet56', 'resnet110', 'resnet1202']


def conv3x3(in_planes, out_planes, stride=1):
"3x3 convolution with padding"
return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,
padding=1, bias=False)


class BasicBlock(nn.Module):
expansion = 1

def __init__(self, inplanes, planes, stride=1, downsample=None):
super(BasicBlock, self).__init__()
self.conv_1 = conv3x3(inplanes, planes, stride)
self.bn_1 = nn.BatchNorm2d(planes)
self.relu = nn.ReLU(inplace=True)
self.conv_2 = conv3x3(planes, planes)
self.bn_2 = nn.BatchNorm2d(planes)
self.downsample = downsample
self.stride = stride

def forward(self, x):
residual = x

out = self.conv_1(x)
out = self.bn_1(out)
out = self.relu(out)

out = self.conv_2(out)
out = self.bn_2(out)

if self.downsample is not None:
residual = self.downsample(x)

out += residual
out = self.relu(out)

return out


class Bottleneck(nn.Module):
expansion = 4

def __init__(self, inplanes, planes, stride=1, downsample=None):
super(Bottleneck, self).__init__()
self.conv_1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
self.bn_1 = nn.BatchNorm2d(planes)
self.conv_2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
padding=1, bias=False)
self.bn_2 = nn.BatchNorm2d(planes)
self.conv_3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)
self.bn_3 = nn.BatchNorm2d(planes * 4)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
self.stride = stride

def forward(self, x):
residual = x

out = self.conv_1(x)
out = self.bn_1(out)
out = self.relu(out)

out = self.conv_2(out)
out = self.bn_2(out)
out = self.relu(out)

out = self.conv_3(out)
out = self.bn_3(out)

if self.downsample is not None:
residual = self.downsample(x)

out += residual
out = self.relu(out)

return out


class ResNet(nn.Module):

def __init__(self, depth, num_classes, block_name='BasicBlock'):
super(ResNet, self).__init__()

if block_name == 'BasicBlock':
assert (
depth - 2) % 6 == 0, 'depth should be 6n+2, e.g. 20, 32, 44, 56, 110, 1202'
n = (depth - 2) // 6
block = BasicBlock
elif block_name == 'Bottleneck':
assert (
depth - 2) % 9 == 0, 'depth should be 9n+2, e.g. 20, 29, 47, 56, 110, 1199'
n = (depth - 2) // 9
block = Bottleneck
else:
raise ValueError('block_name shoule be Basicblock or Bottleneck')

self.inplanes = 16
self.conv_1 = nn.Conv2d(3, 16, kernel_size=3, padding=1,
bias=False)
self.bn_1 = nn.BatchNorm2d(16)
self.relu = nn.ReLU(inplace=True)
self.stage_1 = self._make_layer(block, 16, n)
self.stage_2 = self._make_layer(block, 32, n, stride=2)
self.stage_3 = self._make_layer(block, 64, n, stride=2)
self.avgpool = nn.AvgPool2d(8)
self.fc = nn.Linear(64 * block.expansion, num_classes)

for m in self.modules():
if isinstance(m, nn.Conv2d):

nn.init.kaiming_normal_(m.weight.data)
elif isinstance(m, nn.BatchNorm2d):
m.weight.data.fill_(1)
m.bias.data.zero_()

def _make_layer(self, block, planes, blocks, stride=1):
downsample = None
if stride != 1 or self.inplanes != planes * block.expansion:
downsample = nn.Sequential(
nn.Conv2d(self.inplanes, planes * block.expansion,
kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(planes * block.expansion),
)

layers = []
layers.append(block(self.inplanes, planes, stride, downsample))
self.inplanes = planes * block.expansion
for i in range(1, blocks):
layers.append(block(self.inplanes, planes))

return nn.Sequential(*layers)

def forward(self, x):
x = self.conv_1(x)
x = self.bn_1(x)
x = self.relu(x)

x = self.stage_1(x)
x = self.stage_2(x)
x = self.stage_3(x)

x = self.avgpool(x)
x = x.view(x.size(0), -1)
x = self.fc(x)

return x


def resnet20(num_classes):
return ResNet(depth=20, num_classes=num_classes)


def resnet32(num_classes):
return ResNet(depth=32, num_classes=num_classes)


def resnet44(num_classes):
return ResNet(depth=44, num_classes=num_classes)


def resnet56(num_classes):
return ResNet(depth=56, num_classes=num_classes)


def resnet110(num_classes):
return ResNet(depth=110, num_classes=num_classes)


def resnet1202(num_classes):
return ResNet(depth=1202, num_classes=num_classes)

其它模型也一併能找到。

3. 使用

簡單運行下面的命令就可以運行程序了:


CUDA_VISIBLE_DEVICES=0 python -u train.py --work-path ./experiments/cifar10/lenet


CUDA_VISIBLE_DEVICES=0 python -u train.py --work-path ./experiments/cifar10/lenet --resume


CUDA_VISIBLE_DEVICES=0,1 python -u train.py --work-path ./experiments/cifar10/preresnet1202


CUDA_VISIBLE_DEVICES=0,1,2,3 python -u train.py --work-path ./experiments/cifar10/densenet190bc

我們使用 yaml 文件 config.yaml 保存參數,查看 ./experimets 中的任何文件以了解更多詳細信息。您可以通過 tensorboard 中 tensorboard --logdir path-to-event --port your-port 查看訓練曲線。培訓日誌將通過日誌轉儲,請檢查您工作路徑中的 log.txt。

1. 12 種 CNN 模型:

2. 正則化

默認的數據擴充方法是 RandomCrop+RandomHorizontalLip+Normalize,而 √ 表示採用哪種附加方法。

PS:Shake_Resnet26_2X64d 通過剪切和混合達到 97.71% 的測試精度!很酷,對吧?

3. 不同的學習速率調度器

最後,再附上項目地址:

https://github.com/BIGBALLON/CIFAR-ZOO

推薦閱讀:


李飛飛高徒 Karpathy 剛剛發布了 33 條神經網絡訓練秘技

吳恩達最新 TensorFlow 專項課程開放註冊

算法聖經《算法導論》第三版習題答案開源!

👆掃描上方二維碼關注

相關焦點

  • 【乾貨】基於pytorch的CNN、LSTM神經網絡模型調參小結
    的結合還有多層多通道CNN、LSTM、BiLSTM等多個神經網絡模型的的實現。Demo Site:  https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorchPytorch是一個較新的深度學習框架,是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。
  • 深度學習100+經典模型TensorFlow與Pytorch代碼實現大集合
    【導讀】深度學習在過去十年獲得了極大進展,出現很多新的模型,並且伴隨TensorFlow和Pytorch框架的出現,有很多實現,但對於初學者和很多從業人員
  • 【前沿】何愷明大神ICCV2017最佳論文Mask R-CNN的Keras/TensorFlow/Pytorch 代碼實現
    spm=5176.8067841.wnnow.14.ZrBcrm新智元AI World 2017世界人工智慧大會開場視頻來源:專知【新智元導讀】何愷明大神的論文Mask R-CNN 獲得ICCV最佳論文 ,而關於這篇論文的TensorFlow\Pytorch\Keras
  • 【深度學習】textCNN論文與原理——短文本分類(基於pytorch)
    前言前文已經介紹了TextCNN的基本原理,如果還不熟悉的建議看看原理:【深度學習】textCNN論文與原理[1]及一個簡單的基於pytorch的圖像分類案例:【深度學習】卷積神經網絡-圖片分類案例(pytorch實現)[2]。
  • 一份超全的PyTorch資源列表(GitHub 2.2K Stars)
    其中第 4 個項目可以用於將你的定製圖像分類模型和當前最佳模型進行對比,快速知道你的項目到底有沒有希望,作者戲稱該項目為「Project Killer」。1.pytorch vision:計算機視覺領域的數據集、轉換和模型。
  • 51 個深度學習目標檢測模型匯總,論文、源碼一應俱全!
    本文將會對目標檢測近幾年的發展和相關論文做出一份系統介紹,總結一份超全的文獻 paper 列表。模型列表先一睹為快!(建議收藏)圖中標紅的部分是作者認為比較重要,需要重點掌握的模型。當然每個人有都有各自的評價。FPS(速度)索引與硬體規格(如 CPU、GPU、RAM 等)有關,因此很難進行同等比較。解決方案是在具有相同規格的硬體上測量所有模型的性能,但這是非常困難和耗時的。比較結果如下:
  • 這些PyTorch Tricks你都還不知道?給你整理了集錦
    2、查看模型每層輸出詳情Keras有一個簡潔的API來查看模型的每一層輸出尺寸,這在調試網絡時非常有用。現在在PyTorch中也可以實現這個功能。torchvision \-c pytorch(希望Pytorch升級不會影響項目代碼)  12、網絡參數初始化神經網絡的初始化是訓練流程的重要基礎環節,會對模型的性能、收斂性、收斂速度等產生重要的影響。
  • Faster R-CNN 從實現到部署的那些坑
    在2019年來看,Faster R-CNN (後文簡稱frcnn)已經可以稱為經典的「老」模型了,由於frcnn足夠經典,可以作為其他算法的基線,所以我們打算在系統裡部署frcnn。而重新實現frcnn算法,一方面是因為能搜到的開源版本或者庫的版本太老,質量也良莠不齊,另一方面也是為了部署時能更為靈活地調整代碼。經過R-CNN和Fast RCNN的積澱,Ross B.
  • 13個算法工程師必須掌握的PyTorch Tricks
    學習率衰減8、凍結某些層的參數9、對不同層使用不同學習率10、模型相關操作11、Pytorch內置one hot函數12、網絡參數初始化13、加載內置預訓練模型   1、指定GPU編號設置當前使用的   2、查看模型每層輸出詳情Keras有一個簡潔的API來查看模型的每一層輸出尺寸,這在調試網絡時非常有用。現在在PyTorch中也可以實現這個功能。
  • 【他山之石】PyTorch trick 集錦
    02查看模型每層輸出詳情Keras有一個簡潔的API來查看模型的每一層輸出尺寸,這在調試網絡時非常有用。現在在PyTorch中也可以實現這個功能。https://discuss.pytorch.org/t/convert-int-into-one-hot-format/507/306防止驗證模型時爆顯存驗證模型時不需要求導,即不需要梯度計算,關閉autograd,可以提高速度,節約內存。如果不關閉可能會爆顯存。
  • 【附論文】白話CNN經典模型:VGGNet
    卷積神經網絡技術原理、AlexNet在本公眾號前面的文章已經有作了詳細的介紹,有興趣的同學可打開連結看看(白話卷積神經網絡 , 白話CNN經典模型:AlexNet)。一、VGG的特點先看一下VGG的結構圖
  • PyTorch Trick集錦
    2、查看模型每層輸出詳情Keras有一個簡潔的API來查看模型的每一層輸出尺寸,這在調試網絡時非常有用。現在在PyTorch中也可以實現這個功能。torchvision \-c pytorch(希望Pytorch升級不會影響項目代碼)  12、網絡參數初始化神經網絡的初始化是訓練流程的重要基礎環節,會對模型的性能、收斂性、收斂速度等產生重要的影響。
  • CNN結構設計和可視化工具
    整理盤點常用的神經網絡結構可視化工具一共盤點22個cnn可視化工具,其各有特點,我也只用過其中的兩三個。
  • 【他山之石】從編程實現角度學習Faster R-CNN(附極簡實現)
    對相應的bounding boxes 也也進行同等尺度的縮放。對於Caffe 的VGG16 預訓練模型,需要圖片位於0-255,BGR格式,並減去一個均值,使得圖片像素的均值為0。而對於位置的回歸損失,一樣採用Smooth_L1Loss, 只不過只對正樣本計算損失.而且是只對正樣本中的這個類別4個參數計算損失。舉例來說:一個RoI在經過FC 84後會輸出一個84維的loc 向量.
  • 10 分鐘完全讀懂 PyTorch
    作為目前越來越受歡迎的深度學習框架,pytorch 基本上成了新人進入深度學習領域最常用的框架。相比於 TensorFlow,pytorch 更易學,更快上手,也可以更容易的實現自己想要的 demo。今天的文章就從 pytorch 的基礎開始,幫助大家實現成功入門。
  • CNN-RNN中文文本分類,基於TensorFlow 實現
    : https://arxiv.org/abs/1408.5882還可以去讀dennybritz大牛的博客:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/以及字符級CNN的論文:https://arxiv.org
  • GitHub趨勢榜第一:TensorFlow+PyTorch深度學習資源大匯總
    :元子【新智元導讀】該項目是Jupyter Notebook中TensorFlow和PyTorch的各種深度學習架構,模型和技巧的集合。本文搜集整理了Jupyter Notebook中TensorFlow和PyTorch的各種深度學習架構,模型和技巧,內容非常豐富,適用於Python 3.7,適合當做工具書。大家可以將內容按照需要進行分割,列印出來,或者做成電子書等,隨時查閱。
  • 歷史最全深度學習與NLP核心概念、模型、策略及最新論文整理分享
    本資源整理了與自然語言處理(NLP)相關的深度學習技術核心概念,以及2019年概念相關最新的論文,涉及算法優化(Adam,Adagrad、AMS、Mini-batch SGD等),參數初始化(Glorot initialization、 He initialization),模型約束(Dropout、 Word Dropout、Patience、Weight Decay等),
  • 實戰 | 源碼入門之Faster RCNN
    代碼的主要文件-data文件中主要是文件的與dataset相關的文件-misc中有下載caffe版本預訓練模型的文件,可以不看-model文件中主要是與構建Faster Rcnn網絡模型有關的文件-utils中主要是一些輔助可視化和驗證的文件-train.py是整個程序的運行文件,下面有一部分會做介紹-
  • 輕鬆學 Pytorch:行人檢測 Mask-RCNN 模型訓練與使用
    這個例子是來自Pytorch官方的教程,我這裡是根據我自己的實踐重新整理跟解讀了一下,分享給大家。前面一篇已經詳細分享了關於模型本身,格式化輸入與輸出的結果。這裡使用的預訓練模型是ResNet50作為backbone網絡,實現模型的參數微調遷移學習。輸入的數據是RGB三通道的,取值範圍rescale到0~1之間。