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

本文详细介绍了AlexNet模型的结构,包括卷积层、ReLU激活、最大池化等关键组件。通过Python源码展示了如何使用PyTorch构建Features和Classifier模块。整篇博客围绕AlexNet在计算机视觉中的应用展开。
摘要由CSDN通过智能技术生成

AlexNet网络结构基于Pytorch编写

一、AlexNet模型

-网络总体结构AlexNet

-各模块之间的联系
模块分开
从上面两图中我们可以将AlexNet模型分为

1. Features
2. Classifier


二、Features
-图解模型
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

-图解模型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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值