热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从GoogLeNet架构到deepdream模型

虽然深度神经网络在计算机视觉方面的效果非常显著,但至今还没有非常严格的理论支撑。最开始学习CNN的时候,采用的都是手写体识别的例子,对其最直观的解释即随着层数增加,所学到的特征越来

  虽然深度神经网络在计算机视觉方面的效果非常显著,但至今还没有非常严格的理论支撑。最开始学习CNN的时候,采用的都是手写体识别的例子,对其最直观的解释即随着层数增加,所学到的特征越来越抽象(大致按照“点-> 线->角->整体轮廓”的顺序)。同样地,谷歌技术团队在训练他们的GoogLeNet网络时,为了对网络所学到的特征有更好的理解,他们在特征可视化方面做了很多努力,同时也发现了一些美轮美奂的图画(如下为其中的一些)。本文将先介绍GoogLeNet网络结构相关的理论,再讲述特征可视化部分。


  Deep Dream神经网络,也就是GoogLeNet网络结构,它是基于Inception识别模型的。传统的卷积神经网络莫过于LeCun的LeNet-5了,如下图所示,

  它由卷积层、下采样层和全连接层组合而成,结构层数较少。而对于大型数据集,比如ImageNet数据集,为了显著提高算法的效果,就需要增加网络的复杂度(增加层数或者每层神经元个数),来增强模型的表达能力,同时,为了防止该模型过度拟合,比较简单的方法就是在训练模型的过程中,采用dropout的策略。但是通过增加网络复杂度来提高性能的方法是有缺点的,一是在训练数据数量固定的条件下,当网络结构变复杂时,伴随而来的是模型参数增加,更容易导致过拟合问题。二是网络结构变复杂时,计算量变大,所需的硬件资源也会快速增加,更糟糕的是,如果模型增加的表达能力没有得到高效利用的时候,比如最终学到的参数接近于0,那么就是对计算资源的一种浪费。针对上述问题,最好的解决办法就是使用稀疏连接的网络架构。大部分的机器学习系统都是通过卷积操作来实现稀疏性的,但是相对于前一层的局部感受野(local receptive field),卷积操作连接仍然属于密连接(dense connections)。与此同时,全连接的优势在于允许我们利用并行计算,充分发挥GPU的性能。那么如何更好的在sparse connections和dense connections之间取得平衡呢?Christian Szegedy等大牛们想到了Inception架构。Inception架构的最初想法是在卷积网络中,如何利用局部的dense connection来学习到一个近似的最优局部稀疏结构,它在局部化(localization)和目标识别等应用中取得了很好的效果。

Inception架构介绍

  Inception架构中存在着滤波器组(filter bank),为了避免patches对齐问题,通常的做法是把滤波器的大小设定为1x1、3x3、5x5,在深度网络模型中,滤波器组的输出合并在一起构成了下一层的输入。随着Inception模块逐步堆叠,抽象程度也会增加,所以3x3、5x5滤波器的比例应该增加(因为小的滤波器模板只能得到local features, 而大的滤波器模板可以得到高层的抽象特征),而这样做却会带来计算上的瓶颈。好的解决办法就是在计算量增加较多的地方采用降维和投影操作,具体来说,先使用1×1 convolutions算子来进行降维,再进行3×3和5×5 的卷积操作。关于1×1 convolution, 可能大家跟我一样,在以前没有听说过,这里解释一下,假设有一个卷积层的输出尺寸为(batch_size, feature_map_num1, height, width),其后接的是1×1 convolutions层,且其输出尺寸为(batch_size, feature_map_num2, height, width),那么当feature_map_num1 > feature_map_num2时,就达到了降维的效果,显然这里降低的是“feature map dimension”。总的来说,将这样的Inception模块级联在一起就构成了Inception网络,该网络中有时也会采用max-pooling操作来降低feature map的分辨率。Inception架构改进前后的图如下,其中“Filter concatenation”指的是将各个滤波器输出的feature maps,沿着feature maps维度堆叠在一起。(这里的卷积操作不考虑边界效应,即卷积前后单个feature map的尺寸保持不变,所以才可以’堆叠’)。

