Pytorch深度学习——AlexNet及数据集花分类

使用Pytorch实现AlexNet

AlexNet结构

在这里插入图片描述
input是224×224x3,此处padding应为[1,2],即在特征矩阵左边加上一列0,右边加上两列0,上面加上一列0,下面加上两列0在这里插入图片描述

特点

  • 使用Relu替换之前的sigmoid的作为激活函数
  • 使用数据增强Data Augmentation抑制过拟合,比如增加噪声,翻转,随机裁剪等
  • 使用LRN局部响应归一化
  • 在全连接层使用Dropout随机失活防止过拟合
  • 使用两块GPU 进行并行计算

第一层

在这里插入图片描述
Conv1的处理流程是: 卷积–>ReLU–>池化–>归一化。

  • 卷积,input是224×224x3,此处padding应为[1,2],即在特征矩阵左边加上一列0,右边加上两列0,上面加上一列0,下面加上两列0.使用48*2=96个11×11×3的卷积核,stride=4得到的FeatureMap为55×55×96,即output.{( 224-11+(1+2))/4+1=55}
  • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中,即input是55×55×96.
  • 池化Maxpool1,使用3×3步长为2的池化单元,padding=0(重叠池化,步长小于池化单元的宽度),输出为27×27×96 {55−3)/2+1=27}
  • 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为27×27×96,输出分为两组,每组的大小为27×27×48

第二层

在这里插入图片描述

Conv2的处理流程是:卷积–>ReLU–>池化–>归一化

  • 卷积,输入是2组27×27×48。使用2组,每组128个,尺寸为5×5×48的卷积核,并作了边缘填充padding=2,卷积的步长stride=1. 则输出的FeatureMap为2组,每组的大小为27×27x128. {(27+2∗2−5)/1+1=27}
  • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
  • 池化运算的尺寸为3×3,步长为2,padding=0,池化后图像的尺寸为(27−3)/2+1=13,输出为13×13×256
  • 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为13×13×256,输出分为2组,每组的大小为13×13×128

第三层

在这里插入图片描述
Conv3的处理流程是: 卷积–>ReLU

  • 卷积,输入是13×13×256,使用2组共384,尺寸为3×3×2563的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13x384
  • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中

第四层

在这里插入图片描述
Conv4和Conv3类似

  • 卷积,输入是13×13×384,分为两组,每组为13×13×192.使用2组,每组192个尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13x384,分为两组,每组为13×13×192
  • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中

第五层

在这里插入图片描述
Conv5处理流程为:卷积–>ReLU–>池化

  • 卷积,输入为13×13×384,分为两组,每组为13×13×192。使用2组,每组为128,尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13×256
  • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
  • 池化,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为 (13−3)/2+1=6,即池化后的输出为6×6×256

第六层

在这里插入图片描述

FC6全连接 -->ReLU -->Dropout

  • 卷积->全连接:
    输入为6×6×256,该层有4096个卷积核,每个卷积核的大小为6×6×256。由于卷积核的尺寸刚好与待处理特征图(输入)的尺寸相同,即卷积核中的每个系数只与特征图(输入)尺寸的一个像素值相乘,一一对应,因此,该层被称为全连接层。由于卷积核与特征图的尺寸相同,卷积运算后只有一个值,因此,卷积后的像素层尺寸为4096×1×1,即有4096个神经元。
  • ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
  • Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元

第七层

在这里插入图片描述
FC7全连接–>ReLU–>Dropout

  • 全连接,输入为4096的向量
  • ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
  • Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元

第八层

在这里插入图片描述
最后一步不进行失活
第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出1000个float型的值,这就是预测结果。

参数表

在这里插入图片描述

数据准备

数据集下载
(此处膜拜一波大佬)-----------太阳花的小绿豆
在这里插入图片描述

具体实现(由于原文是使用两块GPU进行并行运算,此处我们之分析一半的模型)

model.py
import torch.nn as nn
import torch

'''
使用nn.Sequential, 将一系列的层结构打包,形成一个整体
'''


class AlexNet(nn.Module):
    def __init__(self, num_classes=1000, init_weights=False):
        super(AlexNet, self).__init__()
        # 专门用来提取图像特征
        self.features = nn.Sequential(
            nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2),  # input[3, 224, 224]  output[48, 55, 55]
            nn.ReLU(inplace=True),  # inPlace=True, 增加计算量减少内存使用的一个方法
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[48, 27, 27]
            nn.Conv2d(48, 128, kernel_size=5, padding=2),           # output[128, 27, 27]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[128, 13, 13]
            nn.Conv2d(128, 192, kernel_size=3, padding=1),          # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 192, kernel_size=3, padding=1),          # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 128, kernel_size=3
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TonyHsuM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值