目录
一、CNN
1. 概述
1.1 与传统网络的区别
1.2 全连接的局限性
1.3 卷积思想
1.4 卷积的概念
1.4.1 概念
1.4.2 局部连接
1.4.3 权重共享
2. 卷积层
2.1 卷积核
2.2 卷积计算
2.3 边缘填充
2.4 步长Stride
2.5 多通道卷积计算
2.7 特征图大小计算方法
2.9 卷积参数共享
一、CNN
视觉处理三大任务:图像分类、目标检测、图像分割
1. 概述
卷积神经网络(Convolutional Neural Network,CNN)是一种专门用于处理具有网格状结构数据的深度学习模型。
CNN网络主要有三部分构成:卷积层、池化层和全连接层构成,其中卷积层负责提取图像中的局部特征;池化层用来大幅降低运算量并特征增强;全连接层类似神经网络的部分,用来输出想要的结果。
1.1 与传统网络的区别
1.2 全连接的局限性
- 参数量巨大
- 表达能力太有限
1.3 卷积思想
卷:从左往右,从上往下
积:乘积,求和
1.4 卷积的概念
1.4.1 概念
Convolution,输入信息与卷积核(滤波器,Filter)的乘积。
1.4.2 局部连接
-
局部连接可以更好地利用图像中的结构信息,空间距离越相近的像素其相互影响越大。
-
根据局部特征完成目标的可辨识性。
1.4.3 权重共享
-
图像从一个局部区域学习到的信息应用到其他区域。
-
减少参数,降低学习难度。
2. 卷积层
2.1 卷积核
卷积核用来提取图像中的特征,卷积核本质是矩阵,在定义时需要考虑:
-
卷积核的个数:卷积核的个数决定了其输出特征矩阵的通道数。
-
卷积核的值:卷积核的值是自定义的,根据想要提取的特征来进行设置,后续进行更新。
-
卷积核的大小:常见的卷积核有1×1、3×3、5×5等,一般都是奇数 × 奇数。
2.2 卷积计算
卷积的过程是将卷积核在图像上进行滑动计算,每次滑动到一个新的位置时,卷积核和图像进行点对点的乘积,并将其求和得到一个新的值,然后将这个新的值加入到特征图中,最终得到一个新的特征图。
2.3 边缘填充
在图像四周填充数值。
Padding的作用
(1)保持图像大小不变,。
(2)更好的保护了图像边缘数据的特征。
2.4 步长Stride
卷积层通常按照步长为1来移动卷积核。
Stride的设置需注意:
(1)stride太小:重复计算较多,计算量大,训练效率降低;
(2)stride太大:会造成信息遗漏,无法有效提炼数据背后的特征;
2.5 多通道卷积计算
计算方法如下:
(1)当输入有多个通道(Channel), 例如RGB三通道, 此时要求卷积核需要有相同的通道数。
(2)卷积核通道与对应的输入图像通道进行卷积。
(3)将每个通道的卷积结果按位相加得到最终的特征图。
2.7 特征图大小计算方法
-
输入图像大小: W x W
-
卷积核大小: F x F
-
Stride: S(步长)
-
Padding: P(零填充的方式)
-
输出图像大小: N x N
2.9 卷积参数共享
一个卷积核一个偏置参数
数据是 32×32×3 的图像,用 10 个 5×5 的filter来进行卷积操作,所需的参数有多少个呢?
需要 卷积核参数:5×5×3×10 个 ,偏置参数:10个
需要参数总数:5×5×3×10+10
import torch
import os
import matplotlib.pyplot as plt
import torch.nn as nn
img = plt.imread('data/test.png')
# numpy转tensor: HWC-->CHW-->NCHW 链式调用
img =torch.tensor(img).permute(2,0,1).unsqueeze(0)
print(img.shape)
conv = nn.Conv2d(
in_channels = 4,# 输入通道
out_channels =3,# 输出通道
kernel_size=(3,3),# 卷积核大小
stride = 1,# 步长
padding = 0,# 零填充
)
out = conv(img)
print(out.shape)
plt.imshow(out[0][0].detach().numpy(),cmap='gray')
plt.show()