首页 > 编程语言 >卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

时间:2024-01-28 20:25:14浏览次数:22  
标签:nn 卷积 self 彩色图片 特征 神经网络 图像 输入

原文链接:https://blog.csdn.net/master_hunter/article/details/133156758

卷积神经网络相对于普通神经网络在于以下四个特点:

局部感知域:CNN的神经元只与输入数据的一小部分区域相连接,这使得CNN对数据的局部结构具有强大的敏感性,可以自动学习到图像的特征。
参数共享:在CNN中,同一个卷积核(filter)在整个输入图像上滑动,共享权重和偏置。这减少了网络的参数量,提高了模型的泛化能力。
池化层:通过池化层,CNN可以降低特征图的分辨率,减少计算量,同时保留主要的特征信息,提高了网络的抗噪能力和泛化能力。
层次化特征提取:通过堆叠多层卷积层和池化层,网络可以逐级提取图像的抽象特征,从低级特征如边缘到高级特征如纹理、形状等。

卷积运算
我们以多个实例来理解卷积运算:

单通道,二维卷积运算示例


红色的方框圈中的数字和卷积核乘积再相加得到输出数据。

单通道,二维,带偏置的卷积示例


带偏置的计算是在上述乘积运算之后加上偏置。

带填充的单通道,二维卷积运算示例


对于以上实例填充边缘为0的向量,是因为在标准的卷积过程中,存在两个问题:

每次卷积运算后,图像就会缩小,在经历多次运算后,图像终会失去其形状,变为 的 “柱状”。

对于图像边缘的像素,其只被一个输出所触碰或者使用,但对于图像中间的像素,则会有多个卷积核与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着卷积过程丢掉了图像边缘位置的许多信息。

对于这个问题,可以采用额外的 “假” 像素(通常值为 0, 因此经常使用的术语 ”零填充“ )填充边缘。这样,在滑动时的卷积核可以允许原始边缘像素位于其中心,同时延伸到边缘之外的假像素。至于选择填充多少像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。

Valid 卷积意味着不填充;Same卷积意味填充后,输出图像的尺寸与输入图像的尺寸相同

多通道卷积计算

多通道卷积会按通道进行输入数据和滤波器的卷积运算,并将结果相加, 从而得到输出

 以上篇文章卷积神经网络对Cifar10图像的分类卷积运算的过程,整体网络计算架构为

原图像(尺寸为32*32*3)分别和n5*5*3的卷积核(又名滤波器,filiter)进行卷积运算,得到n28*28*1的特征图(feature map),每个特征图分别添加不同的偏置(bias),具体为特征图中的每个元素 +\ b_n,对每个特征图添加激活函数g(X),进行非线性运算,将这 n个特征图依次叠加,得到最终的特征图(尺寸为 28\times 28 \times n28*28*n)。

1.局部感知域
局部感知域指的是网络中的每一个神经元只对输入数据的一个局部区域进行感知,而不是整个输入数据。

 

在卷积神经网络中,每个神经元的权重是共享的。这意味着在处理不同的输入位置时,使用的权重是相同的。这种权重共享使得网络对于平移不变性具有很强的适应能力。卷积操作只关注输入数据的局部区域,而非整个输入数据。这样可以减少网络的参数数量,降低计算复杂度。由于权重共享和稀疏连接的特性,卷积神经网络能够高效地处理大规模的输入数据,如高分辨率图像。通过卷积操作,网络可以逐步提取输入数据的局部特征,从低层到高层,逐步抽象和组合特征,形成对于整体特征的理解。

2.参数共享
卷积神经网络(Convolutional Neural Network,CNN)的参数共享是指在网络的不同位置使用相同的参数(权重和偏置)来处理输入数据的不同区域,这是卷积层的一个重要特点。

具体来说,卷积操作在处理输入数据时,会使用一个称为卷积核(filter)的小窗口,通过与输入数据的局部区域进行卷积运算来提取特征。而在整个输入数据上,使用的卷积核是相同的。这意味着网络的不同位置使用的权重是共享的。

这种参数共享有以下几个重要特点:

减少参数数量:由于同一个卷积核在不同位置共享,网络的参数数量大大减少。这降低了模型的复杂度,减少了过拟合的可能性。