GoogLeNet架构介绍

  GoogLeNet架构的核心是Inception模块,深度达到了27层,显然我们可以想到的是,在使用BP(back propagation)算法训练模型的时候,怎么克服“梯度消失”问题呢?大牛们想到了一个先验信息,层数相对较小的网络在分类问题上也可以取得不错的性能,那么深度网络中间层的特征对于分类来说,是有很强的区分能力的。通过添加辅助的分类器连接到这些中间层,不仅可以增加这些较低layers对于整个网络的最终输出的“贡献度”,从而解决梯度消失问题(事实上,有的算法在计算梯度时,采取了truncated的思想,其实质就是假定了较低layers对于网络的输出的贡献度低),还可以增强反向传播的梯度信号,对中间层进行额外的正则化操作。当然了,采用Relu激活函数对“梯度消失”现象也有一定的缓解作用。在训练阶段,总损失为主分类器的损失和辅助分类器的损失的加权求和,在测试阶段,辅助网络便被舍弃了。GoogLeNet网络的拓扑结构如下图,

特征可视化

(1)加载和显示模型图

  因为GoogLeNet网络结构复杂,训练时间非常长,个人的话可能很难重头开始训练,幸运的是,google团队提供了他们训练好的一套模型参数,可以直接加载model graph到本地,这一部分的官方源代码比较琐碎,但语法都比较简单,这里就不细讲了。

(2)朴素的特征可视化

  关于深度神经网络的可视化,比较常见的是在训练好模型后,对某一层的权重参数进行可视化,因为权重参数实际上相当于一个空域滤波器。在这里,为了研究网络要学习输入图像中的什么特征,定义目标函数为网络中指定卷积层的指定feature map的平均值,参数为输入图像,而网络中之前学到的权值参数等为固定值(这里理解起来可能有些不太适应,大家可以结合优化问题的目标慢慢体会就好),这样就构建出了一个最大化问题,即寻找到使得某一feature map的平均值最大化的输入特征,于是便可以采用较常规的梯度上升方法来求解该问题。值得一提的是,官方源代码render_naive函数中,在计算出梯度后进行了标准化操作,这是因为deep layers相对于shallow layers的梯度可能偏小,这样做便可以使得不同层的学习速率基本相同了。当输入特征图初始化为均匀分布的随机噪声RGB图像时,在经过20次迭代更新操作之后,输入特征图像如下,

(3)多尺度图像生成

  这里的多尺度是基于原图像尺寸而言的,具体来说,采用(2)中的方法可以学习到原始尺寸的特征图,然后对该特征图进行放大(可以采用多种插值方法,比如双线性插值),在从放大图中选择子窗口图像作为初始特征,重复以上过程。当然,这样会产生“块效应”,但可以在放大图中采用随机滑动的方式得到子窗口,从而有效地克服“块效应”问题。在经过3次这样的放大操作,每次放大图像进行了10次迭代更新操作之后,输入特征图像如下,

(4)特征迁移

  在研究不同卷积层所学的输入特征后可以发现,deep layers要从输入图像中学习到非常复杂的特征,而与之相反,shallow layers要学到的特征相对较简单,如下左右两图分别是deep layers和shallow layers要学习到的特征图,


  上面这张图是当输入初始化图为均匀分布的随机噪声得到的,那么如果我们初始化成特定的图像,会是什么效果呢?当然是会学习到图像中存在的一些模式,且这些模式和不同层的feature map是一一对应的。我实验了一张山水图,其处理前后的对比效果如下,

  我也测试了一下lena图像迁移前后的效果,看着心里发慌,为了不破坏女神的形象,在这里就不贴了~

参考资料:”Going deeper with convolutions”. Christian Szegedy, Wei Liu, Yangqing Jia, etc.
     https://github.com/tensorflow/tensorflow/blob/r0.11/tensorflow/examples/tutorials/deepdream/deepdream.ipynb


推荐阅读
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 为了评估精心优化的模型与策略在实际环境中的表现,Google对其实验框架进行了全面升级,旨在实现更高效、更精准和更快速的在线测试。新的框架支持更多的实验场景,提供更好的数据洞察,并显著缩短了实验周期,从而加速产品迭代和优化过程。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • Golomb 编码是一种高效的变长编码技术,专门用于整数的压缩。该方法通过预定义的参数 \( M \) 将输入整数分解为商 \( q \) 和余数 \( r \) 两部分。具体而言,输入整数除以 \( M \) 得到商 \( q \) 和余数 \( r \),其中商 \( q \) 采用一元编码表示,而余数 \( r \) 则使用二进制编码。这种编码方式在数据压缩和信息传输中具有显著的优势,特别是在处理具有特定概率分布的数据时表现出色。 ... [详细]
author-avatar
慈禧太后她妈_151
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有