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

news2024/11/15 9:42:05

前言

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

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

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

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

正文

新概念之 梯度消失、梯度爆炸、数据标准化、批量归一化

梯度消失

在深度神经网络中,当梯度的值在经过多层传播后变得非常小,以至于权重几乎不更新,从而导致网络难以学习,这种现象称为梯度消失。

梯度爆炸

与梯度消失相反,梯度爆炸是指梯度的值变得异常大,导致权重更新过度,使模型无法收敛。

数据标准化

据标准化是将数据按比例缩放,使之落入一个小的特定区间。

  1. 未经标准化的数据可能会有很大的方差,导致某些特征在梯度下降过程中占据主导地位,标准化后的数据有助于确保所有特征在学习过程中以相似的尺度参与,从而加速收敛。
  2. 同时某些激活函数(如sigmoid或tanh)在接收高值或低值输入时,可能会导致梯度消失问题,标准化有助于减轻这一问题。

一种常见的方法是特征缩放,使得数据的平均值为0,方差为1。

import numpy as np

X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

mean = np.mean(X, axis=0)
std = np.std(X, axis=0)
X_normalized = (X - mean) / std

print("Normalized Data:\n", X_normalized)

批量归一化

在深度网络训练过程中,每层输入的分布会因为前一层参数的更新而变化,这种现象称为内部协变量偏移。

  1. 批量归一化通过规范化层输入,有助于稳定分布,从而提高训练效率和稳定性。
  2. 未经归一化处理的数据可能导致模型训练时梯度消失或爆炸,批量归一化也有助于减轻这一问题。

具体原理是通过调整网络中间层的输入,使其均值为0,方差为1,实际我们不需要管这些,直接调用已有API。如下为谷歌Tensorflow框架示例

import tensorflow as tf
from tensorflow.keras.layers import BatchNormalization

x = tf.random.normal(shape=(10, 100))

bn_layer = BatchNormalization()
output = bn_layer(x, training=True)

print("Batch Normalized Output:\n", output)

大名鼎鼎ResNet 残差连接

随着网络深度的增加,理论上模型的表示能力应该变得更强,能够更准确地拟合复杂的数据模式。然而过深的网络容易遭受梯度消失或梯度爆炸的问题,导致训练变得异常困难。

此外,还存在一种直观上似乎矛盾的现象:虽然增加网络层理论上不应降低模型的性能(因为新模型解的空间包含了原模型解的空间,如果额外层仅执行恒等映射,新旧模型性能应相当)。

但在实际操作中,添加过多层后,模型的训练误差往往不降反升。

何恺明等人在2015年提出了一种创新的网络架构:残差网络(ResNet)。残差网络通过引入“跳过连接”(残差连接),允许数据直接跳过某些层。在这种设计下,新增加的层不需要学习出一个完整的变换,而是学习与恒等映射的残差。

这一简单而强大的操作极大地缓解了深层网络中的梯度消失问题,使得训练深达数百甚至数千层的网络成为可能,而不损害模型的训练性能。

这非常深刻影响了后续深度神经网络的设计思路。

残差块(ResNet核心组件)图例如下:

adf1f688c34646a09929ea7895f1fcbc.png

代码如下:

import tensorflow as tf
from tensorflow.keras import layers, models

def residual_block(x, filters, kernel_size=3, stride=1):
    """构建一个残差块"""
    y = layers.Conv2D(filters, kernel_size=kernel_size, strides=(stride, stride), padding='same')(x)
    y = layers.BatchNormalization()(y)
    y = layers.ReLU()(y)
    
    y = layers.Conv2D(filters, kernel_size=kernel_size, strides=(1, 1), padding='same')(y)
    y = layers.BatchNormalization()(y)

    # 当输入和输出维度不一致时,使用1x1卷积调整维度
    if x.shape[-1] != filters or stride != 1:
        x = layers.Conv2D(filters, kernel_size=1, strides=(stride, stride), padding='same')(x)
        x = layers.BatchNormalization()(x)
    
    out = layers.Add()([x, y])
    out = layers.ReLU()(out)
    return out

接下来就可以堆叠残差块来构建一个简单的ResNet模型。

当然,还可以包含更多的残差块和更复杂的结构,如ResNet-50以及ResNet-101。

