【机器学习】卷积神经网络(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.hqwc.cn/news/285489.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

118. 杨辉三角

描述 : 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 题目 : LeetCode 118. 杨辉三角 : 118. 杨辉三角 分析 : 这道题用二维数组来做 . 解析 : class Solution {public Li…

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记:【二叉树篇】合并二叉树 日期:2023.12.18 参考:代码随想录、力扣 617. 合并二叉树 题目描述 难度:简单 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时&#xf…

强化产品联动:网关V7独家解决方案的三重优势

客户背景 某央企单位汇聚了众多业内优秀的工程师和科研人员,拥有先进的研发设施和丰富的研发经验,专注于为全球汽车行业提供创新和实用的解决方案。其研发成果不仅在国内市场上得到了广泛应用,也在国际市场上赢得了广泛的认可和赞誉。 客户需…

【无标题】CTF之SQLMAP

拿这一题来说 抓个包 复制报文 启动我们的sqlmap kali里边 sqlmap -r 文件路径 --dump --dbs 数据库 --tables 表

Apipost检测接口工具的基本使用方法

👀 今天言简意赅的介绍一款和postman一样好用的后端接口测试工具Apipost 专门用于测试后端接口的工具,可以生成接口使用文档官方下载网站:http://www.apipost.cn 傻瓜式安装—>register->项目->创建项目->APIs->新建目录&…

JVM-3-OutOfMemoryErrory内存溢出

堆溢出 Java堆用于储存对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会产生内存溢出异常。 将堆的最小值-Xms…

windows下wsl(ubuntu)ldconfig报错

错误 sudo ldconfig /sbin/ldconfig.real: Cant link /usr/lib/wsl/lib/libnvoptix_loader.so.1 to libnvoptix.so.1 /sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link解决: 处理 sudo ldconfig 报错 libcuda.so.1 is not a symbolic …

JS的浅拷贝和深拷贝

首先理解什么是浅拷贝和深拷贝: 浅拷贝: 浅拷贝只会复制对象的第一层属性,而不会递归地复制嵌套的对象。浅拷贝仅复制对象的引用,新对象和原始对象仍然共享相同的引用,因此对新对象的修改可能会影响到原始对象。浅拷…

电子商务网站知识|搭建自己的电子商务网站需要注意什么|搭建电商独立站的注意事项

电子商务网站建设步骤包括什么呢? 电子商务网站建设第一步,网站的规划与设计 电子商务网站算是一个比较复杂的系统,电商网站建设前就要想好需要有的功能。电子商务网站的规划也是建所有网站都需要做的事情,在规划设计中需要对网站进行整体…

安装 anaconda2023.9 后发现 conda activate

在centos下载 anaconda2023.9 后发现 conda activate命令不能用了 报错如下 sage: conda [-h] [–no-plugins] [-V] COMMAND … conda: error: argument COMMAND: invalid choice: ‘activate’ (choose from ‘clean’, ‘compare’, ‘config’, ‘create’, ‘info’, ‘ini…

GO编程语言:简洁、高效、强大的开源编程语言

在现代软件开发领域,随着应用复杂度的不断提升,开发人员对编程语言的需求也日益增长。GO编程语言,作为一种简洁、高效且具备强大并发能力的新型开源编程语言,逐渐成为了许多开发者的首选。本文将详细介绍GO语言在哪些项目开发中表…

Kafka-Kafka基本原理与集群快速搭建

一、Kafka介绍 ​ ChatGPT对于Apache Kafka的介绍: Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统,可以快速地处理…