PyTorch深度学习实战 | 典型卷积神经网络

简介: 在深度学习的发展过程中,出现了很多经典的卷积神经网络,它们对深度学习的学术研究和工业生产都起到了巨大的促进作用,如VGG、ResNet、Inception和DenseNet等,很多投入实用的卷积神经都是在它们的基础上进行改进的。初学者应从试验开始,通过阅读论文和实现代码(tensorflow.keras.applications包中实现了很多有影响力的神经网络模型的源代码)来全面了解它们。下文简要讨论两个有代表性的卷积神经网络,它们都是卷积层、池化层、全连接层等的不同组合。

image.png


在深度学习的发展过程中,出现了很多经典的卷积神经网络,它们对深度学习的学术研究和工业生产都起到了巨大的促进作用,如VGG、ResNet、Inception和DenseNet等,很多投入实用的卷积神经都是在它们的基础上进行改进的。初学者应从试验开始,通过阅读论文和实现代码(tensorflow.keras.applications包中实现了很多有影响力的神经网络模型的源代码)来全面了解它们。下文简要讨论两个有代表性的卷积神经网络,它们都是卷积层、池化层、全连接层等的不同组合。

01、VGG-16,VGG-19

VGG-16[32]是牛津大学的Visual Geometry Group在2015年发布的共16层的卷积神经网络,有约1.38亿个网络参数。该网络常被初学者用来学习和体验卷积神经网络。

VGG-16模型是针对ImageNet挑战赛设计的,该挑战赛的数据集为ILSVRC-2012图像分类数据集。ILSVRC-2012图像分类数据集的训练集有总共有1281167张图片,分为1000个类别,它的验证集有50000张图片样本,每个类别50个样本。

ILSVRC-2012图像分类数据集是2009年开始创建的ImageNet图像数据集的一部分。基于该图像数据集举办了具有很大影响力的ImageNet挑战赛,很多新模型就是在该挑战赛上发布的。

image.png


图 1 VGG-16模型的网络结构

VGG-16模型的网络结构如图1所示,从左侧输入大小为224×224×3的彩色图片,在右侧输出该图片的分类。

输入层之后,先是2个大小为3×3、卷积核数为64、步长为1、零填充的卷积层,此时的数据维度大小为224×224×64,在水平方向被拉长了。

然后是1个大小为2×2的最大池化层,将数据的维度降为112×112×64,再经过2个大小为3×3、卷积核数为128、步长为1、零填充的卷积层,再一次在水平方向上被拉长,变为112×112×128。

然后是1个大小为2×2的最大池化层,和3个大小为3×3、卷积核数为256、步长为1、零填充的卷积层,数据维度变为56×56×256。

然后是1个大小为2×2的最大池化层,和3个大小为3×3、卷积核数为512、步长为1、零填充的卷积层,数据维度变为28×28×512。

然后是1个大小为2×2的最大池化层,和3个大小为3×3、卷积核数为512、步长为1、零填充的卷积层,数据维度变为14×14×512。

然后是1个大小为2×2的最大池化层,数据维度变为7×7×512。

然后是1个Flatten层将数据拉平。

最后是3个全连接层,节点数分别为4096、4096和1000。

除最后一层全连接层采用Softmax激活函数外,所有卷积层和全连接层都采用relu激活函数。

从上面网络结构可见,经过卷积层,通道数量不断增加,而经过池化层,数据的长度和宽度不断减少。

Visual Geometry Group后又发布了19层的VGG-19模型。

TensorFlow实现了VGG-16模型和VGG-19模型 。TensorFlow还提供了用ILSVRC-2012-CLS图像分类数据集预先训练好的VGG-16和VGG-19模型,下面给出一个用预先训练好的模型来识别一幅图片(图2)的例子。

image.png


图2 试验用的小狗照片