def build_resnet(input_shape, num_classes):
    inputs = layers.Input(shape=input_shape)
    
    x = layers.Conv2D(64, (7, 7), strides=(2, 2), padding='same')(inputs)
    x = layers.BatchNormalization()(x)
    x = layers.ReLU()(x)
    x = layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)
    
    # 堆叠残差块
    x = residual_block(x, 64)
    x = residual_block(x, 128, stride=2)
    x = residual_block(x, 256, stride=2)
    x = residual_block(x, 512, stride=2)
    
    x = layers.GlobalAveragePooling2D()(x)
    outputs = layers.Dense(num_classes, activation='softmax')(x)
    
    model = models.Model(inputs=inputs, outputs=outputs)
    return model

其他的经典CNN神经网络

DenseNet

DenseNet是一种网络架构,其核心思想是通过将每层直接与前面所有层相连,来促进信息的流动和重用。这种设计导致网络在深度增加的同时,参数的数量却相对较少,因为它避免了重复学习相似的特征。

在DenseNet中,第i层接收前面所有0...i-1层的特征图作为输入。这种密集连接机制增强了特征的传递,使得网络可以更深。由于每层都可以访问前面层的特征,这使得网络在特征学习上更为高效,能够用更少的参数达到更好的性能。

DenseNet通过引入Transition Layers(过渡层)控制特征图的维度,其中过渡层由卷积层和池化层组成,用于连接不同的Dense Block(密集连接块)

8803118741c0439996734e57c4c2dffa.png

MobileNet

MobileNet系列专为移动和嵌入式视觉应用设计,它对模型大小和计算速度进行了优化,以适应计算能力有限的设备。

MobileNet的核心是深度可分离卷积,这一技术将传统的卷积操作分解为深度卷积(每个输入通道单独卷积)和逐点卷积(1x1卷积用于组合深度卷积的输出)。这种分解大大减少了模型的参数和计算量。

MobileNet引入了两个超参数,宽度乘数(width multiplier)和分辨率乘数(resolution multiplier),允许开发者根据具体需求调整模型的大小和速度。

大概就是如下这张图,把深度卷积和逐点卷积分开操作,大大减少了模型参数。

ae10a01bc333454992befb6dd1e8f08d.png

更多

还有着更多经典的神经网络,不过本系列文章不再详细介绍,CNN篇完结,后续会写CNN实战CV任务的文章,欢迎继续阅读。

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

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

相关文章

Leetcode 200. 岛屿数量

心路历程: 在没有看图论这一章之前看这道题没什么直接的思路,在看完图论之后,学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅,但是需要处理的细节第一次没怎么处理好,花了很多…

如何使用Android平板公网访问本地Linux code-server

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以,这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

OR-806A固态继电器光耦

固态继电器 VL60V输出端击穿电压光耦 高隔离电压 60 至 600V 输出耐受电压 工业温度范围:-40 to 85℃ 高灵敏度和高速响应、 特征 输入和输出之间的高隔离电压 (Viso:5000 V rms)。 控制低电平模拟信号 高灵敏度和高速响应…

含“AI”量上涨,智能模组SC208系列助力智慧零售全场景高质发展

AI正重塑智慧零售产业,加速零售在采购、生产、供应链、销售、服务等方面改善运营效率和用户体验。零售行业经历了从线下到线上再到全渠道融合发展过程,“提质、降本、增效、高体验”是亘古不变的商业化与智能化方向。含“AI”量逐渐上涨的智慧零售正经历…

Linux:Gitlab:16.9.2 (rpm包) 部署及基础操作(1)

1.基础环境 我只准备了一台gitlab服务器,访问就用真机进行访问,接下来介绍一下详细配置 centos7 内网ip:192.168.6.7 外网ip:172.20.10.4 运行内存:4G CPU:4核 先去配置基础环境 关闭防火墙以及selinux 再去下载基础的运行…

差分逻辑电平 --- SSTL、HSTL、HSUL结构

SSTL/HSTL/HSUL 属于DDR存储器接口逻辑电平,虽然是单端,本质上是差分对,因实现机制是将信号与参考电平Vref组成差分对进行比较。 SSTL SSTL:Stub Series Termination Logic,短截线串联端接逻辑。 我们所熟知的DDR 采…

记录西门子200:PUT和GET通讯测试

GET/PUT:S7-200SMART之间专有通讯协议。 准备两台Smart-PLC,这里使用的ST60和CR40。外加一个交换机。 CR40的地址设置是:192.168.2.1 用来读 ST60的地址设置是:192.168.2.2 用来写 打开软件,选择CPU-CR4配…