增强模型的平移不变性:由于同一特征的卷积核在不同位置使用相同的权重,使得模型对输入数据的平移具有不变性,从而能够更好地处理平移变换后的数据。

提高计算效率:参数共享减少了计算量,因为不同位置使用相同的权重进行计算,避免了重复计算。

# 定义一个简单的卷积神经网络
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# 定义一个卷积层,使用3个3x3的卷积核
self.conv = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3)

def forward(self, x):
# 使用卷积操作处理输入数据
x = self.conv(x)
return x
self.conv 是一个卷积层,它使用了3个3x3的卷积核进行卷积操作。无论输入数据的哪一个位置,这3个卷积核的参数都是相同的。

3.池化层
对于 的特征图,其池化过程仅需通过池化核对该特征图进行池化运算即可得到输出。

 

在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,但这样做会面临巨大计算量的挑战。并且容易出现过拟合 (over-fitting)。

池化层通过对特征图进行降维,减少了后续层的计算量,同时保留了重要的特征。卷积后的特征具有一种“静态性”的属性,意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。也就是说一张图片有多只鸟,在一个区域提取的鸟图像的特征在该图像的另一端鸟图像的特征也同样适用。与卷积层类似,池化操作也使用一个移动的窗口,但它的操作是简单的统计汇总(如最大值或平均值)。这些统计到的特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling)。

import torch
import torch.nn as nn

# 定义一个示例的特征图(假设通道数为3,高度为4,宽度为4)
feature_map = torch.randn(1, 3, 4, 4) # 1表示batch size

# 定义一个最大池化层,窗口大小为2x2,步幅为2
max_pooling_layer = nn.MaxPool2d(kernel_size=2, stride=2)

# 应用最大池化层
output = max_pooling_layer(feature_map)

# 输出的尺寸会缩小一半(因为窗口大小为2x2,步幅为2)
print(output.shape)


这样需要注意的是,池化操作是对每个通道分别进行的,不会改变通道的数量。池化层对于一定程度的平移、旋转、缩放等变化保持不变性,即使特征稍微移动也能被正确检测到,减少了特征图的维度,也减少了模型的参数数量,有助于减轻过拟合的问题。

4.层次化提取
根据以上的图例很容易明白CNN的的计算层次化,CNN 由多个卷积层和池化层组成,每一层都可以提取出不同层次的特征。前层主要提取低级特征(如边缘、纹理等),后层逐渐提取高级抽象的特征(如形状、对象等)。每一层的特征都是基于前一层的特征提取的,这样多层的叠加使得网络能够提取出更加复杂的特征。随着层次的增加,特征图的尺寸逐渐缩小,这减少了后续层的计算量。

 

三、卷积网络组成结构


卷积神经网络(Convolutional Neural Network,CNN)的基本架构通常包括以下几种层:

输入层(Input Layer):接受原始数据输入,例如图像,其尺寸与输入图像的尺寸相匹配。

卷积层(Convolutional Layer):负责特征提取。卷积核在输入数据上滑动,计算每个位置的卷积,从而得到特征图。多个卷积核可以提取多种特征。通常会使用ReLU等激活函数来引入非线性。

池化层(Pooling Layer):减小特征图的尺寸,同时保留最重要的信息。常用的池化操作是最大池化和平均池化。

全连接层(Fully Connected Layer):将之前层次提取的特征进行扁平化,并通过全连接操作将其与输出层相连接。

输出层(Output Layer):根据任务的不同,可以是一个全连接层,也可以是一个Softmax层,用于分类问题。

批归一化层(Batch Normalization Layer):用于加速训练过程,提升模型的泛化性能。

Dropout层:在训练过程中随机断开一部分神经元,防止过拟合。

残差连接(Residual Connection):引入跳跃连接,可以在深层网络中减轻梯度消失问题。

卷积核(Kernel):卷积操作的核心部分,可以将其视为特征检测器。

一个简单的卷积神经网络示例:

import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(32 * 16 * 16, 512)
self.fc2 = nn.Linear(512, 10)

def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 32 * 16 * 16)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x

# 创建网络实例
net = SimpleCNN()

# 打印网络结构
print(net)
其中包含两个卷积层、两个池化层和两个全连接层。

 

 



标签:nn,卷积,self,彩色图片,特征,神经网络,图像,输入
From: https://www.cnblogs.com/Dongmy/p/17993225

