卷积神经网络(CNN)原理与实现

  • 卷积神经网络(CNN)
    • 卷积神经网络原理
    • 卷积神经网络的数学推导
    • 卷积层反向传播算法数学推导
    • 卷积层实现代码

卷积神经网络(CNN)

卷积神经网络原理

卷积神经网络是一种用于图像、语音、自然语言等数据的深度学习模型,其核心思想是使用卷积操作提取输入数据的特征,从而实现数据分类、目标检测、图像分割等任务。

卷积操作是卷积神经网络的核心操作,它通过卷积核(也称为滤波器)对输入数据进行卷积运算,提取出输入数据的特征。具体来说,卷积操作对于每个位置,将卷积核中的值与输入数据的对应位置相乘,然后将所有乘积相加得到输出数据的对应位置的值。卷积核的大小、步长和填充方式都可以影响卷积操作的输出结果。

卷积神经网络通常包括卷积层、池化层、全连接层等多个层次。卷积层用于提取输入数据的特征,通过多个卷积核进行卷积操作,得到多个特征图(feature map)。池化层用于降低特征图的空间分辨率,减少计算量和参数数量。全连接层用于将特征图映射到目标类别,通常包含多个神经元,并使用softmax函数进行输出。

卷积神经网络在训练过程中通常使用反向传播算法进行梯度下降优化。反向传播算法可以通过将目标函数的梯度反向传递回网络中的每个神经元,计算每个神经元的梯度,并使用梯度下降更新网络参数,从而最小化目标函数。

卷积神经网络的数学推导

卷积神经网络(CNN)的核心操作是卷积(convolution),卷积的本质是信号处理中的一种数学运算,将两个函数进行叠加并积分,得到一个新的函数。

在CNN中,卷积的输入是一个二维矩阵(通常是图像)和一个卷积核(也称为滤波器)。卷积核是一个小的二维矩阵,大小通常为3x3或5x5,其内部的数值是需要通过训练学习得到的。
在这里插入图片描述

下面是卷积的数学推导过程:

设输入矩阵为 X ∈ R H × W X\in R^{H\times W} XRH×W,卷积核为 K ∈ R K h × K w K\in R^{K_h\times K_w} KRKh×Kw,其中 H H H表示矩阵的高度, W W W表示矩阵的宽度, K h K_h Kh表示卷积核的高度, K w K_w Kw表示卷积核的宽度。

在进行卷积操作时,将卷积核沿着输入矩阵的每个位置进行滑动,对应位置的元素相乘并相加,得到输出矩阵 Y ∈ R ( H − K h + 1 ) × ( W − K w + 1 ) Y\in R^{(H-K_h+1)\times(W-K_w+1)} YR(HKh+1)×(WKw+1)。具体来说,输出矩阵 Y Y Y的第 i i i行第 j j j列的元素为:

y i , j = ∑ m = 1 K h ∑ n = 1 K w x i + m − 1 , j + n − 1 k m , n y_{i,j}=\sum\limits_{m=1}^{K_h}\sum\limits_{n=1}^{K_w}x_{i+m-1,j+n-1}k_{m,n} yi,j=m=1Khn=1Kwxi+m1,j+n1km,n

其中, x i + m − 1 , j + n − 1 x_{i+m-1,j+n-1} xi+m1,j+n1表示输入矩阵 X X X的第 i + m − 1 i+m-1 i+m1行第 j + n − 1 j+n-1 j+n1列的元素, k m , n k_{m,n} km,n表示卷积核 K K K的第 m m m行第 n n n列的元素。

需要注意的是,在卷积操作时通常还会进行填充(padding)和步长(stride)的设置。填充是在输入矩阵的边缘添加一些额外的元素,使得卷积操作后输出矩阵的大小与输入矩阵相同;步长是在滑动卷积核时的间隔,可以控制输出矩阵的大小。

