基于Pytorch的卷积神经网络AlexNet网络的代码编写

AlexNet网络结构基于Pytorch编写

一、AlexNet模型

-网络总体结构基于Pytorch的卷积神经网络AlexNet网络的代码编写_第1张图片

-各模块之间的联系
基于Pytorch的卷积神经网络AlexNet网络的代码编写_第2张图片
从上面两图中我们可以将AlexNet模型分为

1. Features
2. Classifier


二、Features
-图解模型
基于Pytorch的卷积神经网络AlexNet网络的代码编写_第3张图片
从图中我们可以看出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

-图解模型基于Pytorch的卷积神经网络AlexNet网络的代码编写_第4张图片
从图中我们可以看出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

你可能感兴趣的:(深度学习,神经网络,pytorch)