【机器学习】卷积神经网络(CNN)的特征数计算

文章目录

  • 基本步骤
  • 示例
  • 图解过程

基本步骤

在卷积神经网络(CNN)中,计算最后的特征数通常涉及到以下步骤:

  1. 确定输入尺寸

    首先,你需要知道输入数据的尺寸。对于图像数据,这通常是 (batch_size, channels, height, width)

  2. 应用卷积层

    在卷积操作过程中,图像与卷积核进行滑动窗口式的乘加运算,这会导致图像尺寸的变化。特征数会根据卷积核的数量和大小以及步长等因素发生变化。

    • in_channels:输入数据的通道数。
    • out_channels:卷积层产生的输出特征图的数量,即卷积核的数量。
    • kernel_size:卷积核(filter)的大小(FxF)(kernel_size的选择对模型的性能有很大影响,因为它决定了模型能够捕捉到的特征的尺度和复杂性。增大kernel_size可以捕获更大范围的特征,但可能会增加计算复杂性和过拟合的风险;减小kernel_size则可以关注更细节、局部的特征,但可能忽略掉一些重要的全局信息。因此,选择合适的kernel_sizeCNN设计中的一个重要环节)。
    • stride:卷积核在输入数据上滑动的步长。
    • padding:在输入数据边缘添加的零填充的数量。


    卷积层的输出尺寸可以通过以下公式计算(floor()是向下取整函数):

    output_height = floor((input_height - kernel_size + 2 * padding) / stride) + 1
    output_width = floor((input_width - kernel_size + 2 * padding) / stride) + 1
    

    特征数(或通道数)在卷积层后变为 out_channels

  3. 应用池化层

    池化层通常不会改变特征数,但会改变特征图的高度和宽度。

    池化层的输出尺寸可以通过以下公式计算:

    output_height = floor((input_height - kernel_size) / stride) + 1
    output_width = floor((input_width - kernel_size) / stride) + 1
    
  4. 重复以上步骤

    继续应用卷积层和池化层,每次更新特征图的尺寸和特征数。

  5. 全局平均池化或全连接层

    在某些情况下,网络可能包含全局平均池化层或全连接层,这些层可以进一步改变特征数。为了将这些特征图转换为一维向量以输入到全连接层,你需要将特征图的元素"展平"(flatten)。展平的过程是将所有元素按顺序排列成一个单一的向量。

    计算展平后的输入维度(in_features)的公式为:

    in_features = channels * height * width
    
  6. 最终特征数

    网络的最后一层之前的特征图的通道数就是最后的特征数。

示例

以下是一个简单的例子来说明如何计算最后特征图的尺寸:给定 RGB 图像 (batch_size=32,channels=3,height=60,width=90)

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        self.conv_block1 = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True),
            nn.Conv2d(32, 32, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )

        self.conv_block2 = nn.Sequential(
            nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )

        self.fc2 = nn.Sequential(
            nn.Linear(18816, 9408),
            nn.ReLU(inplace=True),
            nn.Dropout(0.5),
            nn.Linear(9408, 4704),
            nn.ReLU(inplace=True),
            nn.Dropout(0.5),
            nn.Linear(4704, 5)
        )

    def forward(self, x):
        x = self.conv_block1(x)
        x = self.conv_block2(x)
        x = x.reshape(x.shape[0], -1)
        x = self.fc2(x)
        return x

在上述代码中,给定一个 RGB 图像 (batch_size=32,channels=3,height=60,width=90),我们将图像输入到 self.conv_block1self.conv_block2 进行处理。

首先,我们计算经过 self.conv_block1 后的特征数:

  • 输入数据有 3 个通道(RGB 图像)。
  • 第一个卷积层将输出通道数增加到 32

由于 kernel_size=3, stride=1, padding=1,即卷积核的大小为 3×3,步长为 1,填充为 1,我们可以计算新的特征图尺寸:

output_height = (60 - 3 + 2 * 1) / 1 + 1 = 60
output_width = (90 - 3 + 2 * 1) / 1 + 1 = 90
  • 经过 ReLU 激活函数后,特征数保持为 32
  • 第二个卷积层仍然保持 32 个输出通道,同上特征图的高度和宽度不变。
  • 再经过 ReLU 激活函数后,特征数仍为 32
  • 最后,最大池化层不会改变通道数,但会减小特征图的高度和宽度。