代码清单1 VGG-19预训练模型应用(vgg19_app.py)

 
1.  import tensorflow.keras.applications.vgg19 as vgg19
2.  import tensorflow.keras.preprocessing.image as imagepre
3.  
4.  # 加载预训练模型
5.  model = vgg19.VGG19(weights='E:\\MLDatas\\vgg19_weights_tf_dim_ordering_tf_kernels.h5', include_top=True) # 加载预先下载的模型
6.  # 加载图片并转换为合适的数据形式
7.  image = imagepre.load_img('116.jpg', target_size=(224, 224))
8.  imagedata = imagepre.img_to_array(image)
9.  imagedata = imagedata.reshape((1,) + imagedata.shape)
10.  
11.  imagedata = vgg19.preprocess_input(imagedata)
12.  prediction = model.predict(imagedata) # 分类预测
13.  results = vgg19.decode_predictions(prediction, top=3)
14.  print(results)
15.  #[[('n02113624', 'toy_poodle', 0.6034094), ('n02113712', 'miniature_poodle', 0.34426507), ('n02113799', 'standard_poodle', 0.0124355545)]]

可见,图片为toy poodle的概率最大,为0.6。

02、残差网络

随着网络层次的加深,训练集的损失函数可能会呈现出先下降再上升的现象,称为网络退化(degradation)现象。残差网络(ResNet)[33]提出了抑制梯度消散、网络退化来加速训练收敛的方法,克服了层数多导致的收敛慢、甚至无法收敛的问题,使网络的层数得以增加。

残差单元是残差网络的基本组成部分,它的特点是有一条跨层的短接。图3示例了一个残差单元。该单元有两条传递路径,除了常规的卷积、批标准化、激活处理路径外,还有一条跨层的直接传递路径。

image.png


图3 残差单元示例

残差网络一般要由很多残差单元首尾连接而成。残差网络的思想是通过跨层的短接,在误差反向传播时,去掉不变的主体部分,从而突出微小的变化,使得网络对误差更加敏感。通过短接还使得误差消散问题得到了较好的解决。试验结果证明残差网络具有良好的学习效果。

图3所示残差单元在TensorFlow框架下的实现见代码清单2,其中第28行是将两条处理路径传来的数据相加。该代码来自tensorflow.keras.applications包,该包包含了许多经典模型的实现代码,值得大家仔细分析。

代码清单 2残差单元[1]

 
1.  def block1(x, filters, kernel_size=3, stride=1, conv_shortcut=True, name=None):
2.     bn_axis = 3 if backend.image_data_format() == 'channels_last' else 1
3.    if conv_shortcut:
4.      shortcut = layers.Conv2D(
5.          4 * filters, 1, strides=stride, name=name + '_0_conv')(
6.              x)
7.      shortcut = layers.BatchNormalization(
8.          axis=bn_axis, epsilon=1.001e-5, name=name + '_0_bn')(
9.              shortcut)
10.    else:
11.      shortcut = x
12.    x = layers.Conv2D(filters, 1, strides=stride, name=name + '_1_conv')(x)
13.    x = layers.BatchNormalization(
14.        axis=bn_axis, epsilon=1.001e-5, name=name + '_1_bn')(
15.            x)
16.    x = layers.Activation('relu', name=name + '_1_relu')(x)
17.    x = layers.Conv2D(
18.        filters, kernel_size, padding='SAME', name=name + '_2_conv')(
19.            x)
20.    x = layers.BatchNormalization(
21.        axis=bn_axis, epsilon=1.001e-5, name=name + '_2_bn')(
22.            x)
23.    x = layers.Activation('relu', name=name + '_2_relu')(x)
24.    x = layers.Conv2D(4 * filters, 1, name=name + '_3_conv')(x)
25.    x = layers.BatchNormalization(
26.        axis=bn_axis, epsilon=1.001e-5, name=name + '_3_bn')(
27.            x)
28.    x = layers.Add(name=name + '_add')([shortcut, x])
29.    x = layers.Activation('relu', name=name + '_out')(x)
30.    return x

03、源码展示

