全文链接:https://tecdat.cn/?p=37134
原文出处:拓端数据部落公众号
分析师:Canglin Li
本文深入探讨了卷积层(Convolutional Layer)在深度学习框架中的核心作用与操作机制,并分析了其在特征提取、网络构建以及性能提升方面的独特优势。此外,本文还介绍了与卷积层紧密相关的激活函数、池化层以及ResNet深度神经网络的概念与应用,并通过实验验证了ResNet在复杂数据集上的高效分类性能。本文将通过视频讲解,展示ResNet原理,并结合如何用 Python中VGG模型、自定义ResNet模型、Capsule Network模型分析MNIST数据集实例的代码数据,为读者提供一套完整的实践数据分析流程。
1. 引言
在深度学习中,卷积层作为构建卷积神经网络(CNN)的基本单元,承担着从输入数据中提取并表征关键特征的重要任务。通过窗口滑动与滤波器计算两个关键操作,卷积层能够逐层递进地提取从低级到高级的特征表示,为后续的网络层提供丰富的信息基础。
2. 卷积层的基本原理
卷积层的核心在于卷积运算,该运算通过自定义大小的卷积核(滤波器)在输入数据上滑动,实现局部数据的加权求和。这一过程不仅模拟了生物视觉系统的处理机制,还使得网络能够捕捉到输入数据的空间结构特征。值得注意的是,随着网络层数的增加,卷积层能够迭代地提取出更为复杂、高级的特征表示,从而增强了网络的表征能力。
3. 激活函数与池化层
为了引入非线性因素并提升网络的泛化能力,卷积层后通常会接入激活函数。常用的激活函数包括ReLU、tanh和sigmoid等,它们各自具有不同的特性与适用范围。
此外,为了降低特征维度并保留关键信息,池化层(Pooling Layer)被广泛应用于卷积层之后。池化层通过将特征图划分为多个区域并取最大值或平均值来实现降维处理,从而减小了计算量并增强了特征的鲁棒性。
4. ResNet深度神经网络
ResNet(残差网络)作为一种创新的深度神经网络架构,在ImageNet等大规模图像识别竞赛中取得了显著的成绩。ResNet通过引入“shortcut connection”(残差连接)机制解决了深度神经网络训练中的梯度消失和梯度爆炸问题,使得网络能够训练得更深且更稳定。本文详细分析了ResNet的网络结构特点及其在不同层数版本中的具体实现方式,并强调了残差连接在保留原始特征和加速网络收敛方面的重要作用。
ResNet的网络结构图
伴随着深度神经网络的不断发展,ResNet同样延伸出了不同的版本,这里的版本指的是层数的不同,各种版本的具体结构下如图所示。
由图可知,各种ResNet的网络结构相差不大,不论是18层、34层、50层、101层还是152层。在网络的开始都是一个77的卷积层,然后是一个33的最大池化下采样,然后按照途图中的conv2_x、conv3_x、 conv4_x、conv5_x中的残差结构。最后再跟一个平均池化下采样和全连接层,sofmax作为输出。
COV2_x
这里需要注意,conv3_x,是3x3,128通道,也就是说经过conv2_x后得到的56x56,64通道,到conv3_x里面升维了,并且大小也变了,变成28x28了,这时候要注意一个问题,分支与主分支的结果就无法相加了,大小不一致,维度不一致,这是需要使用一个分支(如右图所示)。
5. Batch Normalization
批量归一化(Batch Normalization)作为深度学习领域的一项重要技术,通过对每一层网络的输入进行归一化处理来加速训练过程并提高模型性能。本文介绍了Batch Normalization的基本原理及其在ResNet中的实际应用位置(即放在卷积层与激活层之间),并强调了其对于缓解特征分布散乱问题、提升训练稳定性和收敛速度的重要作用。
真正的残差结构
建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias,所以说,我们实际上的残差网络块应该是如右图。
ResNet的优点
具体的优点如下:
(1)可以训练非常深的神经网络,避免了梯度消失问题,提高了模型的表达能力和性能。
(2)使用残差连接可以保留原始特征,使得网络的学习更加顺畅和稳定,进一步提高了模型的精度和泛化能力.
(3)训练时可以避免梯度消失和梯度爆炸问题,加速网络收敛。
6.实例分析
本项目使用了分类难度较大的数据集notMNIST(部分数据如左图),在训练集、测试集以及验证集的选择方面,本文在所有数据中随机选择50%作为训练集,30%作为验证集,剩下的20%作为测试集。
在参数设置层面,利用sgdm作为训练算法,最大迭代次数50次,每次进行73回运算,总运算3650次,设置学习率为0.01。
实验结果
在如上叙述的条件下,ResNet18对该数据集的分类结果如图所示。
ResNet18在该数据集上的分类准确率达94.00%,分类效果较好。
Python中VGG模型、自定义ResNet模型、Capsule Network模型分析MNIST数据集
数据集归一化:计算均值与标准差
在深度学习的数据预处理阶段,归一化是一个至关重要的步骤,它有助于提升模型的收敛速度和性能。归一化通常涉及计算数据集的均值(mean)和标准差(standard deviation, std),并将原始数据转换到具有零均值和单位标准差的范围内。以下代码段展示了如何对MNIST数据集进行归一化处理,并打印出归一化所需的均值和标准差。
import numpy as np
# 加载数据集
trn_data = trn_data['arr_0'] / 255 # 将像素值归一化到[0, 1]区间
# 计算均值和标准差
data_mean = trn_data.mean()
data_std = trn_data.std()
# 打印结果
print(f'Mean: {data_mean}')
print(f'Std: {data_std}')
# 接下来,我们可以使用这些均值和标准差来归一化训练集和测试集,以便后续模型的训练与评估。
模型加载与评估
在深度学习中,模型的选择与加载是实验过程中的重要环节。以下部分展示了如何加载预训练的VGG模型、自定义ResNet模型、Capsule Network模型,以及它们的集成模型,并验证模型是否成功加载。
VGG模型
from fastai.vision.all import *
# 假设databunch已正确定义并包含训练与验证数据
learn = Learner(databunch, VGG(), metrics=accuracy)
learn.load('vgg_model_with_norm') # 加载预训练模型
print('Model was loaded')
ResNet模型
# 假设MyResNet是基于ResNet的自定义模型,BasicBlock为残差块类型
learn = Learner(databunch, MyResNet(BasicBlock, [2, 2, 2, 2]), metrics=accuracy)
learn.load('resnet_model_with_norm') # 加载预训练模型
print('Model was loaded')
VGG与ResNet-18的集成
集成模型通过结合多个单一模型的预测结果来提高整体性能。具体实现细节取决于集成策略,但这里仅展示集成模型的加载示意。
Capsule Network模型
Capsule Network是一种较新的网络架构,旨在通过胶囊(capsules)来捕捉数据的空间层次关系。
# 假设CapsNet和caps_accuracy, caps_loss已正确定义
learn = Learner(databunch, CapsNet(), metrics=caps_accuracy, loss_func=caps_loss)
learn.load('caps_net_model_with_norm') # 加载预训练模型
print('Model was loaded')
VGG与Capsule Network的集成
集成VGG与Capsule Network的结果表明,其性能可能不如VGG与ResNet的集成。这可能是由于不同模型架构之间的互补性差异所导致的。
learn = Learner(databunch, VGG_Caps(), metrics=vgg_caps_accuracy, loss_func=vgg_caps_loss)
vgg_capsnet_load_model(learn, 'vgg_model_with_norm', 'caps_net_model_with_norm')
关于分析师
这里感谢Canglin Li对本文做出的贡献。他是拓端的分析师,在信息与计算科学领域拥有深厚背景,熟练掌握多种编程语言和技术工具,特别是在Matlab和Java方面展现出卓越的能力。他的专业领域广泛涉及深度学习等前沿技术。