带你学会深度学习之卷积神经网络[CNN] - 4

news2024/9/25 21:30:51

前言

本文不讲述如泛化,前向后向传播,过拟合等基础概念。

本文图片来源于网络,图片所有者可以随时联系笔者删除。

本文提供代码不代表该神经网络的全部实现,只是为了方便展示此模型的关键结构。

CNN,常用于计算机视觉,是计算机视觉方面常见的基础模型,后面发展的有很多其他变种,也被用于文字处理等非计算机视觉领域。概念是由AI领域著名大佬LeCun等人在上世纪90年代提出。CNN之所以在计算机视觉领域(CNN、)表现出色,是因为它们能够自动并有效地捕捉到图像中的空间层次结构,这一点对于理解像素组成的图像至关重要。通过利用这种层次结构,CNN能够识别和分类从简单到复杂的对象和场景,无论它们的大小、位置或者是姿态如何变化。CNN的变种和改进模型层出不穷:AlexNet、VGG、GoogLeNet到ResNet和DenseNet等等等等。

正文

前文提到AlexNet,其在LeNet的基础上增加了3个卷积层,同时AlexNet作者对它们的卷积窗口、输出通道数和构造顺序均做了大量的调整,使其在图像分类效果反超机器学习方式,意义重大,但是为什么AlexNet行之有效,其实还是偏于黑盒,本文继续介绍几个CNN方面经典的模型

VGG - by Visual Geometry Group实验室

VGG网络是深度学习领域一个非常重要的里程碑,VGG网络由牛津大学的视觉几何组(Visual Geometry Group)提出,并且在2014年的ImageNet挑战赛中取得了优异的成绩。

结构

VGG网络的关键贡献是展示了通过增加网络深度可以显著提高模型的性能。它通过重复使用小的卷积核(3x3)和最大池化层(2x2)来构建深度网络。VGG有几个版本,最著名的是VGG-16和VGG-19,数字代表网络中的层数(包括卷积层和全连接层)。

VGG-16的结构如下:

  • 输入层:224x224 RGB图像
  • 卷积层:多个卷积层,使用3x3的卷积核,步长为1
  • 池化层:几个最大池化层,使用2x2的池化窗口,步长为2
  • 全连接层:三个全连接层,最后一层为1000类输出,使用softmax激活函数
  • 激活函数:所有隐藏层使用ReLU激活函数

关键变化

与AlexNet相比,VGG网络的几个关键变化如下:

  1. 更小的卷积核:VGG网络使用了3x3的卷积核,可以捕获到像素间最基本的特征。虽然小,但通过叠加多个卷积层,能够覆盖更大的感受野。

  2. 增加深度:VGG网络明显增加了网络的深度,这有助于学习更加复杂的特征表示。

  3. 统一卷积核大小:VGG网络中所有的卷积层都使用3x3的卷积核,简化了模型结构。

同时,这也使得VGG比AlexNet计算更慢

更深的网络结构:VGG网络比AlexNet有更多的层(例如,VGG-16有16个可训练层,而AlexNet只有8个)。这种增加的深度意味着网络在前向传播和反向传播过程中需要进行更多的计算。此外,梯度更新和权重更新的计算量也随之增加。

更高的存储需求:在VGG网络中,由于有更多的中间层,因此在训练过程中需要存储更多的中间特征图(feature maps)。这些特征图需要大量的内存或显存来存储,尤其是在网络的前几层,特征图的尺寸较大,消耗的存储资源更多。

示例代码

import torch
import torch.nn as nn

class VGG16(nn.Module):
    def __init__(self, num_classes=1000):
        super(VGG16, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            # 重复上述模式构建更深的网络层...
        )
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, num_classes),
        )
        
    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

GoogleNet - by Google(强大的谷歌)

GoogleNet(也称为Inception v1)是另一种深度学习架构,它在2014年赢得了ImageNet图像识别挑战赛。GoogleNet的主要贡献是它的Inception模块,这种模块设计使得网络能够在保持计算资源可控的同时,大幅增加深度和宽度。

