人工智能算法工程师(中级)课程10-PyTorch神经网络之卷积神经网络与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程10-PyTorch神经网络之卷积神经网络实战与代码详解。卷积神经网络(CNN)是一种广泛应用于图像识别、目标检测、视频分析等领域的深度学习模型。本文将详细介绍卷积神经网络的原理、构成元素、运行过程、感受野计算、参数和运算量、常见卷积类型以及池化应用,并附上完整可运行代码。

文章目录

  • 一、卷积运算的原理
  • 二、卷积神经网络的构成元素
  • 三、卷积神经网络的运行过程
  • 四、卷积的感受野计算
  • 五、卷积的参数和运算量
  • 六、常见的卷积类型
  • 七、池化的应用
  • 总结

一、卷积运算的原理

卷积运算是一种线性运算,用于处理图像数据。它通过滑动一个小的窗口(称为卷积核)在输入图像上,将卷积核与输入图像对应的局部区域进行元素相乘并求和,得到输出特征图的一个像素值。数学表达式如下:
O ( i , j ) = ∑ m ∑ n I ( i + m , j + n ) ⋅ K ( m , n ) O(i, j) = \sum_{m} \sum_{n} I(i+m, j+n) \cdot K(m, n) O(i,j)=mnI(i+m,j+n)K(m,n)
其中, O ( i , j ) O(i, j) O(i,j) 表示输出特征图在位置 ( i , j ) (i, j) (i,j) 的像素值, I ( i + m , j + n ) I(i+m, j+n) I(i+m,j+n) 表示输入图像在位置 ( i + m , j + n ) (i+m, j+n) (i+m,j+n) 的像素值, K ( m , n ) K(m, n) K(m,n) 表示卷积核在位置 ( m , n ) (m, n) (m,n) 的权重。
在这里插入图片描述
三通道的卷积核计算过程:
在这里插入图片描述

下面是卷积运算的代码实现:

import numpy as np
def conv2d(input, kernel, stride=1, padding=0):
    """
    二维卷积运算
    :param input: 输入图像,形状为(batch_size, height, width, channels)
    :param kernel: 卷积核,形状为(kernel_height, kernel_width, input_channels, output_channels)
    :param stride: 步长
    :param padding: 填充
    :return: 输出特征图,形状为(batch_size, new_height, new_width, output_channels)
    """
    batch_size, height, width, input_channels = input.shape
    kernel_height, kernel_width, _, output_channels = kernel.shape
    # 计算输出特征图的高度和宽度
    new_height = (height - kernel_height + 2 * padding) // stride + 1
    new_width = (width - kernel_width + 2 * padding) // stride + 1
    # 初始化输出特征图
    output = np.zeros((batch_size, new_height, new_width, output_channels))
    # 填充输入图像
    padded_input = np.pad(input, ((0, 0), (padding, padding), (padding, padding), (0, 0)), 'constant')
    # 卷积运算
    for i in range(new_height):
        for j in range(new_width):
            for k in range(output_channels):
                output[:, i, j, k] = np.sum(padded_input[:, i*stride:i*stride+kernel_height, j*stride:j*stride+kernel_width, :] * kernel[:, :, :, k], axis=(1, 2, 3))
    return output

二、卷积神经网络的构成元素

卷积神经网络主要由以下几部分构成:

  1. 输入层:接收图像数据,形状为(batch_size, height, width, channels)。
  2. 卷积层:通过卷积运算提取特征。
  3. 激活函数:引入非线性因素,提高模型的表达能力。
  4. 池化层:降低特征图的分辨率,减少计算量。
  5. 全连接层:将特征图转化为向量,进行分类或回归任务。

三、卷积神经网络的运行过程

卷积神经网络的运行过程主要包括以下几个步骤:

  1. 输入图像经过卷积层提取特征。
  2. 特征图经过激活函数进行非线性变换。
  3. 特征图经过池化层降低分辨率。
  4. 重复步骤1-3,形成深度神经网络。
  5. 最后的特征图经过全连接层进行分类或回归任务。

四、卷积的感受野计算

感受野是指卷积神经网络中每个神经元能感知到的原始输入图像的区域。计算公式如下:
R F ( l ) = R F ( l − 1 ) + ( k e r n e l _ s i z e ( l ) − 1 ) × ∏ i = 1 l − 1 s t r i d e ( i ) RF(l) = RF(l-1) + (kernel\_size(l) - 1) \times \prod_{i=1}^{l-1} stride(i) RF(l)=RF(l1)+(kernel_size(l)1)×i=1l1stride(i)
其中, R F ( l ) RF(l) RF(l) 表示第 l l l 层的感受野大小, k e r n e l _ s i z e ( l ) kernel\_size(l) kernel_size(l) 表示第 l l l 层的卷积核大小, s t r i d e ( i ) stride(i) stride(i) 表示第 i i i 层的步长。