由于 nn.MaxPool2d(kernel_size=3, stride=2),即最大池化层的池化窗口的大小为 3×3 步长为 2,我们可以计算新的特征图尺寸:

output_height = (60 - 3) / 2 + 1 = 29
output_width = (90 - 3) / 2 + 1 = 44

所以,经过self.conv_block1后,特征图的尺寸为(1, 32, 29, 44),特征数为 32

接下来,我们将这个 32 通道的特征图输入到self.conv_block2

  • 第一个卷积层将输出通道数从 32 增加到 64,同上特征图的高度和宽度不变。
  • 经过 ReLU 激活函数后,特征数保持为 64
  • 第二个卷积层仍然保持 64 个输出通道,同上特征图的高度和宽度不变。
  • 再经过 ReLU 激活函数后,特征数仍为 64
  • 最后,最大池化层不会改变通道数,但会进一步减小特征图的高度和宽度。

同样地,最大池化层的池化窗口的大小为 3×3 步长为 2,我们可以计算新的特征图尺寸:

output_height = (29 - 3) / 2 + 1 = 14
output_width = (29 - 3) / 2 + 1 = 21

因此,经过 self.conv_block1self.conv_block2 后,最终的特征图的尺寸为 (32, 64, 14, 21)

nn.LinearPyTorch 中的一个全连接层(Fully Connected Layer),它用于执行线性变换。全连接层的输入和输出维度通常是由网络架构和数据的特性决定的。