Inception模块:Inception模块的核心思想是在同一层内并行使用不同尺寸的卷积核(1x1, 3x3, 5x5)和最大池化(3x3),然后将这些操作的输出沿深度方向拼接起来。这种设计允许网络自动学习决定在每一层应该使用何种尺寸的卷积核,从而更有效地捕获图像特征。

1x1卷积核:GoogleNet通过1x1卷积核来进行降维,这样做可以显著减少参数数量和计算量,同时保持特征的有效性。1x1卷积在这里充当了降维和增维的作用,既减少了计算量,又保留了重要的特征信息。

深度和宽度的增加:通过Inception模块,GoogleNet能够在不显著增加计算负担的情况下,增加网络的深度和宽度。这使得模型能够学习到更加复杂和抽象的特征表示。

辅助分类器:在网络的中间层,GoogleNet引入了辅助分类器,以在训练过程中提供额外的梯度信号,帮助缓解深层网络训练中的梯度消失问题。在最终的模型中,这些辅助分类器不会被用于预测,仅在训练阶段使用。

无全连接层:与AlexNet和VGG不同,GoogleNet在网络顶部没有使用全连接层,而是使用平均池化层来减少每个特征图的维度,这样做显著降低了模型的参数数量。

示例代码

Inception模块

import torch
import torch.nn as nn
import torch.nn.functional as F

class InceptionModule(nn.Module):
    def __init__(self, in_channels):
        super(InceptionModule, self).__init__()
        self.branch1x1 = nn.Conv2d(in_channels, 64, kernel_size=1)

        self.branch3x3 = nn.Sequential(
            nn.Conv2d(in_channels, 48, kernel_size=1),
            nn.Conv2d(48, 64, kernel_size=3, padding=1)
        )

        self.branch5x5 = nn.Sequential(
            nn.Conv2d(in_channels, 64, kernel_size=1),
            nn.Conv2d(64, 96, kernel_size=5, padding=2)
        )

        self.branch_pool = nn.Sequential(
            nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels, 32, kernel_size=1)
        )

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch3x3 = self.branch3x3(x)

        branch5x5 = self.branch5x5(x)

        branch_pool = self.branch_pool(x)

        # Concatenate the outputs of the branches
        outputs = [branch1x1, branch3x3, branch5x5, branch_pool]
        return torch.cat(outputs, 1)  

简化的GoogleNet

class SimpleGoogleNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(SimpleGoogleNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 192, kernel_size=3, padding=1)
        self.inception1 = InceptionModule(192)
        self.inception2 = InceptionModule(256)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(512, num_classes)  

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = self.inception1(x)
        x = self.inception2(x)
        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1533726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSM欧诗漫加入美妆可持续联盟,共话绿色发展新路径

3月12日,中国化妆品行业首个可持续联盟——美妆可持续联盟(BSC)正式宣告成立。作为国内珍珠科技美肤领军品牌,OSM欧诗漫受邀成为可持续发展联盟的首批成员,并在第46个植树节之际,与80余家中外同行企业携手种…

rfc793-timewait状态