五、卷积的参数和运算量

卷积操作的参数量和运算量主要取决于卷积核大小、输入通道数、输出通道数、输入特征图大小和步长。计算公式如下:
参数量: k e r n e l _ h e i g h t × k e r n e l _ w i d t h × i n p u t _ c h a n n e l s × o u t p u t _ c h a n n e l s kernel\_height \times kernel\_width \times input\_channels \times output\_channels kernel_height×kernel_width×input_channels×output_channels
运算量: ( k e r n e l _ h e i g h t × k e r n e l _ w i d t h × i n p u t c h a n n e l s ) × o u t p u t c h a n n e l s × n e w h e i g h t × n e w w i d t h (kernel\_height \times kernel\_width \times input_channels) \times output_channels \times new_height \times new_width (kernel_height×kernel_width×inputchannels)×outputchannels×newheight×newwidth
其中,new_heightnew_width 是输出特征图的尺寸。

六、常见的卷积类型

  1. 标准卷积(Standard Convolution):前面提到的基本卷积操作。
  2. 深度可分离卷积(Depthwise Separable Convolution):将卷积分成深度卷积和逐点卷积两个步骤,减少参数量和计算量。
    • 深度卷积:每个输入通道使用单独的卷积核。
    • 逐点卷积:使用1x1的卷积核,将深度卷积的输出合并。
  3. 空洞卷积(Dilated Convolution):在卷积核之间插入空洞,增加感受野而不增加参数量。
  4. 反卷积(Deconvolution):通常用于上采样,通过学习一个反卷积核来扩大特征图的尺寸。
    在这里插入图片描述

七、池化的应用

池化(Pooling)是一种下采样操作,用于减少特征图的尺寸,同时保留重要的特征信息。常见的池化类型有:

  1. 最大池化(Max Pooling):选择每个局部区域的最大值作为输出。
  2. 平均池化(Average Pooling):计算每个局部区域的平均值作为输出。
    池化的数学原理较为简单,以下为最大池化的代码实现:
def max_pooling(input, pool_size, stride):
    """
    最大池化
    :param input: 输入特征图,形状为(batch_size, height, width, channels)
    :param pool_size: 池化窗口大小
    :param stride: 步长
    :return: 输出特征图,形状为(batch_size, new_height, new_width, channels)
    """
    batch_size, height, width, channels = input.shape
    # 计算输出特征图的高度和宽度
    new_height = (height - pool_size) // stride + 1
    new_width = (width - pool_size) // stride + 1
    # 初始化输出特征图
    output = np.zeros((batch_size, new_height, new_width, channels))
    # 池化运算
    for i in range(new_height):
        for j in range(new_width):
            for k in range(channels):
                output[:, i, j, k] = np.max(input[:, i*stride:i*stride+pool_size, j*stride:j*stride+pool_size, k], axis=(1, 2))
    return output

总结

这里我详细介绍了卷积神经网络的原理、构成元素、运行过程、感受野计算、参数和运算量、常见卷积类型以及池化应用,并附上了相应的代码实现。卷积神经网络作为一种强大的深度学习模型,在图像处理领域具有广泛的应用。希望本文能帮助读者更好地理解和应用卷积神经网络。

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

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

相关文章

【VIVADO SDK调试遇到DataAbortHandler】

问题 SDK调试遇到DataAbortHandler问题。 运行后不显示结果,debug模式下发现进入DataAbortHandler异常函数。程序中存在大数组。 原因:SDK默认的堆栈为1024bytes,需要将堆栈调大。 修改方法: 解决:对application中src下的lscript.ld双击,…

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

5月20日-6月4日:攻克2D物理引擎。 6月4日-6月13日:攻克《3D数学基础》。 6月13日-6月20日:攻克《3D图形教程》。 6月21日-6月22日:攻克《Raycasting游戏教程》。 6月23日-7月1日:攻克《Windows游戏编程大师技巧》。 7月…

解决GET请求中文乱码问题

