当前位置: 首页 > news >正文

CNN(卷积神经网络)

什么是CNN

CNN(卷积神经网络),是通过提取特征来压缩计算的一个网络结构,主要由卷积层、池化层、全连接层组成。

卷积层

在卷积层中,通过卷积核的移动对不同的区域提取特征生成一个新的矩阵,比如一个原始数据是55的矩阵,卷积核的大小是22,每次移动一步,我们就能从这个原始数据中提取出有9有效数据的5*5矩阵

池化层

在提取出特征矩阵后,依旧是一个5*5的矩阵,这是就可以通过池化层来缩小这个矩阵,从而减小矩阵的大小,最常见的池化有平均池化、最大池化

激活函数

激活函数的作用就是让上面的线性变换引入非线性的因果,从而形成非线性变换函数。常见的激活函数有Sigmoid、tanh、Relu、Leaky Relu、Maxout、ELU。
问题一:为什么我们要使用激活函数呢?

如果不使用激活函数,我们的每一层输出只是承接了上一层输入函数的线性变换,无论神经网络有多少层,输出都是输入的线性组合。如果使用的话,激活函数给神经元引入了非线性的因素,使得神经网络可以逼近任何非线性函数,这样神经网络就可以应用到非线性模型中。

问题二:那么为什么我们需要非线性函数?

非线性函数是那些一级以上的函数,而且当绘制非线性函数时它们具有曲率。现在我们需要一个可以学习和表示几乎任何东西的神经网络模型,以及可以将输入映射到输出的任意复杂函数。神经网络被认为是通用函数近似器(Universal Function Approximators)。这意味着他们可以计算和学习任何函数。几乎我们可以想到的任何过程都可以表示为神经网络中的函数计算。

全连接层

在池化层中缩小矩阵后,就需要通过全连接层来进行分类,从而达到记住这个特征的目的

LeNet网络

下面是一个案例去实现一个简单的卷积神经网络,通过pytorch编写的一个LeNet网络,在这个网络中有两层卷积操作

import torch
from torch import nn
from torchsummary import summary


class LeNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 卷积核
        # in_channels:输入的图像通道数,比如黑白图像就是1个通道,彩色图像也就是RGB是3通道
        # out_channels:输出的通道数,也就是通过这个卷积核要输出多少个特征图
        # kernel_size:卷积核的大小,用于去做特征图投影的大小  
        # padding:在输出图的边缘补2像素的0以保持尺寸
        self.conv1 = nn.Conv2d(1, 6, 5,padding=2)
        # 激活函数
        self.sig = nn.Sigmoid()
        # 池化层
        self.s1 = nn.AvgPool2d(2, 2)

        self.conv2 = nn.Conv2d(6, 16, 5)
        self.s2 = nn.AvgPool2d(2, 2)

        # 展平,将经过卷积后的数据展平成tensor
        self.flatten = nn.Flatten()
        # 全链接层
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)


    def forward(self, x):
        x = self.sig(self.conv1(x))
        x = self.s1(x)
        x = self.sig(self.conv2(x))
        x = self.s2(x)
        x = self.flatten(x)
        x = self.fc1(x)
        x = self.fc2(x)
        y = self.fc3(x)
        return y
if __name__ == "__main__":
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = LeNet().to(device)
    print(summary(model, (1, 28, 28)))
http://www.dtcms.com/a/121998.html

相关文章:

  • 共工新闻社与韩国新华报社达成合作
  • Python | 第十四章 | 基于模块开发-出租系统
  • 如何设置 JVM 内存参数(-Xms、-Xmx、-Xss 等)?
  • 文件的操作
  • 自然语言处理入门6——RNN生成文本
  • 揭开 MCP 的神秘面纱:标准化 AI 上下文管理的未来(下)
  • 永磁同步电机 | 分类 / 转子结构 / FOC 控制 / 电路分析
  • Android 中集成 Unity 工程的步骤
  • 点云处理常用的软件、开源库及数据集
  • 将jar包制作成deb一键安装包
  • 从 Excel 到你的表格应用:条件格式功能的嵌入实践指南
  • 【机密计算顶会解读】13:CAGE:通过 GPU 扩展补充 Arm CCA
  • 2025年3月全国青少年软件编程等级考试(Python五级)试卷及答案
  • 图解Java设计模式
  • 005.Gitlab CICD变量使用
  • oauth2.0认证原理
  • word表格间隔设置
  • C++20 数学常数:<numbers> 头文件的革新
  • cmd清除网络共享连接凭证
  • C++高精度算法(加、减、乘)
  • 【C++】 —— 笔试刷题day_13
  • 抽象类及其特性
  • cpp(c++)win 10编译GDAL、PROJ、SQLite3、curl、libtiff
  • Easysearch VS Opensearch 数据写入与存储性能对比
  • HOW - 实现 useClickOutside 或者 useClickAway
  • 大模型本地部署系列(1) Ollama的安装与配置
  • 神经网络 | 基于脉冲耦合神经网络PCNN图像特征提取与匹配(附matlab代码)
  • 408 计算机网络 知识点记忆(6)
  • Elasticsearch DSL 中的 aggs 聚合分析
  • 数据结构实验3.3:求解迷宫路径问题