CNN框架的基础认识

一、视觉处理常用的领域介绍

常见的视觉处理网络中,大家熟知的主要为Convolutional Neural Network(CNN),也称视觉神经网络。特点主要为在深度学习网络中采用conv的方式对图像进行卷积操作,进行图像的特征提取,最后采用flatten的方式全连接进行概率预测,从而达到图像目标的分类、目标检测、图像分割等相关工作。

注:在深度学习网络中为什么采用卷积的形式提取特征,而不采用全连接的方式提取特征?

在常规的全连接深度学习网络框架中,采用Y = w * x + b的方式进行线性计算,对线性公式进行激活从而完成一次深度学习与全连接操作。则当输入维度不变,输出维度由10变成100时,需要计算的参数量将同样会扩大10倍。极易造成参数量巨大,导致计算缓慢。
而采用卷积操作时,只需要根据输出维度添加对应的卷积核,极大的降低参数量。
同时,线性表达虽增加了激活函数,增加模型的非线性表达能力,但因参数量巨大,学习量大,学习效率低。

CNN 构成的主要模块有 卷积层、池化层、全连接层。三部分构成。

二、卷积层

卷积层为CNN网络中最主要的特征提取层,其目的为通过采用卷积核的方式对图像进行卷积操作,通过不断的提取图像中的feature maps ,对图像中各个像素点或相邻位置的像素关系进行提取,最终完成图像的分类、目标识别等操作。

卷积操作的特点

1)减少参数的计算量
2)特征提取的过程中可以关注周围图像的特征

# 操作代码
import torch.nn as nn
conv = nn.Conv2d(
				in_channels=4,   # 输入通道的大小
				out_channels=1,   # 输出通道的大小
				kernel_size=3,   # 卷积核大小
				stride=1,   # 步长
				padding=1,  # 周围填充
				groups=1,  # 分组 = 主要用于多通道卷积,group 与 group 之间参数不共享
				dilation = 1)  # 膨胀系数 == 用于膨胀卷积操作

三、池化层

池化层主要的目的为对特征图进行Maxpooling,在最大限度保持图像特征的基础上,降低特征图的大小,降低参数的计算量,提高计算效率。
最常用的池化操作为 最大池化平均池化 两种。

# 代码演示
# 最大池化
nn.MaxPool2d(
    kernel_size=2,  # 卷积核大小
    stride=2,  # 步长
    padding=0, # 周围填充
    dilation=1, # 膨胀系数
    return_indices=False,  # 是否返回index == 用于 上采样操作
)

nn.AvgPool2d(
    kernel_size=2,  # 卷积核大小
    stride=2, # 步长
    padding=0,
    ceil_mode=False
)
# 当卷积核为2*2 步长为2时,输入图像为512*512==>输出图像尺寸为256*256。同时 Maxpooling中不增加参数量,不改变特征图输入通道数与输出通道数。

三、全连接层

全连接操作主要为将提取到的特征同经过flatten后进行全连接操作,最终采用softmax函数输出,进行图像的多分类操作。

# 代码演示 == 线性层
nn.Linear(
    in_features=64,  # 输入的特征数量
    out_features=10,  # 输出特征数量
    bias=True,  # 偏置
)

四、小结

以上是构成CNN网络模型的三大模块,最终的成品进行展示如下。
在这里插入图片描述

# 继承nn.Module类,进行模型构建
class MyNET(nn.Module):
    def __init__(self):
        super(MyNET,self).__init__()

        self.conv1 = nn.Conv2d(
            in_channels=1,
            out_channels=6,
            kernel_size=5,
            stride=1,
            padding=0,
        )
        self.conv3 = nn.Conv2d(
            in_channels=6,
            out_channels=16,
            kernel_size=5,
            stride=1,
            padding=0,
        )

        self.Linear5 = nn.Linear(in_features= 16 * 5 * 5,
                                 out_features=120)
        self.Linear6 = nn.Linear(in_features=120,
                                 out_features=84)
        self.Linear7 = nn.Linear(in_features=84,
                                 out_features=10)
    def sortmax(self,x):
        model = nn.Softmax(dim=1)
        return model(x)
    def forward(self,x):
        x = self.conv1(x)  # 第一次卷积
        x = self.maxpooling(x)  # 第一次池化
        x = self.conv3(x)  # 第二次卷积
        x = self.maxpooling(x)  # 第二次池化  16*5*5
        # 对数据进行展平
        x = x.view(-1,16*5*5)   # 确定输出值 自动计算输入的行数
        x = self.Linear5(x)
        x = self.Linear6(x)
        x = self.Linear7(x)
        x = self.sortmax(x)
        return x
    def maxpooling(self,x):
        max_pool = nn.MaxPool2d(kernel_size=2,stride=2)
        return max_pool(x)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值