当前位置: 首页 > news >正文

神经网络之CNN图像识别(torch api 调用)

1.简介

CNN 是受生物学上感受野机制启发而提出的。它通过卷积操作自动提取数据中的特征,避免了传统机器学习方法中复杂的特征工程过程,能够自动学习到数据中的有效特征,从而进行分类、识别等任务。

2.结构

2.1卷积:

假设你有一张图片(就是样本),他的像素点就是你的特征属性 一张图片[27,27,3]:长,宽,通道(RGB)

1.疑点:为什么3d到2d:因为图像通道分离:rgb 分别分成了 28x28x1的3张像素图

2.疑点:卷积的作用:卷积就是上面的小数字,3x3矩阵->与像素相乘->得到特征值->组成新的特征矩阵

3.疑点:卷积参数:

步长 :就是滑动的步数   卷积核:就是多大的矩阵

卷积个数:一层进行多少次卷积  填充:在原本样本特征上 有多少层填零

conv_layer = nn.Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)

 这个是一个2维卷积层api 针对于图片

 3:这是输入通道数(in_channels),意味着输入的特征图具有 3 个通道,通常对应 RGB 彩色图像的三个颜色通道(红、绿、蓝)。

64:代表输出通道数(out_channels),即经过该卷积层处理后,输出的特征图将有 64 个通道。每一个输出通道都对应一组卷积核学习到的不同特征。

kernel_size=(7, 7):指定卷积核的大小,这里是一个 7x7 的二维卷积核。在卷积操作时,这个 7x7 的卷积核会在输入特征图上滑动,进行卷积计算。

stride=(2, 2):表示卷积核在输入特征图上滑动的步长。在水平和垂直方向上,卷积核每次移动 2 个像素。较大的步长会使输出特征图的尺寸变小。

padding=(3, 3):在输入特征图的边界周围填充像素的数量。水平和垂直方向上都填充 3 个像素。填充的目的是为了控制输出特征图的尺寸,避免在卷积过程中特征图尺寸过度缩小。

bias=False:表示在卷积层中不使用偏置项。偏置项是一个可学习的标量,用于在卷积计算后对结果进行偏移。设置为 False 意味着不添加这个偏置项

输出的维度的计算公式:宽和高一样的

(W_{in}+2p-k)/s+1

你得到

2.2归一化层

实现:针对于一个batch_size的同一特征归一化

作用:加速模型收敛:减少了内部协变量偏移,使得梯度更加稳定,从而加快训练速度。

具有一定正则化作用:可以减少过拟合的风险。

bn_layer = nn.BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  1. 64:这是输入特征图的通道数(num_features)。在 CNN 里,通常会将卷积层的输出特图输入到批量归一化层进行处理,这里的 64 就对应着上一层卷积层输出的特征图通道数量。

  2. eps:一个很小的数值,用于在分母中添加一个小的偏移量,避免在归一化计算时出现除以零的情况,默认值为 1e-05。在批量归一化的计算过程中,需要对输入数据进行标准化,即减去均值并除以标准差,eps 保证了计算的稳定性。

  3. momentum:用于计算运行时的均值和方差的动量参数,默认值为 0.1。在训练过程中,批量归一化层会记录每个批次数据的均值和方差,并使用动量更新全局的运行均值和运行方差。

2.3激活函数 :

引入非线性

  • 神经网络的主要目标是学习复杂的非线性关系。如果没有激活函数,神经网络将仅仅是一个线性模型,无论网络有多少层,其本质都只是一个线性变换,只能学习到输入数据的线性组合关系,这极大地限制了神经网络的表达能力。激活函数的引入打破了这种线性限制,使得神经网络能够学习到更复杂、更高级的非线性映射关系,从而可以对各种复杂的数据集进行建模,例如图像、语音等具有高度非线性特征的数据。

增加模型的表达能力

  • 激活函数能够让神经网络具有更强的函数逼近能力。根据通用近似定理,具有非线性激活函数的多层神经网络可以以任意精度逼近任何一个连续函数。这意味着通过选择合适的激活函数和调整神经网络的参数,我们可以让模型拟合几乎任何复杂的函数关系,从而能够处理各种不同类型的任务,如分类、回归、生成等。

  • 不同的激活函数具有不同的非线性特性,例如 Sigmoid 函数具有平滑的饱和特性,ReLU 函数具有单侧线性的特性等,这些不同的特性使得神经网络在学习不同类型的数据和任务时具有不同的优势,进一步丰富了模型的表达能力。

nn.relu()

2.4池化层:

池化操作可以在不损失太多关键信息的前提下,大大减少数据的规模,从而降低计算量,提高模型的运行速度。此外,池化还能够增强模型对输入数据的平移、旋转和尺度变化等的鲁棒性,使得模型具有更好的泛化能力。

最大池化(Max Pooling):在每个池化窗口内取最大值作为该窗口的输出。例如,对于一个 2×2 的池化窗口,在这个窗口内的 4 个元素中选择最大值作为池化后的结果。最大池化能够突出图像中的显著特征,因为它保留了每个区域内的最大值,通常可以捕捉到图像中最具代表性的特征,如边缘、角点等

  nn.MaxPool2d(kernel_size=2)

2.5全连接层

将特征数据转化成成一维向量;分来判别分类概率(激活函数)

nn.Linear(input_dim, class_dim)

 你的最后输出以及类别

2.6感受野

最终一个特征值 能感觉到原属性特征图上的多大尺寸

3.概型图

4.基于torch的代码


class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),#stride=1, padding=2 决定你 
            nn.BatchNorm2d(16),
            nn.ReLU(),
           
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)
        )
        self.conv3 = nn.Sequential(
            nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            
        )
        self.conv4 = nn.Sequential(
            nn.Conv2d(64, 32, kernel_size=5, stride=1, padding=2),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)
        )
        self.out = nn.Linear(32* 7 * 7, 10)
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = x.view(x.size(0), -1)
        output = self.out(x)

 

相关文章:

  • 建易WordPress
  • 算法-二叉树篇23-二叉搜索树中的插入操作
  • 夜天之书 #106 Apache 软件基金会如何投票选举?
  • Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)
  • AF3 DataPipeline类process_core 方法解读
  • sql server 版本更新日期
  • 经典算法 金币阵列问题
  • 【SpringCloud】黑马微服务学习笔记
  • 考虑复杂遭遇场景下的COLREG,基于模型预测人工势场的船舶运动规划方法附Matlab代码
  • 【Nginx】在Windows服务器上用Nginx部署Vue前端全流程(附避坑指南)
  • 全监督、半监督、弱监督、无监督
  • 【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
  • PDF文件转换为PNG图像
  • Kubernetes kubelet inotify
  • [随手笔记]C#保留小数防止四舍五入有效解决办法
  • 架构师面试(九):缓存一致性
  • 使用Python实现机器学习小案例:构建房价预测模型
  • 单一职责原则(设计模式)
  • FloodFill 算法(典型算法思想)—— OJ例题算法解析思路
  • SQL命令详解之数据的查询操作
  • 网站建设 类/网站托管服务商
  • 奉贤宜昌网站建设/国内十大软件培训机构
  • 男科医院网站建设策略/关键词优化资讯
  • 慈利网站开发/搜索排名查询
  • 华企网络/苏州网站关键词优化推广
  • 无锡做网站品牌公司/四川seo多少钱