卷积神经网络通常会在卷积层后加入激活函数,如ReLU函数,来增加非线性能力。此外,卷积神经网络还可以通过池化(pooling)层来减小特征图的大小,从而减少计算量和参数数量。池化层通常采用最大池化(max pooling)或平均池化(average pooling)操作,对每个特征图的每个小区域进行取最大值或取平均值的操作,从而得到更小的特征图。

卷积神经网络的数学推导主要是通过卷积操作、激活函数和池化操作实现。在卷积神经网络中,每个卷积层通常包含多个卷积核,每个卷积核对应一个特征图(也称为卷积映射)。因此,每个卷积层输出的是多个特征图,这些特征图可以进一步传递到下一层进行计算。

在进行卷积神经网络的训练过程中,通常采用反向传播算法(backpropagation)来求解模型参数。反向传播算法基于梯度下降的思想,通过计算损失函数对模型参数的偏导数(梯度),从而不断更新模型参数,使得模型能够更好地拟合训练数据。

总之,卷积神经网络的数学推导涉及到卷积操作、激活函数和池化操作,这些操作是卷积神经网络的核心。在进行训练时,通常采用反向传播算法来求解模型参数,从而使得模型能够更好地拟合训练数据。

卷积层反向传播算法数学推导

卷积层反向传播算法是卷积神经网络中最为核心的算法之一,其目的是求解每个卷积核的权重参数和偏置项的梯度,从而进行模型参数的更新。

卷积层反向传播算法的数学推导主要分为两个步骤:前向传播和反向传播。前向传播通过卷积操作和激活函数对输入数据进行处理,得到输出数据;反向传播根据误差对输出数据的梯度,利用卷积操作对输入数据的梯度进行计算,进而求解每个卷积核的梯度。

下面是卷积层反向传播算法的数学推导:

假设输入数据为 X X X,卷积核为 W W W,偏置项为 b b b,输出数据为 Y Y Y。其中, X X X W W W 的维度分别为 C i n × H i n × W i n C_{in} \times H_{in} \times W_{in} Cin×Hin×Win C o u t × C i n × K h × K w C_{out} \times C_{in} \times K_h \times K_w Cout×Cin×Kh×Kw Y Y Y 的维度为 C o u t × H o u t × W o u t C_{out} \times H_{out} \times W_{out} Cout×Hout×Wout K h K_h Kh K w K_w Kw 分别表示卷积核的高度和宽度, H o u t H_{out} Hout W o u t W_{out} Wout 分别表示输出数据的高度和宽度。

前向传播的数学表达式为:

Y k , i , j = σ ( ∑ c = 1 C i n ∑ p = 1 K h ∑ q = 1 K w X c , i + p − 1 , j + q − 1 W k , c , p , q + b k ) Y_{k,i,j}=\sigma(\sum_{c=1}^{C_{in}}\sum_{p=1}^{K_h}\sum_{q=1}^{K_w}X_{c,i+p-1,j+q-1}W_{k,c,p,q}+b_k) Yk,i,j=σ(c=1Cinp=1Khq=1KwXc,i+p1,j+q1Wk,c,p,q+bk)

其中, σ \sigma σ 表示激活函数。这里使用了 k k k i i i j j j 分别表示第 k k k 个特征图、第 i i i 行、第 j j j 列的像素点。通过前向传播,我们可以得到输出数据 Y Y Y

反向传播的数学表达式为:

∂ L ∂ X c , i , j = ∑ k = 1 C o u t ∑ p = 1 K h ∑ q = 1 K w W k , c , p , q ∂ L ∂ Y k , i + p − 1 , j + q − 1 \frac{\partial L}{\partial X_{c,i,j}}=\sum_{k=1}^{C_{out}}\sum_{p=1}^{K_h}\sum_{q=1}^{K_w}W_{k,c,p,q}\frac{\partial L}{\partial Y_{k,i+p-1,j+q-1}} Xc,i,jL=k=1Coutp=1Khq=1KwWk,c,p,qYk,i+p1,j+q1L

