卷积神经网络基本概念
文章目录
- 前言
- 一、卷积神经网络基础
- 1.卷积
- 2.池化
前言
通过今天的学习,我掌握了卷积神经网络的基本概念,包括卷积,池化的相关概念和基本原理。
一、卷积神经网络基础
卷积神经网络(CNN)可以看作是全连接神经网络的特殊形式。常用于对图形图像进行处理。
从上图可以看出,CNN在结构上和全连接神经网络十分相似,不同的是,CNN将全连接层替换为了卷积层并且加入了池化层。
接下来,我们从卷积核池化两个概念入手理解CNN。
1.卷积
通过之前的学习,我们可以知道全连接神经网络的网络结构较为复杂,参数量较大,很容易造成过拟合的现象,同时计算开销也比较大。在处理图形图像数据时有较大的局限性。
为了解决这一问题,同时结合图像本身具有的局部不变性(简单理解就是CNN只关心特征而不是特征的位置)特征,设计了CNN。
CNN通过卷积核在图像数据上滑动并提取特征。
卷积是CNN的核心理念,遵循局部连接,权重共享的原则。
- 局部连接是指每个神经元仅与输入数据的局部区域链接,这样可以极大程度地降低计算成本。
- 权重共享是指当前层所有神经元都使用同一套权重,即都利用同一个卷积核进行计算,进一步减少了模型的参数。
需要注意的是,卷积核是一个超参数,是人为精心设定的,基于长久的经验得出。
以下定义了一个简单的二维CNN:
import torch
from torch import nn# 定义输入
input_maxtrix = torch.tensor([[1,2,3],[4,5,6],[7,8,9]
],dtype=torch.float)# 定义卷积核
kernal = torch.tensor([[0,1],[2,3]],dtype=torch.float)# 扩展输入为4维,conv2d要求四维张量
# 包括批次,通道数,高度,宽度
input_tensor = input_maxtrix.view(1,1,3,3)# 创建卷积层
conv_lay = nn.Conv2d(in_channels=1, # 输入通道数out_channels=1, # 输出通道数kernel_size=2, # 核大小stride=1, # 步长padding=0, # 是否边缘填充bias=False # 禁用偏置)conv_lay.weight.data = kernal.view(1,1,2,2)output_maxtrix = conv_lay(input_tensor)# 降维
output_maxtrix = output_maxtrix.squeeze().detach()print(output_maxtrix)
tips:Conv2d要求输入数据的维度为4,需要结合实际情况和最后输出的要求灵活进行维度变换。
2.池化
池化是一种减少特征图维度,降低输出复杂度的技术,原理是通过卷积核对特征图进行操作(如提取最大值或平均值),进而实现特征图的降维。
需要注意的是,池化操作中的卷积核是没有核值的,常见的池化操作有:最大值池化,平均值池化。两种方法顾名思义就是取卷积核中的最大值或平均值。
在卷积后添加池化操作,我们就可以得到一个基本的CNN结构。
import torch
from torch import nn
import numpy as np# 定义输入
matrix_np = np.array([[[[1.0, 0.0, 0.0, 0.0, 1.0],[0.0, 1.0, 0.0, 1.0, 0.0],[0.0, 0.0, 1.0, 0.0, 0.0],[0.0, 1.0, 0.0, 1.0, 0.0],[1.0, 0.0, 0.0, 0.0, 1.0]]]]).astype(np.float32)
# 定义卷积核
kernel = torch.tensor([[0., 0., 1.],[0., 1., 0.],[1., 0., 0.]
], dtype=torch.float32)
# 转换为Tensor
input_data = torch.from_numpy(matrix_np)
# 构建卷积层
conv_layer = nn.Conv2d(in_channels=1, out_channels=1, stride=1, kernel_size=3, padding=1)
# 扩展维度
conv_layer.weight.data = kernel.view(1, 1, 3, 3)
# 对输入数据进行卷积操作
output_data1 = conv_layer(input_data)
# 输出结果
# print(torch.round(output_data1))
# 定义池化层
max_pool_layer = nn.MaxPool2d(kernel_size=2,stride=3,
)
output_data2 = max_pool_layer(output_data1)print(torch.round(output_data2))
THE END