LeetCode_Java_递归系列(题目+思路+代码)

206.反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]以此类推,直到反转结束返回头结点 class Solution {public ListNode rever…

统计-R(相关系数)与R^2(决定系数)

1.相关系数(R) 定义:考察两个事物(在数据里我们称之为变量)之间的相关程度。 假设有两个变量X,Y,那么两个变量间的皮尔逊相关系数可通过以下公式计算: 公式一: 其中…

创建一个electron-vite项目

前置条件:非常重要!!! npm: npm create quick-start/electronlatest yarn: yarn create quick-start/electron 然后进入目录,下载包文件,运行项目 到以上步骤,你已经成功运行起来一个 electr…

【C++】vector容器初步模拟

送给大家一句话: 努力一点,漂亮—点,阳光一点。早晚有一天,你会惊艳了时光,既无人能替,又光芒万丈。 vector容器初步模拟 1 认识vector开始了解底层实现 2 开始实现成员变量构造函数 析构函数尾插迭代器插入…

新零售SaaS架构:线上商城系统架构设计

零售商家为什么要建设线上商城? 传统的实体门店服务范围有限,只能吸引周边500米以内的消费者。因此,如何拓展服务范围,吸引更多的消费者到店,成为了店家迫切需要解决的问题。 缺乏忠实顾客,客户基础不稳&…

分治法排序:原理与C语言实现

分治法排序:原理与C语言实现 一、分治法与归并排序概述二、归并排序的C语言实现三、归并排序的性能分析四、归并排序的优化 在计算机科学中,分治法是一种解决问题的策略,它将一个难以直接解决的大问题,分割成一些规模较小的相同问…

数据可视化实战(三)

图书销量情况对比 import pandas as pd import matplotlib.pyplot as plt # 读取Excel数据 dfpd.read_excel(mrbook.xlsx) df序号书号序号.1月份销量rate0B189.787569e1211月15060.31B199.787569e1222月1200-0.32B259.787569e1233月33050.63B219.787569e1244月66100.54NaNNaN5…

docker 进入容器内部命令

docker容器运行了,怎么进入容器内部查看内部的文件情况呢? 答:可以通过docker exec 的命令查看。 docker exec --help 可以查看命令介绍 : docker exec -it XXX /bin/bash XX为容器ID 进入容器内部 /bin/bash是需要添加的 不…

虚拟机扩展:虚拟机快照

虚拟机快照 在学习阶段我们无法避免的可能损坏Linux操作系统。如果损坏的话,重新安装一个Linux操作系统就会十分麻烦。 那我们就可以通过快照将当前虚拟机的状态保存下来,在以后系统损坏时通过快照恢复虚拟机到保存的状态。 制作并还原快照 在VMware …

学习人工智能:Attention Is All You Need-1-介绍;Transformer模型架构;编码器,解码器

Transformer模型是目前最成功的chatGPT,Sora,文心一言,LLama,Grok的基础模型。 《Attention Is All You Need》是一篇由Google DeepMind团队在2017年发表的论文,该论文提出了一种新的神经网络模型,即Trans…

001_measuretime_in_Matlab运行时间测量与时间复杂度分析

Matlab中测量时间 在使用Matalb时,经常需要考虑自己编写代码的效率。在这种情况下,我们需要测量程序运行的时间。Matlab提供了一些函数来测量程序运行的时间。 1. 函数简介 本文涵盖的函数包括: tic和toc函数cputime函数timeit函数 1.1 …

微信投票小程序源码系统:礼物道具投票盈利能力超强 带完整的安装代码包以及安装部署教程

近年来,微信小程序以其便捷性、轻量化等特点,迅速占据了移动应用市场的一席之地。投票小程序作为其中的一种应用类型,因其独特的互动性和社交性,成为了商家进行品牌宣传、活动推广的有力工具。然而,市场上的投票小程序…

【数据可视化】Echarts官方文档及常用组件

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. Echarts官方文档介绍3. ECharts基础架构及常用术语3.1 ECharts的基础架构3.2 ECharts的常用术语3.2.1 ECharts的基本名词3.2.2 ECharts的图表名词 4. 直角坐标系下的网格及坐标轴4.1 直角坐标系下的网格4.2…