∂ L ∂ W k , c , p , q = ∑ i = 1 H o u t ∑ j = 1 W o u t X c , i + p − 1 , j + q − 1 ∂ L ∂ Y k , i , j \frac{\partial L}{\partial W_{k,c,p,q}}=\sum_{i=1}^{H_{out}}\sum_{j=1}^{W_{out}}X_{c,i+p-1,j+q-1}\frac{\partial L}{\partial Y_{k,i,j}} Wk,c,p,qL=i=1Houtj=1WoutXc,i+p1,j+q1Yk,i,jL

∂ L ∂ b k = ∑ i = 1 H o u t ∑ j = 1 W o u t ∂ L ∂ Y k , i , j \frac{\partial L}{\partial b_k}=\sum_{i=1}^{H_{out}}\sum_{j=1}^{W_{out}}\frac{\partial L}{\partial Y_{k,i,j}} bkL=i=1Houtj=1WoutYk,i,jL

其中, L L L 表示损失函数。通过反向传播,我们可以求解出每个卷积核的梯度,从而进行模型参数的更新。

解释一下上述公式的含义:

首先,由于卷积操作是可微分的,因此可以通过链式法则来求解输入数据 X X X 的梯度。假设 L L L 表示损失函数,则 Y Y Y L L L 的梯度为 ∂ L ∂ Y k , i , j \frac{\partial L}{\partial Y_{k,i,j}} Yk,i,jL,因此可以通过卷积操作来计算 X X X L L L 的梯度。

反向传播中第一个公式表示, X c , i , j X_{c,i,j} Xc,i,j L L L 的梯度等于所有输出数据 Y k , i + p − 1 , j + q − 1 Y_{k,i+p-1,j+q-1} Yk,i+p1,j+q1 L L L 的梯度乘以对应的权重 W k , c , p , q W_{k,c,p,q} Wk,c,p,q 的和。其中, k k k 取遍所有特征图, p p p q q q 分别表示卷积核在 H H H W W W 方向上的偏移量。

反向传播中第二个公式表示, W k , c , p , q W_{k,c,p,q} Wk,c,p,q L L L 的梯度等于所有输入数据 X c , i + p − 1 , j + q − 1 X_{c,i+p-1,j+q-1} Xc,i+p1,j+q1 L L L 的梯度乘以对应的输出数据 Y k , i , j Y_{k,i,j} Yk,i,j 的和。同样地, k k k 取遍所有特征图, i i i j j j 分别表示输出数据在 H H H W W W 方向上的偏移量。(解释与公式矛盾)

反向传播中第三个公式表示, b k b_k bk L L L 的梯度等于所有输出数据 Y k , i , j Y_{k,i,j} Yk,i,j L L L 的梯度的和。

在实际应用中,通常会采用基于梯度下降的优化算法来进行模型参数的更新。在卷积层反向传播算法中,可以通过上述公式计算出每个卷积核的梯度,然后利用梯度下降算法对模型参数进行更新,从而提高模型的性能。

卷积层实现代码

下面是一个使用 NumPy 实现的简单 Conv2d 类的示例代码:

import numpy as np

class Conv2d:
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, bias=True):
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.kernel_size = kernel_size
        self.stride = stride
        self.padding = padding
        self.bias = bias

        # 初始化卷积核和偏置项
        self.weights = np.random.randn(out_channels, in_channels, kernel_size, kernel_size)
        self.bias_values = np.zeros(out_channels)

    def forward(self, x):
        # 计算输出大小
        out_h = int((x.shape[2] + 2*self.padding - self.kernel_size) / self.stride + 1)
        out_w = int((x.shape[3] + 2*self.padding - self.kernel_size) / self.stride + 1)

        # 对输入数据进行填充
        x = np.pad(x, [(0, 0), (0, 0), (self.padding, self.padding), (self.padding, self.padding)], mode='constant')

        # 初始化输出数据
        output = np.zeros((x.shape[0], self.out_channels, out_h, out_w))

        # 对每个通道进行卷积操作
        for i in range(self.out_channels):
            # 对每个像素进行卷积操作
            for h in range(out_h):
                for w in range(out_w):
                    # 计算卷积结果
                    conv = np.sum(x[:, :, h*self.stride:h*self.stride+self.kernel_size, w*self.stride:w*self.stride+self.kernel_size] * self.weights[i, :, :, :], axis=(1,2,3))
                    # 加上偏置项
                    conv += self.bias_values[i]
                    # 存储卷积结果
                    output[:, i, h, w] = conv

        return output