解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一:修改Tomcat配置(推荐)方法二:使用URLEncoder和URLDecoder(不推荐用于GET请求乱码)方法三:String类编解码(不直接解决乱…

欣奇随机美图源码

欣赏养眼美图让人心情愉悦 新增正能量进站引导首页 上传文件解压即可用有手就行 美图输出接口自判断版 http://mt.xqia.net/api.php http://mt.xqia.net/api.php?typejson 源码下载:https://download.csdn.net/download/m0_66047725/89520368 更多资源下载&…

FPGA学习笔记(一) FPGA最小系统

文章目录 前言一、FPGA最小系统总结 前言 今天学习下FPGA的最小系统一、FPGA最小系统 FPGA最小系统与STM32最小系统类似,由供电电源,时钟电路晶振,复位和调试接口JTAG以及FLASH配置芯片组成,其与STM32最大的不同之处就是必须要有…

如何ssh远程Windows电脑

参考:https://www.jianshu.com/p/1321b46b40ee 上述教程中,直接根据微软的教程进行openssh安装 遇到的问题 远程windows电脑需要具备什么条件? 需要Windows电脑上安装了openssh server 远程Windows电脑的话,用户怎么创建&…

C++ | Leetcode C++题解之第230题二叉搜索树中第K小的元素

题目: 题解: class MyBst { public:MyBst(TreeNode *root) {this->root root;countNodeNum(root);}// 返回二叉搜索树中第k小的元素int kthSmallest(int k) {TreeNode *node root;while (node ! nullptr) {int left getNodeNum(node->left);if…

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括: ❑ 封面; ❑ 文档修订记录表; ❑ 目录; ❑ 引言; ❑ 产品概述:产品结构图 ❑ 详细需求说明:产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…

vue使用 “xlsx-style“: “^0.8.13“ 报错

关于jszip not a constructor报错配置config.js文件后可能还报错的问题: 在node_modules处找到node_modules\xlsx-style\xlsx.js 文件。 将 if(typeof jszip undefined) jszip require(./jszip).JSZip;(应该在xlsx.js文件1339行左右) 替换成 if(typeof jszip und…

C语言 | Leecode C语言题解之第229题多数元素II

题目: 题解: /*** Note: The returned array must be malloced, assume caller calls free().*//*假定 num1,num2 为出现次数大于 nums.length / 3 的两个数。(最多出现两个)遍历 nums, 若出现 num1、num2…

C语言 | Leetcode C语言题解之第230题二叉搜索树中第K小的元素

题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int search_num(struct TreeNode* root, int k, int *result, int num) {if(num k 1){retu…

Jmeter多用户登录操作实战

在使用Jmeter性能测试时,首先要解决的问题恐怕就会并发压测和多用登录的问题.今天就一篇文章讲清楚这两个问题的解决方案: 一.多并发压测如何配置线程? (1)同时并发:设置线程组、执行时间、循环次数,这种方式可以控制接口请求的…

Java | Leetcode Java题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> majorityElement(int[] nums) {HashMap<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int i 0; i < nums.length; i) {if (cnt.containsKey(nums[i])) {cnt.…

windows上修改redis端口号

概况 redis是一个开源的内存数据结构存储系统&#xff0c;常用做数据库、缓存和消息代理。默认的端口号为6379 更改redis端口号步骤如下 先停止redis服务 redis-cli shutdowm 打开redis配置文件 在redis安装目录下&#xff0c;即redis.windows.conf文件。 port 6396 然后…

LabVIEW滤波器性能研究

为了研究滤波器的滤波性能&#xff0c;采用LabVIEW设计了一套滤波器性能研究系统。该系统通过LabVIEW中的波形生成函数&#xff0c;输出幅值及频率可调的正弦波和白噪声两种信号&#xff0c;并将白噪声与正弦波叠加&#xff0c;再通过滤波器输出纯净的正弦波信号。系统通过FFT&…

go-redis 封装事件-client封装模型、批量数据处理的导出器设计

一、redis-go的封装实践-client模型 // Copyright 2020 Lingfei Kong <colin404foxmail.com>. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file.package storageimport ("context&q…

Java项目中,常用的SQL语句

常用的命令&#xff1a; 1.数据的增删改查 1.插入数据(进行注册&#xff09; 语法 1&#xff1a; --第一种&#xff1a; INSERT INTO 表名(列名 1,列名 2, …) ; insert into tablename(member1,member3) valuse(,); --第二种&#xff1a; INSERT INTO 表名 VALUES(值 1,值 …

浅析Kafka-Stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

探索【Python面向对象】编程:新时代的高级编程范式详解

目录 1. 面向对象编程概念&#xff08;OOP&#xff09; 1.1 什么是类和对象&#xff1f; 1.2 类的定义 1.3 类和对象的关系 1.4 小李的理解 2. 抽象 2.1 抽象的概念 2.2 抽象类和方法 2.3 小李的理解 3. 类和实例 3.1 类的定义和实例化 3.2 类的属性和方法 3.3 小…

Qt 统计图编程

学习目标&#xff1a;Qt 折线图&#xff0c;柱形图和扇形统计图编程 学习基础 Qt QChart 曲线图表操作-CSDN博客 学习内容 Qt中绘制三种常见的图表非常方便, 主要步骤如下: 1. 折线图: - 使用QLineSeries定义折线数据,添加多个坐标点 - 使用QValueAxis创建X轴和Y轴 - 将…