nn.Linear 的第一个参数,即输入维度(input_featuresin_features

为了将这些特征图转换为一维向量以输入到全连接层,你需要将特征图的元素“展平”(flatten)。展平的过程是将所有元素按顺序排列成一个单一的向量。我们可以计算展平后新的特征数,即输入维度 (in_features)

in_features = 64 * 14 * 21 = 18816

第一个全连接层输出维度为 9408,再经过 ReLU 激活函数。

nn.DropoutPyTorch 库中的一种正则化技术的实现,常用于防止过拟合。在深度学习模型训练过程中,dropout 通过随机忽略(“丢弃”)一部分神经元的输出来降低模型的复杂性。这里 dropout 比例为 0.5,那么在训练过程中,每一步有 50% 的神经元输出会被随机设置为0。

同上过程,再来一次最后输出维度为 5,显然这是个 5-分类问题

图解过程

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1-完全理解以太坊智能合约

了解区块链 区块链技术的核心概念是分布式账本,它是许多参与者共享的特定类型的数据库。 这个特殊的数据库只是一个交易列表,记录着网络中发生的每笔交易。每个人都可以拥有自己的交易列表备份,再加上强有力的货币激励措施消除各方之间信任…

记录今日将C语言的Windows程序更改为python语言Windows程序,实现子窗口控制,类似微信程序框架最简单的原型

基本思路 为什么要选择python制作Windows应用程序,主要就是源代码直接展示,发现问题随时修改,同时可以不断增加新的功能方便。 由于C语言的Windows程序中结构类型在python中不能使用, 因此我们按照ctypes模块指导意见继承structu…

基于双目RGB图像和图像深度信息的三维室内场景建模matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双目视觉原理 4.2 深度信息获取 4.3 表面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

STM32与Freertos入门(三)任务的创建、删除

1、串口配置 首先将串口进行配置,后续经常会应用,具体步骤点击:串口配置。 2、任务 创建一个任务,就是开辟一个空间、每个任务中都会有while(1)死循环。 2.1相关函数 动态创建:xTaskCreate…

ros2/ros 4轮2驱机器人xacro/urdf文件示例代码

这个实验中最重要的是&#xff1a;colcon build 之后要记得source install/setup.bash.否则修改的文件是不会更新的。知道了吧 <robot name"half" xmlns:xacro"http://wiki.ros.org/wiki/xacro"><xacro:property name"PI" value"3…

SL3041高耐压100V降压恒压芯片 24V降压5V 24V降压12V 12V降5V

SL3041宽电压100V恒压芯片 24V降压5V 24V降压12V SL3041是一款宽电压100V恒压芯片&#xff0c;具有高效率、高精度、高可靠性等优点&#xff0c;广泛应用于各种电源系统中。在本文中&#xff0c;我们将详细介绍SL3041的工作原理、应用场景以及如何使用它实现24V降压5V和24V降压…

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…

GaussDB数据库表创建行访问控制策略

目录 一、前言 二、GaussDB中的行访问控制 1、CREATE ROW LEVEL SECURITY POLICY语法 2、ALTER ROW LEVEL SECURITY POLICY语法 3、ROW LEVEL SECURITY策略与适配SQL语法关系 三、GaussDB中的行访问控制策略示例 1、实现GaussDB行访问控制的一般步骤 2、行访问控制策略…

AWS解决方案架构师学习与备考

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

信息收集 - 网站服务器

操作系统 区分大小写: 如果修改首页或其他页面的大小写后,网站返回一个错误页面,例如报错 "404 Not Found" 或类似的错误,这可能意味着网站运行在 Linux 或类 Unix 操作系统上。这是因为大多数 Linux 系统是区分大小写的。如果修改大小写后,网站页面正常显示,这…

maui中实现加载更多 RefreshView跟ListView(2)

一个类似商品例表的下拉效果&#xff1a; 代码 新增个类为商品商体类 public class ProductItem{public string ImageSource { get; set; }public string ProductName { get; set; }public string Price { get; set; }}界面代码&#xff1a; <?xml version"1.0&quo…

人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码 可实时检测

人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 目录 人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 1.项目介绍 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&…

Vue--第十天

终极实战----大事件项目 1.简介&#xff1a; 2.创建项目&#xff1a; 1.创建&#xff08;159-163&#xff09;&#xff1a; 还是对着视频操作吧 2.路由&#xff1a; 3.element Plus: 导入element Plus 后不需要再导入插件配置&#xff0c;就连组件导入也不用 4.pinia构建用…

【C盘清理】Jetbrains全家桶(PyCharm、Clion……)更改 IDE 特定文件(配置、缓存、插件、日志等)存储位置

文章目录 一、官网说明二、更改 IDE 目录的位置1. 转到“帮助”|“编辑自定义属性”2. 各文件位置3. 以PyCharm系统目录为例4. 修改idea.properties 三、清理旧的 IDE 目录 一、官网说明 IDE 使用的目录官网说明 二、更改 IDE 目录的位置 默认情况下&#xff0c;PyCharm 将每…

pytorch——豆瓣读书评价分析

任务目标 基于给定数据集&#xff0c;采用三层bp神经网络方法&#xff0c;编写程序并构建分类模型&#xff0c;通过给定特征实现预测的书籍评分的模型。 选取数据 在各项指标中&#xff0c;我认为书籍的评分和出版社、评论数量还有作者相关&#xff0c;和其他属性的关系并大。…

vscode如何开发微信小程序?(保姆级教学)

1.安装“微信小程序开发工具”扩展 2.安装“vscode weapp api”扩展 3.安装“vscode wxml”扩展 4.安装“vscode-wechat”扩展 5.在终端执行命令&#xff1a; vue create -p dcloudio/uni-preset-vue uniapp-test uniapp-test就是我这里的项目名称了 6.如果遇到了这个错误&a…

云渲染插件怎么设置?云渲染插件设置教程

云渲染技术以其高效、便捷的特性正改变着3D设计和视频制作行业。为了进一步简化渲染过程&#xff0c;云渲染插件应运而生。云渲染插件可以让用户在熟悉的3D软件环境中直接完成渲染任务&#xff0c;大幅提高工作的连贯性与效率。那么如何在3D软件中安装和设定这些神奇的云渲染插…

【为数据之道学习笔记】5-7五类数据主题联接的应用场景

在数字化转型的背景下&#xff0c;华为的数据消费已经不再局限于传统的报表分析&#xff0c;还要支持用户的自助分析、实时分析&#xff0c;通过数据的关联&#xff0c;支持业务的关联影响分析以及对目标对象做特征识别&#xff0c;进行特定业务范围圈定、差异化管理与决策等。…

传奇的GEE、翎风、V8引擎之间的区别,哪个引擎更好用?

我们在选择传奇版本时可以看到有很多GEE引擎的版本&#xff0c;同时也有少数的翎风和V8引擎版本&#xff0c;当我们选择的版本是翎风或是v8引擎&#xff0c;之前没有架设过怎么办呢&#xff1f;不要着急&#xff0c;往下看&#xff01; 这还得从GEE引擎说起&#xff0c;GEE引擎…

「数据结构」二叉树1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;C启航 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;树&#x1f349;二叉树&#x1f34c;特殊二叉树&#x1f34c;二叉树的性质&#x1f34c;存储结构 &#x1f349;…
最新文章