文章目錄
- ImageNet Classification with Deep Convolutional Neural Network
- 歷史意義
- Abstract
- Introduction and dataset
- AlexNet's struction
- 結構特點
- 訓練技巧
- Summary
- 代碼復現
- 運行效果
ImageNet Classification with Deep Convolutional Neural Network
歷史意義
1、拉開卷積神經網路統治計算機視覺的序幕
2、加速計算機視覺應用落地
Abstract
1、比賽資料集上運行效果極佳
2、AlexNet由五個conv層和3個fullconnection層構成,引數眾多(the net contains eight layers with weights : first five are convolutional and the remaining three are fully-connected)
3、采用ReLu作為激活函式,同時使用GPU加快訓練
4、采用Dropout減輕過擬合
Introduction and dataset
AlexNet’s struction

結構特點
1、ReLu Nonlinearrity
(1)使網路訓練更快(2)防止梯度消失(相較于Sigmoid,沒有飽和點)(3)使網路具有稀疏性
2、Training on Multiple GPUs
3、Local Response Normalization(LRN,區域回應標準化){現在已經被BN取代}
有助于AlexNet泛化能力提升,靈感來自于真實神經元的側抑制(lateral inhibition)
側抑制:細胞分化時,他對周圍cell產生抑制信號,阻止其他cell向相同方向分化,最終表現為細胞命運的不同

(i表示channel_size;j平方累加索引,代表從j-i的像素值平方求和;x,y表示像素位置;a表示feature map中i對應像素的具體值;N表示feature map里面最內層向量的列數;其余參量均為超引數)
4、Overlapping Pooling(重疊池化)
通過設定stride=2,kernel_size=3實作池化探測區域存在重疊部分
訓練技巧
1、Data Augmentation(資料增強)
針對位置
訓練階段:
(1)圖片統一縮放至256256
(2)隨機位置裁剪出224224區域
(3)隨機進行水平翻轉
測驗階段:
(1)圖片統一縮放至256256
(2)裁剪出5個224224區域
(3)均進行水平翻轉,共得到10張224*224圖片
針對顏色
通過PCA方法修改RGB通道的像素值,實作顏色擾動
2、Dropout(隨機失活)
隨機:dropout probability(p=0.5)【訓練和測驗兩個階段的資料尺度變化測驗時,神經元輸出值乘以p】
失活:weight = 0
Summary
1、ReLU;2、LRN;3、Overlapping;4、Augmentation;5、Dropout
代碼復現
ps:博主手撕的是pytorch里面封裝的AlexNet,里面部分引數可能會和原文有所差異
import torch
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self, num_classes):
super(AlexNet, self).__init__()
# 第一次卷積操作
self.conv1 = nn.Sequential(nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True))
# 第一次池化操作
self.pool1 = nn.MaxPool2d(kernel_size=3, stride=2)
# 第二次卷積操作
self.conv2 = nn.Sequential(nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True))
# 第二次池化
self.pool2 = nn.MaxPool2d(kernel_size=3, stride=2)
# 第三次卷積操作
self.conv3 = nn.Sequential(nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True))
# 第四次卷積操作
self.conv4 = nn.Sequential(nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True))
# 第五次卷積操作
self.conv5 = nn.Sequential(nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True))
# 第三次池化
self.pool3 = nn.MaxPool2d(kernel_size=3, stride=2)
# 平均池化
self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
#
self.classifier = nn.Sequential(
# 隨機丟棄部分神經元
nn.Dropout(),
# 第一次全連接操作
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
# 第二次全連接操作
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
# 第三次全連接操作
nn.Linear(4096, num_classes),
)
def forward(self, x: torch.Tensor):
print("輸入影像尺寸為{}".format(x.size()))
x = self.conv1(x)
print("經過第一次卷積后影像尺寸為{}".format(x.size()))
x = self.pool1(x)
print("經過第一次池化后影像尺寸為{}".format(x.size()))
x = self.conv2(x)
print("經過第二次卷積后影像尺寸為{}".format(x.size()))
x = self.pool2(x)
print("經過第二次池化后影像尺寸為{}".format(x.size()))
x = self.conv3(x)
print("經過第三次卷積后影像尺寸為{}".format(x.size()))
x = self.conv4(x)
print("經過第四次卷積后影像尺寸為{}".format(x.size()))
x = self.conv5(x)
print("經過第五次卷積后影像尺寸為{}".format(x.size()))
x = self.pool3(x)
print("經過第三次池化后影像尺寸為{}".format(x.size()))
x = self.avgpool(x)
print("經過平均池化后影像尺寸為{}".format(x.size()))
x = torch.flatten(x, 1) # flatten(x,1)是按照x的第1個維度拼接(按照列來拼接,橫向拼接)
print("經過拉伸后影像尺寸為{}".format(x.size()))
x = self.classifier(x)
print("經過三層全連接后影像尺寸為{}".format(x.size()))
return x
if __name__ == "__main__":
import torch as t
input = t.randn(1, 3, 224, 224)
net = AlexNet(2)
out = net(input)
運行效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/433377.html
標籤:AI
上一篇:【數字信號處理】線性常系數差分方程 ( 卷積 與 “ 線性常系數差分方程 “ | 使用 matlab 求解 “ 線性常系數差分方程 “ )
