图像基础知识
图像是由像素点组成的,每个像素点的取值范围为
: [0, 255]
。像素值越接近于
0
,颜色越暗,接近于黑色;像素值越接 近于255
,颜色越亮,接近于白色。
在深度学习中,我们使用的图像大多是彩色图,彩色图由
RGB3
个通道组成,如下图所示
import numpy as np
import matplotlib.pyplot as plt
# 黑
z = np.zeros([200,200,3])
plt.imshow(z)
plt.show()
# 白
w = np.full([200,200,3],255)
plt.imshow(w)
plt.show()
# 美女图片
img = plt.imread('data/img.jpg')
print(img.shape)
plt.imshow(img)
plt.show()
CNN概述
卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络. 卷积层的作用就是用来自动学习、提取图 像的特征.
CNN网络主要由三部分构成:卷积层、池化层和全连接层构成:
1. 卷积层负责提取图像中的局部特征;
2. 池化层用来大幅降低参数量级(降维);
3. 全连接层用来输出想要的结果。
卷积层
卷积计算
1. input
表示输入的图像
2. filter
表示卷积核
,
也叫做卷积核
(
滤波矩阵
)
3. input
经过
filter
得到输出为最右侧的图像,该图叫做特征图
卷积运算本质上就是在卷积核和输入数据的局部区域间做点积。
Padding
通过上面的卷积计算过程,最终的特征图比原始图像小很多,如果想要保持经过卷积后的图像大小不变, 可以在原图周围添加 padding 来实现.
Stride
多通道卷积计算
特征图大小
输出特征图的大小与以下参数息息相关
:
1. size:
卷积核
/
过滤器大小,一般会选择为奇数,比如有
1*1
、
3*3
、
5*5
2. Padding:
零填充的方式
3. Stride:
步长
那计算方法如下图所示
:
1.
输入图像大小
: W x W
2.
卷积核大小
: F x F
3. Stride: S
4. Padding: P
5.
输出图像大小
: N x N
代码示例
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
img = plt.imread('data/img.jpg')
print(img.shape)
# 卷积层
"""
参数说明:
in_channels: 输入通道数,
out_channels: 输出通道,也可以理解为卷积核kernel的数量
kernel_size:卷积核的高和宽设置,一般为3,5,7...
stride:卷积核移动的步长
padding:在四周加入padding的数量,默认补0
"""
layer = nn.Conv2d(in_channels=3,out_channels=10,kernel_size=3,stride=2,padding=0)
# 图片为维度交换位置 增加维度
img = torch.tensor(img).permute(2,0,1).unsqueeze(0)
# 转换类型
fm = layer(img.type(torch.float32))
print(fm.shape)
池化层
池化计算
池化层
(Pooling)
降低维度
,
缩减模型大小,提高计算速度
Stride
Padding
多通道池化层计算
代码示例
import torch
import torch.nn as nn
torch.random.manual_seed(10)
# 数据 多通道池化改 size
input = torch.randint(0,10,size=(3,3,3),dtype=torch.float32)
print(input)
# 最大池化
mpool = nn.MaxPool2d(kernel_size=2,stride=1,padding=0)
outputs = mpool(input)
print(outputs)
# 平均池化
mpool = nn.AvgPool2d(kernel_size=2,stride=1,padding=0)
outputs = mpool(input)
print(outputs)