这个示例实现了一个简单的 Conv2d 类,其构造函数接受输入通道数、输出通道数、卷积核大小、步长、填充和偏置项等参数。在构造函数中,我们随机初始化了卷积核和偏置项。

forward 函数接受输入数据 x,并根据卷积核大小、步长和填充对输入数据进行填充。然后,我们对每个通道和每个像素进行卷积操作,并将结果存储在输出数据中。在卷积操作中,我们使用 NumPy 的数组乘法和求和操作实现了卷积运算,并加上了偏置项。

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

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

相关文章

【开源项目】经典开源项目数字孪生智慧医院

飞渡科技数字孪生医院管理平台,融合数字孪生、物联网IOT、无线定位等技术,提供病房管理、医疗管理、照明管理、停车场管理等应用,同时结合完善的安防系统,立体化、全覆盖的视频监控体系,实现医院数字化卓越运营以及精细…

汇编语言程序设计实验二

实验目的和要求 继续学习使用DEBUG程序的各种命令。利用DEBUG学习了解计算机取指令、执行指令的工作过程。 掌握8086/8088基本指令的使用方法和功能。 实验环境 DOSBox 0.74 实验内容与过程 1. 按照下列给定步骤完成求累加和程序: 程序: MOV BX,1000MOV C…

MBR10200FCT-ASEMI适配开关电源MBR10200FCT

编辑:ll MBR10200FCT-ASEMI适配开关电源MBR10200FCT 型号:MBR10200FCT 品牌:ASEMI 封装:ITO-220AB 最大平均正向电流(IF):10A 最大循环峰值反向电压(VRRM)&#xf…

BUUCTF---[极客大挑战 2019]Upload1

1.题目描述 2.点开链接&#xff0c;需要上传文件&#xff0c;要求是image&#xff0c;上传文件后缀为jpg的一句话木马&#xff0c;发现被检测到了 3.换另一个木马试试 GIF89a? <script language"php">eval($_REQUEST[1])</script> 发现可以上传成功 4…

(C语言)sizeof和strlen的对比(详解)

sizeof和strlen的对⽐&#xff08;详解&#xff09; 1. sizeof sizeof是用来计算变量所占内存空间大小的&#xff0c; 单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是用类型创建的变量所占空间的大小。 sizeof 只关注占用内存空间的大小 &#xff0c;不在乎内…

GitLab EE 企业版破解

在当今数字化时代&#xff0c;软件开发与团队协作已经成为现代企业不可或缺的一部分。而在这个过程中&#xff0c;版本控制、协作和持续集成等工具的运用变得至关重要。GitLab作为一个领先的、完整的DevOps平台&#xff0c;为团队提供了一个集成的解决方案&#xff0c;使得软件…

【Leetcode每日一题】DP35 二维前缀和(难度⭐⭐)(26)

1. 题目解析 题目链接&#xff1a;DP35 【模板】二维前缀和 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于计算题目所给二维区间数组元素和返回即可。 2. 算法原理 和上题了类似的方法&#xff0c;使用dp数组来保存[1…

科普【1】:web3.0初探,不懂技术也能看懂。

Hi&#xff0c;我是贝格前端工场&#xff0c;本期来科普一下web3这个概念&#xff0c;力争讲的浅显易懂。 一、什么是web3及其特征 Web3是指第三代互联网&#xff0c;也被称为分布式互联网或区块链互联网。它是对传统互联网的一种进化和扩展&#xff0c;旨在提供更加去中心化、…

为什么中小APP开发者要选择聚合SDK广告变现服务?

