【深度学习】超级简单的卷积神经网络(CNN)

1.卷积神经网络介绍

卷积神经网络(Convolutional Neural Networks)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。

2.卷积神经网络的结构

卷积神经网络一般包含如下几种结构,输入层,卷积层,池化层,激活函数,全链接层,输出层。

2.1 输入层

输入层简单说就是一个矩阵,该矩阵表示输入图片的像素点

2.2 卷积层

卷积层是卷积神经网络的关键所在,但是理解起来很简单,首先要明白几个概念,input_size表示输入的矩阵的大小,filter_size表示卷积核的大小,stride表示步长,padding表示填充。根据下图,我们来详细的讲一下以上的几个概念分别是如何使用的:
【深度学习】超级简单的卷积神经网络(CNN)_第1张图片
注意第一列蓝色的矩阵为输入层,第二列第三列红色的矩阵为卷积层最后一列绿色的矩阵为输出层
首先蓝色的矩阵表示输入层,其中input_size也就是5(即5*5*3的矩阵),padding为1,表示周围添加一圈0作为填充,因此整个输入层变为7*7*3的矩阵。
红色的矩阵表示过滤器,w0表示第一个过滤器,w1表示第二个过滤器,那么过滤器的大小也就是前面说的filter_size是3(即3*3*3的矩阵)。
到这里不难发现其实上图就是将一个7*7*3的矩阵展开,过滤器也一样展开。
那么输出层是如何计算的呢?其实就是对应位置相乘最后求和即可,按照上图,首先输入层的三维分别记做x[,,0],x[,,1],x[,,2],那么第一个绿色矩阵的第一个元素的输出结果就是过滤器w0第一次的卷积结果,将每一层过滤器映射在每一层输入层上的结果分别记为sum_w0_00, sum_w0_01,sum_w0_02
sum_w0_00 = 0*1 + 0*1 + 0*1 + 0*(-1) + 2*1 + 1*0 + 0*1 + 2*1 + 1*1 = 5
sum_w0_01 = 0*0 + 0*(-1) + 0*0 + 0*0 + 1*0 + 2*1 + 0*1 + 1*0 + 0*0 = 2
sun_w0_02 = 0*0 + 0*0 + 0*(-1) + 0*(-1) + 1*0 + 2*0 + 0*(-1) + 0*(-1) + 0*0 = 0
因此第一个绿色矩阵的第一个元素也就等于sum_w0_00 + sum_w0_01 + sum_w0_02 + b0 = 8
剩下的计算方式与前面一致,由于stride为2,所以过滤器每次向右滑动两个单位即可。
最后对于计算输出层的大小有如下公式:
o u t p u t _ s i z e = i n p u t _ s i z e + 2 ∗ p a d d i n g − f i l t e r _ s i z e s t r i d e + 1 output\_size=\frac{input\_size + 2*padding-filter\_size}{stride} + 1 output_size=strideinput_size+2paddingfilter_size+1
因此根据上面的例子output_size = (5 + 2 * 1 - 3) / 2 + 1 = 3,因此最后输出的矩阵为3*3,由于我们这里使用了两个filter因此最终结果为3*3*2
注意事项:

  • 过滤器的通道数必须要和输入的通道数一样
  • 假设输入图片大小是224*224*3,过滤器大小是3*3*3,使用64个过滤器,那么最后的输出结果为112*112*64
Pytorch相关代码
torch.nn.Conv2d(in_channels: int, # 输入的通道数
				out_channels: int, # 输出通道数
        kernel_size: _size_2_t, # 卷积核的大小
        stride: _size_2_t = 1, # 步长(默认为1)
				padding: _size_2_t = 0, # 填充(默认为0)
        groups: int = 1,
        bias: bool = True,
        padding_mode: str = 'zeros')

2.3 池化层

池化层分为两种,分别为平均池化和最大池化,最大池化目前用的更多一些,简单的说和卷积很类似,卷积是点乘求和,最大池化则是点乘求最大值,平均池化则是点乘求平均。

Pytorch相关代码

最大池化

torch.nn.MaxPool2d(kernel_size: _size_any_t, # 池化窗口的大小
				stride: Optional[_size_any_t] = None, # 步长
        padding: _size_any_t = 0) # 填充(默认为0)

平均池化

torch.nn.AvgPool2d(kernel_size: _size_any_t, # 池化窗口的大小
				stride: Optional[_size_any_t] = None, # 步长
        padding: _size_any_t = 0) # 填充(默认为0)

2.4 全链接层

全链接层就是将特征图转换成一个列向量

你可能感兴趣的:(目标检测,深度学习,深度学习,cnn,神经网络)