本文目录:
- 一、CNN概述
- 二、CNN日常应用
- 三、CNN的卷积层
- (一 )基本介绍
- (二)卷积层计算
- 1.对输入数据的要求
- 2.卷积核核心参数
- 3.计算过程
- 4.特征图尺寸计算
- 5.1、多通道卷积计算
- 5.2、多卷积核计算
- 6.PyTorch卷积层API
前言:上篇文章讲解了图像,这篇文章正式进入卷积神经网络讲解。
一、CNN概述
卷积神经网络(Convolutional Neural Network, CNN)是一种专门用于处理网格状数据(如图像、视频、语音信号等)的深度学习模型。其核心思想是通过局部感受野、权值共享和空间下采样来高效提取特征,广泛应用于计算机视觉、自然语言处理(如文本分类)等领域。
CNN网络主要由三部分构成:卷积层、池化层和全连接层构成:
(1)卷积层负责提取图像中的局部特征;
(2)池化层用来大幅降低参数量级(降维);
(3)全连接层类似人工神经网络的部分,用来输出想要的结果。
CNN实践案例:
上图中CNN要做的事情就是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车,那是什么车?
二、CNN日常应用
图像分类:最常见的应用,例如识别图片中的物体类别;
目标检测:检测图像中物体的位置和类别;
图像分割:将图像分成多个区域,用于语义分割;
人脸识别:识别图像中的人脸;
医学图像分析:用于检测医学图像中的异常(如癌症检测、骨折检测等);
自动驾驶:用于识别交通标志、车辆、行人等。
三、CNN的卷积层
(一 )基本介绍
卷积层是CNN的核心组件,用于提取输入数据(如图像、语音、文本)的局部特征。它的核心思想是通过局部连接、权值共享和平移不变性高效处理网格状数据(如像素矩阵)。
卷积层利用卷积核(滤波器)对输入进行处理(卷积操作),从而生成特征图(feature map),并且每个卷积层能够提取不同层次的特征,从低级特征(如边缘)到高级特征(如物体的形状)。
卷积层的主要作用如下:
-
特征提取:卷积层的主要作用是从输入图像中提取低级特征(如边缘、角点、纹理等)。通过多个卷积层的堆叠,网络能够逐渐从低级特征到高级特征(如物体的形状、区域等)进行学习;
-
权重共享:在卷积层中,同一个卷积核在整个输入图像上共享权重,这使得卷积层的参数数量大大减少,减少了计算量并提高了训练效率;
-
局部连接:卷积层中的每个神经元仅与输入图像的一个小局部区域相连,这称为局部感受野,这种局部连接方式更符合图像的空间结构,有助于捕捉图像中的局部特征;
-
空间不变性:由于卷积操作是局部的并且采用权重共享,卷积层在处理图像时具有平移不变性。也就是说,不论物体出现在图像的哪个位置,卷积层都能有效地检测到这些物体的特征。
(二)卷积层计算
1.对输入数据的要求
2.卷积核核心参数
3.计算过程
1. input 表示输入的图像;
2. filter 表示卷积核, 也叫做滤波器(滤波矩阵)
- 一组固定的权重,因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter;
- 非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元,多个滤波器叠加便成了卷积层;
- 一个卷积核就是一个神经元。
卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。
如上图左上角的点计算:
按照上面的计算方法可以得到最终的特征图为:
实图-特征图对比:
注意:如果想要提取更多特征(比如花朵的颜色深浅、轮廓、纹理),可以用多个卷积核(分别提取花朵的颜色深浅、轮廓、纹理,生成不同的特征图)。
4.特征图尺寸计算
注意:
5.1、多通道卷积计算
如上图,计算方法如下:
- 当输入有多个通道(Channel), 例如 RGB 三个通道, 此时要求卷积核需要拥有相同的通道数(图像有多少通道,每个卷积核就有多少通道);
- 每个卷积核通道与对应的输入图像的各个通道进行卷积;
- 将每个通道的卷积结果按位相加得到最终的特征图。
如下图所示:
5.2、多卷积核计算
在卷积神经网络(CNN)中,多个卷积核(Filters/Kernels) 的计算是核心操作之一,它使网络能够同时提取多种特征(如边缘、纹理、颜色等)。
特点:
(1)每个卷积核学习不同的特征:
例如:第一个核可能检测水平边缘,第二个核检测垂直边缘,第三个核检测红色通道的特定模式等。
(2)输出多通道特征图:
若有 C_out 个卷积核,输出特征图会有 C_out 个通道。
如上图,可以看到:
- 两个神经元,意味着有两个滤波器;
- 数据窗口每次移动2个步长取3*3的局部数据,即stride=2;
- zero-padding=1。输入数据由
5*5*3
变为7*7*3
; - 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道);
- 中间部分是两个不同的滤波器Filter w0、Filter w1;
- 最右边则是两个不同的输出。
6.PyTorch卷积层API
# 导包
import numpy as np
import matplotlib.pyplot as plt
import torch# 加载数据
n1_img = plt.imread('data/img.jpg')
print(n1_img.shape)
# 把numpy转换为tensor
t1_img = torch.from_numpy(n1_img)
print(t1_img.shape)
# 交换维度 (H,W,C)->(C,H,W)
t2_img = t1_img.permute(2, 0, 1)
print(t2_img.shape)
# 升维
t3_img = t2_img.unsqueeze(0)
print(t3_img.shape)
# TODO 创建卷积层对象 设置输出通道数4,意味着输出的特征图4个
conv = torch.nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, stride=1, padding=0)
# TODO 调用卷积层对象,提取特征,注意类型转换
output = conv(t3_img.to(torch.float32))
print(output.shape)
# 降维
output = output.squeeze(0)
print(output.shape)
# 交换维度
output = output.permute(1, 2, 0)
print(output.shape)
# 转换为numpy TODO 索引0,1,2,3分别可以获取第0,1,2,3个特征图
output = output[:, :, 2].detach().numpy() #2:第三个图
print(output.shape)
# 画图
plt.imshow(output)
plt.show()
运行结果:
可依次修改output = output[:, :, 2].detach().numpy() 将其它三个图显示出来(将2依次换成0、1、3)。
今日分享到此结束。