相关文章

  • 文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
    一、介绍文本分类系统,使用Python作为主要开发语言,通过选取的中文文本数据集("体育类","财经类","房产类","家居类","教育类","科技类","时尚类","时政类","游戏类","娱乐类"),基于TensorFlow搭建CNN卷积神经网络算法模型,并进行多轮迭代训练最后得到一个识......
  • 机器学习从入门到放弃:卷积神经网络CNN(一)
    一、前言在上一篇中我们使用全连接网络,来构建我们的手写数字图片识别应用,取得了很好的效果。但是值得注意的是,在实验的最后,最后我们无论把LOSS优化到如何低,似乎都无法在测试数据集testdata中提高我们的识别准确度,你可以回头尝试全连接的网络连接,新增多几层layer,来尝试......
  • 神经网络优化篇:详解超参数调试的实践:Pandas VS Caviar(Hyperparameters tuning in prac
    超参数调试的实践如今的深度学习已经应用到许多不同的领域,某个应用领域的超参数设定,有可能通用于另一领域,不同的应用领域出现相互交融。比如,曾经看到过计算机视觉领域中涌现的巧妙方法,比如说Confonets或ResNets。它还成功应用于语音识别,还看到过最初起源于语音识别的想法成功应......
  • 神经网络优化篇:详解为超参数选择合适的范围(Using an appropriate scale to pick hyper
    为超参数选择合适的范围假设要选取隐藏单元的数量\(n^{[l]}\),假设,选取的取值范围是从50到100中某点,这种情况下,看到这条从50-100的数轴,可以随机在其取点,这是一个搜索特定超参数的很直观的方式。或者,如果要选取神经网络的层数,称之为字母\(L\),也许会选择层数为2到4中的某个值,接着顺......
  • 神经网络的反向传导的自动微分中前向模式和后向模式的适用情况
    神经网络的自动微分求导这里不做解释和介绍,自动微分求导中的前向模式和后向模式这里也不做解释和介绍。根据资料显示,如果一个神经网络的输入层维度为M,输出层维度为N,当M>N时,反向自动微分求导的后向模式计算效率高于前向模式,反之,如果M<N时,前向模式计算效率高于后向模式,下面给出自己......
  • 神经网络优化篇:详解调试处理(Tuning process)
    调试处理关于训练深度最难的事情之一是要处理的参数的数量,从学习速率\(a\)到Momentum(动量梯度下降法)的参数\(\beta\)。如果使用Momentum或Adam优化算法的参数,\(\beta_{1}\),\({\beta}_{2}\)和\(\varepsilon\),也许还得选择层数,也许还得选择不同层中隐藏单元的数量,也许还想使用学习......
  • 卷积神经网络学习笔记
    全连接神经网络的结构全连接神经网络的整体结构可以简化为智能函数\(y=f_θ(x)\)输入和输出层一般为数据矩阵全连接网络的单元结构神经网络的思路:从单元到整体一个单元的结构:\(X_1,X_2,X_3...\)是很多矩阵,然后这些矩阵分别乘上对应的权重矩阵,再加上偏置矩阵b,输......
  • 基于信号功率谱特征和GRNN广义回归神经网络的信号调制类型识别算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本MATLAB2022a 3.算法理论概述       本课题,我们主要对MPSK和MFSK调制类型进行识别。在进行信号调制方式区分之前,首先需要对PSK和FSK进行区分,提出了一种基于信号功率谱的PSK和FSK调制方式的识别方法。信号的功率谱计算过程......
  • 李宏毅《机器学习》总结 - 类神经网络
    核心问题:CriticalPoint在GradientDescent的时候,如果遇到梯度为0的情况,导致无法继续optimization,这样的点叫做CritcalPoint如果最后优化的结果不好,则出现这样的点的原因有2个:一个是到localminima了,另一个是在驻点了(也叫鞍点,SaddlePoint)。现在主要关注的是如何判......
  • 神经网络优化篇:详解局部最优的问题(The problem of local optima)
    局部最优的问题在深度学习研究早期,人们总是担心优化算法会困在极差的局部最优,不过随着深度学习理论不断发展,对局部最优的理解也发生了改变。向展示一下现在怎么看待局部最优以及深度学习中的优化问题。这是曾经人们在想到局部最优时脑海里会出现的图,也许想优化一些参数,把它们称......