time wait状态 主动关闭连接的一方,在四次挥手最后一次发送 ACK 后,进入 TIME_WAIT 状态。在这个状态里,主动关闭连接一方等待 2MSL(Maximum Segment Life,报文段最大生存时间,在RFC793 中定义为 2 min&…

表情识别数据集

表情视频数据集 在许多的研究中,研究者通常会把人脸表情识别区分为静态的人脸表情识别(static facial emotion recognition)和动态的人脸表情识别(dynamic facial emotion recognition)。前者希望通过单张图片辨别人的表情从而达到识别人情绪的目的,而后者希望感知视频/…

docker一键部署若依前后端分离版本

比如这里把文件放到/xin/docker/jiaoZ/的目录下,jar包和下面的配置文件都放在这个文件夹下。 注意要把jar端口改为你实际启动的,映射端口也可以改为你想要的。 这里的映射端口为:nginx监听80端口,jar在8620端口,mysq…

java并发编程之 volatile关键字

1、简单介绍一下JMM Java 内存模型(Java Memory Model 简称JMM)是一种抽象的概念,并不真实存在,指一组规则或规范,通过这组规范定义了程序中各个变量的访问方式。java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问…

C语言每日一题06

一、题目 二、解析 void main () { char c1,c2; int a1,a2; c1 getchar ();//读取第一个输入,c11 scanf (“%3d”,&a1&#xff…

Python螺旋折线蓝桥杯(来源lanqiao.cn 题目176) 时间超限

题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y),你能计算出dis(X, Y)吗? 输入格式 …

MySQL--Buffer Pool

虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。为此,Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。 有了缓冲池后: …

Linux系统本地部署Docker Compose UI服务结合内网穿透实现公网访问

文章目录 1. 安装Docker2. 检查本地docker环境3. 安装cpolar内网穿透4. 使用固定二级子域名地址远程访问 Docker Compose UI是Docker Compose的web界面。这个项目的目标是在Docker Compose之上提供一个最小的HTTP API,同时保持与Docker Compose CLI的完全互操作性。…

如何在CentOS搭建docker compose ui可视化工具并无公网IP远程管理容器

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

谷歌Gemma大模型部署记录

谷歌Gemma大模型部署记录 配置信息 1.系统:Ubuntu20 2.显卡:RTX3060 6G 一、安装Ollama 官网地址:https://ollama.com/download/linux 按照指令安装 curl -fsSL https://ollama.com/install.sh | sh二、运行模型 输入指令:…

ubuntu中截圖工具

文章目录 一、flameshot1、安裝指令2、延遲截圖 二、总结 github社區 參考1 參考二 一、flameshot 1、安裝指令 sudo apt install flameshot如果想要把此時的照片復制下來,點擊從右數第六個圖標 2、延遲截圖 flameshot gui -d 3000二、 总结

使用腾讯云轻量应用服务器怎么搭建网站?

2024年腾讯云轻量应用服务器搭建网站教程,建站大全,包括WordPress建站、宝塔面板安装、Typecho博客搭建、LAMP、LNMP、Node.js、ASP.NET、Docker、K3s、WooCommerce、互动直播后台搭建、SRS音视频服务器、Matomo网站数据统计等网站搭建教程,腾…

【JS】浅谈Promise

Promise 前言一、Promise是什么?二、为什么用Promise?2.1解决回调地狱2.2 集中错误处理2.3代码解耦和复用 三、做什么?四、原型方法和实例方法?五、应用场景? 前言 promise是es6的新规范,它是一种异步解决…

【漏洞复现】6.Struts2 S2-061 远程命令执行漏洞(CVE-2020-17530)复现与分析

文章目录 1. 预备知识2. 漏洞复现2.1 漏洞介绍2.2 漏洞原理分析2.2.1 Apache Struts2架构2.2.2 OGNL语法介绍2.2.3漏洞原理 2.3 漏洞复现2.3.1 靶场搭建2.3.2 漏洞探测2.3.3 漏洞利用2.3.4 POC分析 2.4 漏洞修复 1. 预备知识 Struts是一个用于开发Java EE网络应用程序的开放源代…

2024年03月 Discourse 3.3.0.beta1 版本的更新

在这个版本的更新中 Discourse 完成了 Ember 5 版本的升级和更新。 Ember.js是一个用于创建 web 应用的 开源JavaScript MVC 框架,采用基于字符串的Handlebars 模板,支持双向绑定、观察者模式、计算属性(依赖其他属性动态变化)、…

扩展以太网(数据链路层)

目录 一、在物理层扩展以太网 二、在数据链路层扩展以太网 三、以太网交换机的特点 四、以太网交换机的交换方式 五、以太网交换机的自学习功能 六、小结 一、在物理层扩展以太网 使用光纤扩展: • 主机使用光纤(通常是一对光纤)和…

C语言基础知识点(十八)联合、

【C语言】联合体-共用体 (union) 详解-阿里云开发者社区 (aliyun.com) 联合 在C语言中是一种数据类型,能在同一个内存空间中存储不同的数据类型(不是同时储存)。 典型用法:设计一种表以存储及无规律、实…

Redis相关操作大全一篇全搞定

Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 10 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。 Redi…

【java】java环境变量分类

测试代码&#xff1a; public class TestSys {public static void main(String[] args) {/*** 获取所有的系统环境变量*/Map<String, String> map System.getenv();map.forEach((key, value) -> System.out.printf("env&#xff1a;key:%s->value:%s%n"…