【神经网络】卷积神经网络CNN

卷积神经网络

欢迎访问Blog全部目录

1. 神经网络概览

Leijnen, Stefan & Veen, Fjodor. (2020). The Neural Network Zoo. Proceedings. 47. 9. 10.3390/proceedings47010009.

2.CNN(Convolutional Neunal Network)

CNN的核心为使用卷积核对图像矩阵进行卷积运算(线性运算)!!!

2.1.学习链接

学习笔记:深度学习(3)——卷积神经网络(CNN)理论篇_cnn理论-CSDN博客
【深度学习】一文搞懂卷积神经网络(CNN)的原理(超详细)_卷积神经网络原理-CSDN博客

2.2.CNN结构

2.2.1.基本结构

在这里插入图片描述

2.2.1.1输入层

​ 图片在计算机中是包括 (宽,高,深)的三维矩阵,元素为灰度值或RGB值,其中矩阵的深即为RGB层次。如果为RGB图片,图片深度为3。图片的三维矩阵即为CNN的输入。(宽,高)矩阵为1个channel,(宽,高)矩阵为特征图

​ 输入层即接收原始图片数据,CNN可以保留图片的连续像素(物体的不变性),加深神经网络对图片的理解。

2.2.1.2.卷积层|Convolution Layers

作用:捕捉图片的局部特征而不受其位置的影响。

多个卷积核叠加即为卷积层。

卷积层后需接激活函数(如ReLU)来引入非线性。

2.2.1.3.池化层|Pooling layers

作用:通过减小特征图的大小(下采样)来减少计算复杂性。它通过选择池化窗口内的最大值或平均值来实现。这有助于提取最重要的特征。

有点类似于图像的模糊处理!

2.3.1.4.全连接层|Linear Layers

全连接层将提取的特征映射转化为网络的最终输出。这可以是一个分类标签、回归值或其他任务的结果。

2.2.2.核心要素

名称name含义
过滤器(卷积核)过滤器为可移动的三维小窗口矩阵(N*N*N)【kernel_size】,它是一组固定的权重。卷积操作即为将卷积核与图像进行逐元素相乘后相加。
步长stride卷积核每次滑动位置的步长。
卷积核的个数out_channels决定输出矩阵的深度depth。一个卷积核输出一个深度层。
填充值zero-padding在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置。数据填充的主要目的是确保卷积核能够覆盖输入图像的边缘区域,同时保持输出特征图的大小=输入特征图大小。
如果想要维持特征图大小不变, p a d d i n g = ( k e r n e l _ s i z e − 1 ) / 2 padding=(kernel\_size-1)/2 padding=(kernel_size1)/2!!

以下图为例(图示为conv2d):

步长=2,卷积核个数=2,填充值=1(在图片周围补1圈0),卷积核尺寸为3*3*3

请添加图片描述
在这里插入图片描述

2.3.pytorch CNN

API:torch.nn.convolution-layers — PyTorch 2.2 documentation

2.3.1.区分conv1d与conv2d

conv1dconv2d
输入语音:二维矩阵图像:三维矩阵
卷积核(卷积核尺寸(二维),卷积核个数)(卷积核尺寸(三维),卷积核个数)
总结在特征图内只能竖着扫在特征图内先横着扫再竖着扫

图像的CNN使用的是conv2d!!

2.3.2.CNN搭建与参数

import torch
import torch.nn as nn

class Cnn(nn.Module):
    def __init__(self):
        super(Cnn, self).__init__()
        self.conv1 = nn.Sequential(  # 输入图像尺寸为(1,28,28)
            nn.Conv2d(
                in_channels=1,  # 输入图像的深度 灰度图为1,rgb图为3
                out_channels=16,  # 卷积核个数,输出图像的深度
                kernel_size=5,  # 卷积核尺寸5*5*1
                stride=1,  # 步长
                padding=2  # 填充大小 如果想要 con2d 出来的图片长宽没有变化, padding=(kernel_size-1)/2
            ),  # 输出图像尺寸为(16,28,28)
            nn.ReLU(),  # 激活函数
            nn.MaxPool2d(
                kernel_size=2,  # 池化小区域尺寸2*2,区域模糊
                # stride=2,  # 步长,默认=kernel_size
            ),  # 输出图像尺寸为(16,14,14)
        )
        self.conv2 = nn.Sequential(  # 输入图像尺寸为(16,14,14)
            nn.Conv2d(
                in_channels=16,  # 输入图像的深度
                out_channels=32,  # 卷积核个数,输出图像的深度
                kernel_size=5,  # 卷积核尺寸5*5*16
                stride=1,  # 步长
                padding=2  # 填充大小
            ),
            nn.ReLU(),
            nn.MaxPool2d(
                kernel_size=2,
            )  # 输出图像尺寸为(32,7,7)
        )
        self.out = nn.Linear(32 * 7 * 7, 10)  # 输出10*1的矩阵

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        # x图像平铺成 (batch_size=1, 32 * 7 * 7)
        x = x.view(x.size(0), -1)  # view中一个参数定为-1,代表自动调整这个维度上的元素个数,以保证元素的总数不变。
        output = self.out(x)
        return output


cnn = Cnn()
print(cnn)
'''
Cnn(
  (conv1): Sequential(
    (0): Conv2d(1, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (conv2): Sequential(
    (0): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (out): Linear(in_features=1568, out_features=10, bias=True)
)
'''

2.3.3.示意图⭐️

注:由于画幅有限,示意图仅画了1个大卷积层。
在这里插入图片描述

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值