链接: https://pan.baidu.com/s/1kG88Z39otL7GrVhiSOJlqA?pwd=6yb8 提取码: 6yb8

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解
【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解
33 1
|
11天前
|
机器学习/深度学习 自然语言处理 算法
PyTorch与NLP:自然语言处理的深度学习实战
随着人工智能技术的快速发展,自然语言处理(NLP)作为其中的重要分支,日益受到人们的关注。PyTorch作为一款强大的深度学习框架,为NLP研究者提供了强大的工具。本文将介绍如何使用PyTorch进行自然语言处理的深度学习实践,包括基础概念、模型搭建、数据处理和实际应用等方面。
|
24天前
|
机器学习/深度学习 PyTorch 测试技术
PyTorch实战:图像分类任务的实现与优化
【4月更文挑战第17天】本文介绍了使用PyTorch实现图像分类任务的步骤,包括数据集准备(如使用CIFAR-10数据集)、构建简单的CNN模型、训练与优化模型以及测试模型性能。在训练过程中,使用了交叉熵损失和SGD优化器。此外,文章还讨论了提升模型性能的策略,如调整模型结构、数据增强、正则化和利用预训练模型。通过本文,读者可掌握基础的PyTorch图像分类实践。
|
24天前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch小技巧:使用Hook可视化网络层激活(各层输出)
这篇文章将演示如何可视化PyTorch激活层。可视化激活,即模型内各层的输出,对于理解深度神经网络如何处理视觉信息至关重要,这有助于诊断模型行为并激发改进。
19 1
|
2月前
|
机器学习/深度学习 并行计算 PyTorch
【多GPU炼丹-绝对有用】PyTorch多GPU并行训练:深度解析与实战代码指南
本文介绍了PyTorch中利用多GPU进行深度学习的三种策略:数据并行、模型并行和两者结合。通过`DataParallel`实现数据拆分、模型不拆分,将数据批次在不同GPU上处理;数据不拆分、模型拆分则将模型组件分配到不同GPU,适用于复杂模型;数据和模型都拆分,适合大型模型,使用`DistributedDataParallel`结合`torch.distributed`进行分布式训练。代码示例展示了如何在实践中应用这些策略。
103 2
【多GPU炼丹-绝对有用】PyTorch多GPU并行训练:深度解析与实战代码指南
|
2月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
84 2
|
1天前
|
机器学习/深度学习 安全 量子技术
深度学习在图像识别中的应用与挑战
【5月更文挑战第10天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的核心力量。本文聚焦于深度学习在图像识别任务中的应用,并探讨了当前面临的主要挑战。我们将回顾深度学习模型的发展历程,特别是卷积神经网络(CNN)在处理图像数据方面的革命性贡献,并分析诸如数据偏差、模型泛化能力、计算资源需求等关键问题。此外,文中还将展望深度学习技术未来的发展方向及其在图像识别领域的应用前景。
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
探索基于深度学习的图像识别技术在自动驾驶领域的应用
【5月更文挑战第10天】 随着人工智能技术的飞速发展,特别是深度学习在图像处理和识别方面的突破性进展,自动驾驶汽车逐渐成为现实。本文将深入探讨深度学习技术在图像识别领域的应用,以及如何通过这些技术提高自动驾驶系统的性能和安全性。我们将分析卷积神经网络(CNN)在车辆检测、行人识别和交通标志识别中的作用,并讨论数据增强、迁移学习和对抗网络等策略如何帮助提升模型的泛化能力和鲁棒性。此外,文中还将涉及深度学习模型在实时处理和嵌入式系统部署时面临的挑战及其解决方案。
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第10天】 随着人工智能技术的飞速发展,基于深度学习的图像识别技术已成为自动驾驶系统不可或缺的核心组成部分。该技术通过模拟人类视觉系统处理与理解环境信息的过程,赋予自动驾驶车辆高度准确和实时的环境感知能力。本文首先概述了深度学习在图像识别领域的关键技术与方法,包括卷积神经网络(CNN)及其变体、循环神经网络(RNN)等,并探讨了这些技术在自动驾驶系统中的具体应用,如车辆检测、行人识别、交通标志识别以及道路场景理解。随后,文章分析了当前技术面临的主要挑战,包括数据集的多样性与质量、模型泛化能力、实时处理要求及系统的鲁棒性问题。最后,展望了未来图像识别技术在自动驾驶领域的发展趋势,特
|
1天前
|
机器学习/深度学习 计算机视觉
深度学习在图像识别中的应用与挑战
【5月更文挑战第10天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉尤其是图像识别领域进步的关键力量。本文深入探讨了深度学习技术在图像识别任务中的核心应用,包括但不限于卷积神经网络(CNN)的架构优化、数据增强策略以及迁移学习的实践。同时,文章还分析了当前面临的主要挑战,如模型泛化能力不足、对抗性样本的防御、以及计算资源的巨大需求等。通过对最新研究成果的综合评述,本文旨在为读者提供一个关于深度学习在图像识别领域中所扮演角色及未来发展方向的全面视角。
9 4