AlexNet网络结构基于Pytorch编写
一、AlexNet模型
-网络总体结构
-各模块之间的联系
从上面两图中我们可以将AlexNet模型分为
1. Features
2. Classifier
二、Features
-图解模型
从图中我们可以看出AlexNet对图像的处理顺序为:
卷积->relu激活->最大池化->
卷积->relu激活->最大池化->
卷积->relu激活->卷积->relu激活->卷积->relu激活->最大池化
-Python源码
import torch.nn as nn
class Features(nn.Module):
def __init__(self):
super(Features, self).__init__()
self.conv2drelu1 = Conv2dReLU(in_channels=3, out_channels=64, kernel_size=11, stride=4, padding=2)
self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=2)
self.conv2drelu2 = Conv2dReLU(in_channels=64, out_channels=192, kernel_size=5, padding=2)
self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=2)
self.conv2drelu3 = Conv2dReLU(in_channels=192, out_channels=384, kernel_size=3, padding=1)
self.conv2drelu4 = Conv2dReLU(in_channels=384, out_channels=256, kernel_size=3, padding=1)
self.conv2drelu5 = Conv2dReLU(in_channels=256, out_channels=256, kernel_size=3, padding=1)
self.maxpool3 = nn.MaxPool2d(kernel_size=3, stride=2)
def forward(self, x):
o1 = self.conv2drelu1(x)
o2 = self.maxpool1(o1)
o3 = self.conv2drelu2(o2)
o4 = self.maxpool2(o3)
o5 = self.conv2drelu3(o4)
o6 = self.conv2drelu4(o5)
o7 = self.conv2drelu5(o6)
o8 = self.maxpool3(o7)
return o8
三、Classifier
-图解模型
从图中我们可以看出AlexNet对特征提取后的数据进行了Dropout和FC:
-Python源码
import torch.nn as nn
class Classifier(nn.Module):
def __init__(self, num_classes):
super(Classifier, self).__init__()
self.num_classes = num_classes
self.dropout1 = nn.Dropout()
self.fc1 = nn.Linear(in_features=9216, out_features=4096)
self.relu1 = nn.ReLU(inplace=True)
self.dropout2 = nn.Dropout()
self.fc2 = nn.Linear(in_features=4096, out_features=4096)
self.relu2 = nn.ReLU(inplace=True)
self.fc3 = nn.Linear(in_features=4096, out_features=num_classes)
def forward(self, x):
"""
Args:
x: [N,9216]
"""
o1 = self.dropout1(x)
o2 = self.fc1(o1)
o3 = self.relu1(o2)
o4 = self.dropout2(o3)
o5 = self.fc2(o4)
o6 = self.relu2(o5)
o7 = self.fc3(o6)
return o7
四、整体汇总
定义AlexNet类
import torch.nn as nn
class Conv2dReLU(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=(1, 1), padding=(0, 0), bias=True):
super(Conv2dReLU, self).__init__()
self.in_channels = in_channels
self.out_channels = out_channels
self.kernel_size = kernel_size
self.stride = stride
self.padding = padding
self.bias = bias
self.conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding, bias=bias)
self.relu = nn.ReLU(inplace=True)
def forward(self, x):
"""
Args:
x: [N,C,H,W]
"""
o1 = self.conv(x)
o2 = self.relu(o1)
return o2
class Features(nn.Module):
def __init__(self):
super(Features, self).__init__()
self.conv2drelu1 = Conv2dReLU(in_channels=3, out_channels=64, kernel_size=11, stride=4, padding=2)
self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=2)
self.conv2drelu2 = Conv2dReLU(in_channels=64, out_channels=192, kernel_size=5, padding=2)
self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=2)
self.conv2drelu3 = Conv2dReLU(in_channels=192, out_channels=384, kernel_size=3, padding=1)
self.conv2drelu4 = Conv2dReLU(in_channels=384, out_channels=256, kernel_size=3, padding=1)
self.conv2drelu5 = Conv2dReLU(in_channels=256, out_channels=256, kernel_size=3, padding=1)
self.maxpool3 = nn.MaxPool2d(kernel_size=3, stride=2)
def forward(self, x):
"""
Args:
x: [N,C,H,W]
"""
o1 = self.conv2drelu1(x)
o2 = self.maxpool1(o1)
o3 = self.conv2drelu2(o2)
o4 = self.maxpool2(o3)
o5 = self.conv2drelu3(o4)
o6 = self.conv2drelu4(o5)
o7 = self.conv2drelu5(o6)
o8 = self.maxpool3(o7)
return o8
class Classifier(nn.Module):
def __init__(self, num_classes):
super(Classifier, self).__init__()
self.num_classes = num_classes
self.dropout1 = nn.Dropout()
self.fc1 = nn.Linear(in_features=9216, out_features=4096)
self.relu1 = nn.ReLU(inplace=True)
self.dropout2 = nn.Dropout()
self.fc2 = nn.Linear(in_features=4096, out_features=4096)
self.relu2 = nn.ReLU(inplace=True)
self.fc3 = nn.Linear(in_features=4096, out_features=num_classes)
def forward(self, x):
o1 = self.dropout1(x)
o2 = self.fc1(o1)
o3 = self.relu1(o2)
o4 = self.dropout2(o3)
o5 = self.fc2(o4)
o6 = self.relu2(o5)
o7 = self.fc3(o6)
return o7
class AlexNet(nn.Module):
def __init__(self, num_classes):
super(AlexNet, self).__init__()
self.num_classes = num_classes
self.features = Features()
self.aavgpool = nn.AdaptiveAvgPool2d(output_size=6)
self.flatten = nn.Flatten()
self.classifier = Classifier(num_classes=num_classes)
def forward(self, x):
o1 = self.features(x)
o2 = self.aavgpool(o1)
o3 = self.flatten(o2)
o4 = self.classifier(o3)
return o4