广告变现听起来容易&#xff0c;但要在不影响用户体验的情况下&#xff0c;把变现收益做到最大化&#xff0c;其实非常复杂。 对于处于行业腰部和尾部的中小APP来说&#xff0c;团队资源有限&#xff0c;要将所有的资源集中在投入到核心业务竞争力上——扩大用户规模和活跃度上…

如何测试代理IP是否可用?

目录 一、了解代理IP基础知识 二、为什么需要测试代理IP的可用性&#xff1f; 三、测试代理IP的可用性方法 使用Ping命令测试代理IP的连通性 使用curl或wget测试代理IP的可用性 编写代码测试代理IP的可用性 四、案例分析 五、总结与建议 在数字时代的今天&#xff0c;代…

.net 日志

一、Log4net 1、log4net写入文本 1、nuget引入log4net、Microsoft.Extensions.Logging.Log4Net.AspNetCore这2个 2、引入配置文件,可以直接去官网(log4net官网配置文件)复制下来,放到项目目录下面,设置成始终复制,因为这个文件最终要到我们项目运行目录下面去 3、要在pr…

3月4日工作记录

周末总结 周末花6.5k的4060ti主机到家了&#xff0c;配好了和女朋友一起玩了两天帕鲁&#xff0c;真好玩&#xff01; 玩完开始上班&#xff01; 今天&#xff0c;上午先看三篇paper&#xff0c;然后下午继续1日计划的工作 文章阅读 文章一&#xff1a;SciGLM: Training Sc…

STL——stack

目录 stack stack都有哪些接口 模拟实现一个stack stack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即…

【一起学习Arcade】(5):属性规则实例_计算规则

属性规则可改善地理数据库数据集的编辑体验并提高数据完整性。 这些规则均为用户定义的规则&#xff0c;可用于自动填充属性、在编辑操作期间限制无效编辑&#xff0c;以及对现有要素执行质量保证检查。 属性规则分为3类&#xff1a;计算、约束和验证。 这一篇介绍计算规则&…

HOOPS Communicator对3D大模型轻量化加载与渲染的4种解决方案

今天给大家介绍一些关于3D Web轻量化引擎HOOPS Commuicator的关键概念&#xff0c;这些概念可以帮您在HOOPS Communicator流缓存服务器之上更好地构建您自己的模型流服务器。如果您是有大型数据集&#xff0c;那么&#xff0c;使用流缓存服务器可以极大地帮助您最大限度地减少内…

PostgreSQL10.21与PostGIS3.2.3安装文档

背景&#xff1a; 公司需要在一个服务器上装一个pg数据库&#xff0c;要求和其余服务器版本尽量保持一致&#xff0c;临时拉我装一下 特别注意&#xff1a; 需要注意的地方就是因为postgresql数据库是一个空间库&#xff0c;gis行业很多都会使用这个数据库&#xff0c;我们安…

深入Kafka client

分区分配策略 客户端可以自定义分区分配策略, 当然也需要考虑分区消费之后的offset提交, 是否有冲突。 消费者协调器和组协调器 a. 消费者的不同分区策略, 消费者之间的负载均衡(新消费者加入或者存量消费者退出), 需要broker做必要的协调。 b. Kafka按照消费组管理消费者, …

HttpClient—详解、代码演示

简介&#xff1a;HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和建议&#xff0c;即可以通过HttpClient可以再Java中构建和发送Http请求。 …

将jar包打包为docker镜像

此记录一下将springboot项目的jar打包成docker镜像记录错误点。 1.将springboot项目打包成jar包 参考博客 : springboot项目打包成jar_springboot打包成jar-CSDN博客 具体打包步骤参考他的如何打包: 使用IDEA进行打包。但是我需要在我的springboot的pom.xml文件里面配置如下插…

javascript实现的星座查询

今天在这个网站http://xzxys.wiicha.com/看到查询星座幸运色的效果&#xff0c;想研究一下代码&#xff0c;结果右键禁用。后来参考了一下别人的代码&#xff0c;琢磨着先实现了一下星座查询的功能&#xff0c;输入月份和日期四位数后&#xff0c;可以查询属于哪个星座&#xf…