当前位置: 首页 > news >正文

AlexNet神经网络详解及VGGNet模型和

AlexNet模型细节

一共8层,5个卷积层,3个全连接层

AlexNet工程技巧

多GPU训练,ReLU激活函数,LRN归一化,Dropout,重叠池化,数据增强等

多GPU训练

除了将模型的神经元进行了并行,还使得通信被限制在了某些网络层。第三层卷积要使用第二层所有的特征图,但是第四层却只需要同一块GPU中的第三层的特征图。

LRN归一化

作用于ReLU层之后,抑制反馈较小的神经元,放大反馈较大的神经元,增强模型泛化能力。

取n个最近邻的特征通道计算,k=2,n=5,α=10-4,β=0.75

数据增强

使用裁剪翻转,PCA颜色扰动等方法,提高模型泛化能力

Dropout层

正则化方法,提高模型泛化

Dropout可以看成是一种模型集成方法,每次生成的网络结构都不一样,通过集成多个模型的方式能够有效地减少过拟合

重叠池化

相邻池化区域的窗口有重叠,可提高模型泛化能力

一般的池化是不重叠的,池化区域的窗口大小与步长相同,重叠池化

ReLU激活函数

简单而有效的激活函数,可加速模型收敛

测试时数据增强

将原始图片进行水平翻转、垂直翻转、对角线翻转、旋转角度等数据增强操作,得到多张图,分别进行推理,再融合得到最终输出结果。

VGGNet模型

小卷积的使用

DC Ciresan等人研究表明使用更小的卷积是有利的。

  • 网络层数增加(非线性表达能力增加)
  • 网络参数数量减少

不同版本的VGGNet

根据深度不同,由VGG11,VGG13,VGG16,VGG19

VGGNet测试

将全连接层替换为卷积,从而适应不同输入大小的图

VGGNet总体特点

与AlexNet同为链式结构,而且更加简单

  • 结构非常简洁,整个网络使用了同样大小的卷积核尺寸(3×3)和最大池化尺寸(2×2)
  • 几个小滤波器(3×3)卷积层的组合比一个大滤波器(5×5或7×7)卷积层好
  • 层数更深更宽(11层、13层、16层、19层)
  • 池化核变小且为偶数
  • 验证了通过不断加深网络结构可以提升性能

从零搭建VGGNet网络

# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy


class VGG(nn.Module):
    def __init__(self):
        super(VGG, self).__init__()
        self.conv1_1 = nn.Conv2d(3, 64, 3, 1, 1)
        self.conv1_2 = nn.Conv2d(64, 64, 3, 1, 1)
        self.pool1 = nn.MaxPool2d(2)

        self.conv2_1 = nn.Conv2d(64, 128, 3, 1, 1)
        self.conv2_2 = nn.Conv2d(128, 128, 3, 1, 1)
        self.pool2 = nn.MaxPool2d(2)

        self.conv3_1 = nn.Conv2d(128, 256, 3, 1, 1)
        self.conv3_2 = nn.Conv2d(256, 256, 3, 1, 1)
        self.conv3_3 = nn.Conv2d(256, 256, 3, 1, 1)
        self.pool3 = nn.MaxPool2d(2)

        self.conv4_1 = nn.Conv2d(256, 512, 3, 1, 1)
        self.conv4_2 = nn.Conv2d(512, 512, 3, 1, 1)
        self.conv4_3 = nn.Conv2d(512, 512, 3, 1, 1)
        self.pool4 = nn.MaxPool2d(2)

        self.conv5_1 = nn.Conv2d(512, 512, 3, 1, 1)
        self.conv5_2 = nn.Conv2d(512, 512, 3, 1, 1)
        self.conv5_3 = nn.Conv2d(512, 512, 3, 1, 1)
        self.pool5 = nn.MaxPool2d(2)

        # 全连接层
        self.fc1 = nn.Linear(7 * 7 * 512, 4096)
        self.fc2 = nn.Linear(4096, 4096)
        self.classifier = nn.Linear(4096, 1000)

    def forward(self, x):
        x = F.relu(self.conv1_1(x))
        x = F.relu(self.conv1_2(x))
        x = self.pool1(x)

        x = F.relu(self.conv2_1(x))
        x = F.relu(self.conv2_2(x))
        x = self.pool2(x)

        x = F.relu(self.conv3_1(x))
        x = F.relu(self.conv3_2(x))
        x = self.pool3(x)

        x = F.relu(self.conv4_1(x))
        x = F.relu(self.conv4_2(x))
        x = self.pool4(x)

        x = F.relu(self.conv5_1(x))
        x = F.relu(self.conv5_2(x))
        x = self.pool5(x)

        x = x.reshape(-1, 7 * 7 * 512)

        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.classifier(x)

        return x


if __name__ == '__main__':
    x = torch.randn((1, 3, 224, 224))
    vgg = VGG()
    y = vgg(x)
    print(y.shape)

    torch.save(vgg, 'vgg.pth')
    torch.onnx.export(vgg, x, 'vgg,onnx')

相关文章:

  • 深度学习中的数学基础:从向量到概率的全面解析
  • 测试第三课-------自动化测试相关
  • 第十九讲 XGBoost 二分类模型案例(遥感数据识别玉米与小麦地块)
  • HTML:网页的骨架 — 入门详解教程
  • Python heapq模块
  • 【Pandas】pandas DataFrame items
  • AIGC工具平台-建筑平面图3D渲染
  • Android studio Unknown Kotlin JVM target: 21
  • macOS 上使用 Homebrew 安装和配置 frp 客户端
  • 【C++】——lambda表达式
  • 数据资产保护与数据知识产权保护有何不同?
  • JavaScript中的Transferable对象教程
  • 企业级硬盘的测试流程
  • L2TP实验(无图后补)
  • 老旧测试用例生成平台异步任务与用户通知优化
  • OOM问题排查和解决
  • Java工厂模式解析:灵活对象创建的实践指南
  • Java LinkedList深度解析:双向链表的实现艺术与实战指南
  • 【Python爬虫】简单介绍
  • 16bit转8bit的常见方法(图像归一化)
  • 城事|喊侬白相,长兴太湖9号公路邀上海市民共赴诗意之旅
  • 2025年一季度上海市生产总值
  • 最高法典型案例:学生在校受伤,学校并非必然担责
  • 正荣地产旗下“H20正荣2”债未能于宽限期内支付分期偿付款,尚未就新兑付方案达成一致
  • 深一度|坚守17年,这件事姚明就算赔钱也在继续做
  • 经常失眠,睡眠质量低?也许只是缺这种营养