tag 标签: 人工智能

相关帖子
相关博文
  • 热度 1
    2020-6-19 11:19
    294 次阅读|
    0 个评论
    总结 本文实现了一个系统化的测试工具 DeepTest,可以自动检测出 DNN 自动驾驶系统可能导致事故发生的错误决策,主要是分析摄像头捕获到的图像致使自动驾驶汽车转向的行为。首先,DeepTest 系统化自动生成测试用例,能使模型的神经元覆盖率最大化,比如模拟下雨,起雾,光照条件等实际场景。其次,本文证明了神经元覆盖率的变化可以影响到自动驾驶汽车转向行为的变化,并且对于摄像机捕获到图像进行各种转换,可以激活 DNN 中不同组的神经元,从而最大化神经元覆盖率。最后,本文对于不同测试用例进行真实图像变换,利用蜕变关系自动检测错误行为,合成的图像还可以用于再训练,使 DNN 自动驾驶汽车系统具有更强的鲁棒性。 摘要 深度神经网络(DNN)的最新研究进展使得 DNN 驱动的自动驾驶汽车的迅猛发展,该自动驾驶汽车使用摄像头,LiDAR 等传感器,无需任何人工干预即可驾驶。包括 Tesla,GM,Ford,BMW 和 Waymo / Google 在内的大多数主要制造商都在致力于构建和测试不同类型的自动驾驶汽车。美国包括加利福尼亚州,德克萨斯州和纽约州在内的几个州的立法者已经通过了新的立法,以进行道路上自动驾驶汽车的测试和部署。但是,尽管 DNN 取得了令人瞩目的进步,但与传统软件一样,它们经常表现出不正确或意外的极端情况,可能导致致命的碰撞。已经发生了几起涉及自动驾驶汽车的实际事故,其中包括一些事故导致死亡。用于 DNN 驱动的车辆测试技术大部分都严重依赖于在不同驾驶条件下手动收集测试数据,随着测试场景需求的增加,这种测试数据获取的成本过高。在本文中,我们设计,实施和评估一种系统测试工具 DeepTest,用于自动检测 DNN 驱动的车辆的错误行为,这些行为可能导致致命的撞车事故。首先,我们的工具旨在根据驾驶条件(如雨,雾,光照条件等)的实际变化自动生成测试用例。DeepTest 通过最大化激活神经元数量来生成测试用例,系统地探索 DNN 的不同部分的逻辑。 DeepTest 在不同的现实驾驶条件下(例如,模糊,下雨,起雾等)发现了数千种错误行为,其中许多行为可能导致 Udacity 自动驾驶汽车挑战赛中三个性能最高的 DNN 产生致命事故。 本文主要贡献: 我们提供了一种自动合成测试用例的技术,可在安全攸关的 DNN 的系统(例如自动驾驶汽车)中最大化神经元覆盖范围。我们证明了神经元覆盖范围的变化与自动驾驶汽车行为的变化相关。 我们证明了不同的图像变换(如对比度变化,雾的存在等)可用于测试来增加神经元覆盖率。 我们利用特定于变换关系来自动检测错误行为。 我们的实验还表明,合成图像可用于重新训练,并使 DNN 对不同的极端情况更为稳健。 据我们所知,DeepTest 是首款针对 DNN 驱动的自动驾驶汽车的系统化和自动化测试工具。 我们使用 DeepTest 对来自 Udacity 驾驶挑战的三个性能最高的 DNN 模型进行系统测试。 DeepTest 在这些系统中发现了数千种错误行为,其中许多行为可能导致潜在的致命碰撞。 背景知识 自动驾驶汽车的关键组件是由底层的深度神经网络(DNN)控制的感知模块。 DNN 接收来自不同传感器的输入,例如摄像机,光检测和测距传感器(LiDAR)和 IR(红外)传感器,这些传感器可感知环境并输出转向角,制动力度等,使得在各种条件下安全操纵汽车。 自动驾驶汽车中使用的大多数 DNN 可以分为两种类型:(1)前馈卷积神经网络(CNN)和(2)循环神经网络(RNN)。 我们测试的 DNN 包括两个 CNN 和一个 RNN。 实验方法 1. 基于神经元覆盖的系统性测试。 在本文中,我们基于所有具有相似神经元覆盖率的输入均属于同一等价类的假设(即目标 DNN 对于这些输入的行为类似),利用神经元覆盖率作为划分输入空间的一种机制。 2. 利用图像合成的方法最大化神经元覆盖率 DeepTest 通过将图像变换应用于种子图像并模拟不同的现实世界情况(例如相机镜头变形,物体移动,不同的天气条件等)来生成逼真的合成图像。为此,我们研究了九种不同的逼真的图像变换(改变亮度,改变对比度,平移,缩放,水平剪切,旋转,模糊,添加雾效果和施加下雨效果)。 这些转换可以分为三类:线性,仿射和卷积。我们的实验结果表明,转换后所有测试的 DNN 都显著提高了神经元覆盖率。 3. 用变换组合提高神经元覆盖率 不同的图像变换可以激活不同的神经元,如果这些变换堆叠起来的话,可以激活更多的神经元。可是,所有变换组合的状态空间非常巨大,本文提供了一种神经元覆盖率引导的贪婪搜索技术,可以有效地找到导致更高覆盖率的图像变换组合。 4. 利用蜕变关系创造 Test Oracle 自动驾驶系统是一个基于 DNN 的复杂系统,手动创建系统规范是极其困难的,因为这涉及到重新创建人类驾驶员的逻辑。本文巧妙地避免了这个问题,转而考虑不同合成图像间对应汽车不同决策行为之间的蜕变关系。例如,在任何灯光/天气条件、模糊或任何具有小参数值的仿射变换下,对于同一图像,自动驾驶汽车的转向角不应发生显著变化。本文使用相对宽松的蜕变关系寻求一种权衡,于是借助均方差重新定义了一个蜕变关系,即认为模型对于输入的转换图像产生的误差应该在 λ 倍的均方差内。 实验结果 本文将 deeptest 工具用于对三款在 Udacity 自动驾驶挑战赛中获得优异名次的 DNN 车型上进行评估,分别为 Rambo(第二名), Chauffeur (第三名), 和 Epoch(第六名).得出以下四个结论: 神经元覆盖率与输入输出多样性相关,可用于系统化测试生成。 不同的图像变换倾向于激活不同的神经元。 通过系统地组合不同的图像变换,神经元覆盖率比原始种子图像可以提高约 100%。 借助神经元覆盖率引导生成的合成图像,DeepTest 成功地检测到三个模型所预测的 1,000 多种错误行为(图 1)。 通过使用 DeepTest 生成的合成数据对 DNN 进行重新训练,可以将 DNN 的准确性提高多达 46%。 图 1 DeepTest 所发现的错误行为示例 实验有效性讨论 DeepTest 通过对种子图像应用不同的图像变换来生成逼真的合成图像。 但是,这些转换可能无法涵盖所有现实情况。 虽然我们设计的转换(如雨雾效果)是逼近现实的,但由于大量不可预测的因素(例如太阳的位置,雨滴的角度和大小),所生成的图片在现实中可能无法完全重现。 但是,随着图像处理技术变得越来越复杂,生成的图片将越来越接近现实。除此之外,完整的用于驾驶自动驾驶汽车的 DNN 模型还必须处理转向角以外的制动和加速问题。我们限制自己只能测试转向角的准确性,因为我们测试的模型尚不支持制动和加速。 但是,假设模型支持它们,我们的技术也应该很容易应用于测试这些输出。
  • 热度 1
    2020-3-6 14:45
    855 次阅读|
    0 个评论
    米尔工业级NXP开发板试用活动(MYD-C8MMX) 不久前 米尔推出了新一代高性价比核心板之王 MYC-C8MMX核心板及开发板 获得众多客户热烈反馈 这一次 我们给各位带来福利 i.MX8M mini开发板免费申请试用!!! 数量有限,赶紧动手申请 活动流程和事项: 时间: 申请时间:2020年02月25日-2020年03月29日 评测时间:收货后一个月内 申请方式及注意事项 1:复制下方链接进入面包板网活动页面: https://mbb.eet-china.com/evaluating/product-31.html 打开浏览器立即申请,按步骤完成申请。 2:请确保您所填的联系方式准确无误,开发板将按照申请信息邮寄。如地址不准确或不够详细,将不予发货! 3:快递费由深圳市米尔电子有限公司支出 评测任务 1.收到开发板之日起,在一个月内,必须完成不少于两篇评测。 2.在面包板社区发帖上传您的评测作品(图文)。 3.评测报告请发表在面包板社区论坛。 评测作品标题,请按照如下格式: 【MYD-C8MMX物联网开发板】+自拟标题 活动提示 1.没有时间参与评测的请勿申请,收到板子未完成评测,我们有权收回板子且退还邮费自付同时将公布不诚信之行为,因此带来的不良后果均由本人自行承担。 2.申请人收货后30天内未完成评测报告,无权将评测产品出售或转赠给他人。如无法在收货后30天内提交两篇评测报告,请将评测产品退回我司(运费自理)。 3.评测完成后,米尔电子会评选出优秀作品,前两名免费获得本次活动开发板(无需退回),后三名需退还开发板给厂家(费用到付即可)。 更多关于产品介绍 官网: http://www.myir-tech.com/product/myc-c8mmx.htm MYC-C8MMX开发板应用: http://www.myir-tech.com/news_list.asp?id=1830 资料下载: http://www.myir-tech.com/download.asp?nid=92 淘宝购买地址: http://rrd.me/gfXMF 活动申请链接: https://mbb.eet-china.com/evaluating/product-31.html#introduce
  • 热度 2
    2020-1-16 11:50
    1611 次阅读|
    1 个评论
    深度残差网络(deep residual learning, ResNet)获得了2016年CVPR会议的最佳论文奖,截至目前,在谷歌学术上的引用次数已经达到了惊人的37185次。 深度残差收缩网络(deep residual shrinkage network)是深度残差网络的一种新颖的升级版本,其实是深度残差网络、注意力机制(参照Squeeze-and-Excitation Network,SENet)和软阈值化的深度集成。 在一定程度上,深度残差收缩网络的工作原理,可以理解为:通过注意力机制注意到不重要的特征,然后通过软阈值化将它们置为零;或者说,通过注意力机制注意到重要的特征,将它们保留下来,从而加强深度神经网络从含噪声信号中提取有用特征的能力。 1.为什么要提出深度残差收缩网络呢? 首先,在对样本进行分类的时候,样本中不可避免地会有一些噪声,就像高斯噪声、粉色噪声、拉普拉斯噪声等。更广义地讲,样本中很可能包含着与当前分类任务无关的信息,这些信息也可以理解为噪声。这些噪声可能会对分类效果产生不利的影响。(软阈值化是许多信号降噪算法中的一个关键步骤) 举例来说,在马路边聊天的时候,聊天的声音里就可能会混杂车辆的鸣笛声、车轮声等等。当对这些声音信号进行语音识别的时候,识别效果不可避免地会受到鸣笛声、车轮声的影响。从深度学习的角度来讲,这些鸣笛声、车轮声所对应的特征,就应该在深度神经网络内部被删除掉,以避免对语音识别的效果造成影响。 其次,即使是同一个样本集,各个样本的噪声量也往往是不同的。(这和注意力机制有相通之处;以一个图像样本集为例,各张图片中目标物体所在的位置可能是不同的;注意力机制可以针对每一张图片,注意到目标物体所在的位置) 例如,当训练猫狗分类器的时候,对于标签为“狗”的5张图像,第1张图像可能同时包含着狗和老鼠,第2张图像可能同时包含着狗和鹅,第3张图像可能同时包含着狗和鸡,第4张图像可能同时包含着狗和驴,第5张图像可能同时包含着狗和鸭子。我们在训练猫狗分类器的时候,就不可避免地会受到老鼠、鹅、鸡、驴和鸭子等无关物体的干扰,造成分类准确率下降。如果我们能够注意到这些无关的老鼠、鹅、鸡、驴和鸭子,将它们所对应的特征删除掉,就有可能提高猫狗分类器的准确率。 2.软阈值化是很多降噪算法的核心步骤 软阈值化,是很多信号降噪算法的核心步骤,将绝对值小于某个阈值的特征删除掉,将绝对值大于这个阈值的特征朝着零的方向进行收缩。它可以通过以下公式来实现: 软阈值化的输出对于输入的导数为 由上可知,软阈值化的导数要么是1,要么是0。这个性质是和ReLU激活函数是相同的。因此,软阈值化也能够减小深度学习算法遭遇梯度弥散和梯度爆炸的风险。 在软阈值化函数中,阈值的设置必须符合两个的条件: 第一,阈值是正数;第二,阈值不能大于输入信号的最大值,否则输出会全部为零。 同时,阈值最好还能符合第三个条件: 每个样本应该根据自身的噪声含量,有着自己独立的阈值。 这是因为,很多样本的噪声含量经常是不同的。例如经常会有这种情况,在同一个样本集里面,样本A所含噪声较少,样本B所含噪声较多。那么,如果是在降噪算法里进行软阈值化的时候,样本A就应该采用较大的阈值,样本B就应该采用较小的阈值。在深度神经网络中,虽然这些特征和阈值失去了明确的物理意义,但是基本的道理还是相通的。也就是说,每个样本应该根据自身的噪声含量,有着自己独立的阈值。 3.注意力机制 注意力机制在计算机视觉领域是比较容易理解的。动物的视觉系统可以快速扫描全部区域,发现目标物体,进而将注意力集中在目标物体上,以提取更多的细节,同时抑制无关信息。具体请参照注意力机制方面的文章。 Squeeze-and-Excitation Network(SENet)是一种较新的注意力机制下的深度学习方法。 在不同的样本中,不同的特征通道,在分类任务中的贡献大小,往往是不同的。SENet采用一个小型的子网络,获得一组权重,进而将这组权重与各个通道的特征分别相乘,以调整各个通道特征的大小。这个过程,就可以认为是在施加不同大小的注意力在各个特征通道上。 在这种方式下,每一个样本,都会有自己独立的一组权重。换言之,任意的两个样本,它们的权重,都是不一样的。在SENet中,获得权重的具体路径是,“全局池化→全连接层→ReLU函数→全连接层→Sigmoid函数”。 4.深度注意力机制下的软阈值化 深度残差收缩网络借鉴了上述SENet的子网络结构,以实现注意力机制下的软阈值化。通过蓝色框内的子网络,就可以学习得到一组阈值,对各个特征通道进行软阈值化。 在这个子网络中,首先对输入特征图的所有特征,求它们的绝对值。然后经过全局均值池化和平均,获得一个特征,记为A。在另一条路径中,全局均值池化之后的特征图,被输入到一个小型的全连接网络。这个全连接网络以Sigmoid函数作为最后一层,将输出归一化到0和1之间,获得一个系数,记为α。最终的阈值可以表示为α×A。因此,阈值就是,一个0和1之间的数字×特征图的绝对值的平均。 通过这种方式,保证了阈值为正,而且不会太大。 而且,不同的样本就有了不同的阈值。因此,在一定程度上,可以理解成一种特殊的注意力机制: 注意到与当前任务无关的特征,通过软阈值化,将它们置为零;或者说,注意到与当前任务有关的特征,将它们保留下来。 5.深度残差收缩网络或许有更广泛的通用性 深度残差收缩网络事实上是一种通用的数据分类方法。 这是因为很多分类任务中,样本中或多或少都会包含一些噪声,以及不相关的信息。这些噪声和不相关的信息,有可能会对分类的效果造成影响。例如说: 在图片分类的时候 ,如果图片同时包含着很多其他的物体,那么这些物体就可以被理解成“噪声”;深度残差收缩网络或许能够借助注意力机制,注意到这些“噪声”,然后借助软阈值化,将这些“噪声”所对应的特征置为零,就有可能提高图像分类的准确率。 在语音识别的时候 ,如果在声音较为嘈杂的环境里,比如在马路边、工厂车间里聊天的时候,深度残差收缩网络也许可以提高语音识别的准确率,或者给出了一种能够提高语音识别准确率的思路。 参考网址 深度残差收缩网络:(四)注意力机制下的阈值设置 https://www.cnblogs.com/yc-9527/p/11604082.html 【深度残差收缩网络论文翻译】 Deep Residual Shrinkage Networks for Fault Diagnosis https://www.jianshu.com/p/bcdc9d75a302 秒懂深度残差收缩网络 https://www.jianshu.com/p/90f1ef1b06bc 论文网址 M. Zhao, S. Zhong, X. Fu, et al., Deep residual shrinkage networks for fault diagnosis, IEEE Transactions on Industrial Informatics, DOI: 10.1109/TII.2019.2943898 https://ieeexplore.ieee.org/document/8850096
  • 热度 2
    2020-1-15 20:52
    1758 次阅读|
    1 个评论
    【残差网络升级】深度残差收缩网络
    深度残差网络(ResNet)是一种非常成功的深度学习模型,自2015年底在arXiv公布以来,在谷歌学术上的引用量已经达到了惊人的37185次。深度残差收缩网络是ResNet的一种新型改进,这篇文章将进行详细的介绍。 首先,深度残差网络的核心贡献在于,引入了恒等映射,也就是下图中的Identity shortcut。普通的卷积神经网络是没有跨层的恒等映射的。更具体地,下图中的(a)-(c)展示了三种残差模块(residual building unit, RBU),每个残差模块都包含了一个恒等映射。在图(a)中,输入特征图和输出特征图的尺寸是相同的。在图(b)和(c)中,输出特征图的尺寸是和输入特征图不同的。深度残差网络的整体结构如图(d)所示。我们可以发现,深度残差网络的主体部分,是由很多残差模块堆叠而成的。 通常情况下,样本中含有噪声,或者与标签无关的冗余信息,会导致深度学习算法的效果有所降低。那么怎么解决这个问题呢?深度残差收缩网络提供了一种思路。 深度残差收缩网络的主要工作之一,就是在残差模块中添加了软阈值化,作为非线性的变换。如下图(a)所示,软阈值化将绝对值小于某一阈值的特征,直接赋值为零。将其他的特征,朝着零的方向,进行一定程度的“收缩”。这也是深度残差收缩网络名称的由来。 在图(b)中,作者进一步分析了软阈值化函数的梯度特性:梯度值要么为0,要么为1。与ReLU激活函数类似,这一特性减小了深度学习在训练时遭遇“梯度消失”和“梯度爆炸”的风险。 另外,阈值的取值是要满足一些条件的。第一,阈值是正数。第二,阈值不能太大。假设输入特征的取值都在-1和1之间,如果阈值为10,那么输出就会全部是0。第三,每个样本都应该根据自己的噪声含量,确定自己的阈值。也就是说,样本之间,应该有不同的阈值设置。 在深度残差收缩网络的残差模块中,嵌入了一个子模块(类似Squeeze-and-Excitation Networks),用于自动地设置软阈值化函数所用到的阈值。在图(a)中,整个特征图共用一个阈值。在图(c)中,特征图的每个通道各有一个独立的阈值。同时,图(b)和图(d)展示了两种深度残差收缩网络(DRSN-CS和DRSN-CW)的整体结构。我们可以发现,它们的整体结构其实是一致的,唯一的区别在于残差模块的不同。 我们可以看到,在这种网络结构之下,所获得的阈值,不仅为正数,而且取值不会太大(不会让所有输出全部为0)。另外,每个样本的阈值都是根据自己的特征图所确定的,因此每个样本都会有它自己独特的一组阈值。从而满足了上述关于阈值的三个条件。 作者采集了齿轮箱在健康状态和7种故障状态下的振动信号,进行分类算法的验证。在这里,为了充分验证深度残差收缩网络对含噪信号的分类能力,作者在这些振动信号中分别添加了不同程度的高斯白噪声、拉普拉斯噪声和粉红噪声,并且与一般的卷积神经网络(ConvNet)和深度残差网络(ResNet)进行了对比。 下面是添加-5dB到5dB高斯白噪声时的分类准确率对比:(a)训练集上的准确率,(b)测试集上的准确率 然后是添加-5dB到5dB拉普拉斯噪声时的分类准确率对比:(a)训练集上的准确率,(b)测试集上的准确率 最后是添加-5dB到5dB粉红噪声时的分类准确率对比:(a)训练集上的准确率,(b)测试集上的准确率 将高层特征约简到二维空间进行可视化,可以得到如下图片:(a) ConvNet,(b) ResNet,(c) 第一种深度残差收缩网络(DRSN-CS),(d)第二种深度残差收缩网络(DRSN-CW)。我们可以看到,深度残差收缩网络能够更好地将各种健康状态分离开来。 将训练过程中训练集和测试集上的损失绘制出来,可以得到如下图片:(a) ConvNet,(b) ResNet,(c) 第一种深度残差收缩网络(DRSN-CS),(d)第二种深度残差收缩网络(DRSN-CW)。可以看到深度残差收缩网络的loss被优化得更低。 M. Zhao, S. Zhong, X. Fu, B. Tang, M. Pecht, Deep Residual Shrinkage Networks for Fault Diagnosis, IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898 https://ieeexplore.ieee.org/document/8850096
  • 热度 2
    2020-1-15 10:05
    1389 次阅读|
    2 个评论
    深度残差收缩网络的Keras图像识别
    从本质上讲,深度残差收缩网络属于卷积神经网络,是深度残差网络(deep residual network, ResNet)的一个变种。它的核心思想在于,在深度学习进行特征学习的过程中,剔除冗余信息是非常重要的;软阈值化是一种非常灵活的、删除冗余信息的方式。 1.深度残差网络 首先,在介绍深度残差收缩网络的时候,经常需要从深度残差网络开始讲起。下图展示了深度残差网络的基本模块,包括一些非线性层(残差路径)和一个跨层的恒等连接。恒等连接是深度残差网络的核心,是其优异性能的一个保障。 2.深度残差收缩网络 深度残差收缩网络,就是对深度残差网络的残差路径进行收缩的一种网络。这里的“收缩”指的就是软阈值化。 软阈值化是许多信号降噪方法的核心步骤,它是将接近于零(或者说绝对值低于某一阈值τ)的特征置为0,也就是将 区间内的特征置为0,让其他的、距0较远的特征也朝着0进行收缩。 如果和前一个卷积层的偏置b放在一起看的话,这个置为零的区间就变成了 。因为τ和b都是可以自动学习得到的参数,这个角度看的话,软阈值化其实是可以将任意区间的特征置为零,是一种更灵活的、删除某个取值范围特征的方式,也可以理解成一种更灵活的非线性映射。 从另一个方面来看,前面的两个卷积层、两个批标准化和两个激活函数,将冗余信息的特征,变换成接近于零的值;将有用的特征,变换成远离零的值。之后,通过自动学习得到一组阈值,利用软阈值化将冗余特征剔除掉,将有用特征保留下来。 通过堆叠一定数量的基本模块,可以构成完整的深度残差收缩网络,如下图所示: 3.图像识别及Keras编程 虽然深度残差收缩网络原先是应用于基于振动信号的故障诊断,但是深度残差收缩网络事实上是一种通用的特征学习方法,相信在很多任务(计算机视觉、语音、文本)中都可能有一定的用处。 下面是基于深度残差收缩网络的MNIST手写数字识别程序(程序很简单,仅供参考): #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Dec 28 23:24:05 2019 Implemented using TensorFlow 1.0.1 and Keras 2.2.1 M. Zhao, S. Zhong, X. Fu, et al., Deep Residual Shrinkage Networks for Fault Diagnosis, IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898 @author: me """ from __future__ import print_function import keras import numpy as np from keras.datasets import mnist from keras.layers import Dense, Conv2D, BatchNormalization, Activation from keras.layers import AveragePooling2D, Input, GlobalAveragePooling2D from keras.optimizers import Adam from keras.regularizers import l2 from keras import backend as K from keras.models import Model from keras.layers.core import Lambda K.set_learning_phase(1) # Input image dimensions img_rows, img_cols = 28, 28 # The data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape , 1, img_rows, img_cols) x_test = x_test.reshape(x_test.shape , 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape , img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape , img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) # Noised data x_train = x_train.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) x_test = x_test.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) print('x_train shape:', x_train.shape) print(x_train.shape , 'train samples') print(x_test.shape , 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) def abs_backend(inputs): return K.abs(inputs) def expand_dim_backend(inputs): return K.expand_dims(K.expand_dims(inputs,1),1) def sign_backend(inputs): return K.sign(inputs) def pad_backend(inputs, in_channels, out_channels): pad_dim = (out_channels - in_channels)//2 return K.spatial_3d_padding(inputs, padding = ((0,0),(0,0),(pad_dim,pad_dim))) # Residual Shrinakge Block def residual_shrinkage_block(incoming, nb_blocks, out_channels, downsample=False, downsample_strides=2): residual = incoming in_channels = incoming.get_shape().as_list() for i in range(nb_blocks): identity = residual if not downsample: downsample_strides = 1 residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, strides=(downsample_strides, downsample_strides), padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) # Calculate global means residual_abs = Lambda(abs_backend)(residual) abs_mean = GlobalAveragePooling2D()(residual_abs) # Calculate scaling coefficients scales = Dense(out_channels, activation=None, kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(abs_mean) scales = BatchNormalization()(scales) scales = Activation('relu')(scales) scales = Dense(out_channels, activation='sigmoid', kernel_regularizer=l2(1e-4))(scales) scales = Lambda(expand_dim_backend)(scales) # Calculate thresholds thres = keras.layers.multiply( ) # Soft thresholding sub = keras.layers.subtract( ) zeros = keras.layers.subtract( ) n_sub = keras.layers.maximum( ) residual = keras.layers.multiply( ) # Downsampling (it is important to use the pooL-size of (1, 1)) 1: identity = AveragePooling2D(pool_size=(1,1), strides=(2,2))(identity) # Zero_padding to match channels (it is important to use zero padding rather than 1by1 convolution) if in_channels != out_channels: identity = Lambda(pad_backend)(identity, in_channels, out_channels) residual = keras.layers.add( ) return residual # define and train a model inputs = Input(shape=input_shape) net = Conv2D(8, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(inputs) net = residual_shrinkage_block(net, 1, 8, downsample=True) net = BatchNormalization()(net) net = Activation('relu')(net) net = GlobalAveragePooling2D()(net) outputs = Dense(10, activation='softmax', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(net) model = Model(inputs=inputs, outputs=outputs) model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics= ) model.fit(x_train, y_train, batch_size=100, epochs=5, verbose=1, validation_data=(x_test, y_test)) # get results K.set_learning_phase(0) DRSN_train_score = model.evaluate(x_train, y_train, batch_size=100, verbose=0) print('Train loss:', DRSN_train_score ) print('Train accuracy:', DRSN_train_score ) DRSN_test_score = model.evaluate(x_test, y_test, batch_size=100, verbose=0) print('Test loss:', DRSN_test_score ) print('Test accuracy:', DRSN_test_score ) 为方便对比,深度残差网络的代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Dec 28 23:19:03 2019 Implemented using TensorFlow 1.0 and Keras 2.2.1 K. He, X. Zhang, S. Ren, J. Sun, Deep Residual Learning for Image Recognition, CVPR, 2016. @author: me """ from __future__ import print_function import numpy as np import keras from keras.datasets import mnist from keras.layers import Dense, Conv2D, BatchNormalization, Activation from keras.layers import AveragePooling2D, Input, GlobalAveragePooling2D from keras.optimizers import Adam from keras.regularizers import l2 from keras import backend as K from keras.models import Model from keras.layers.core import Lambda K.set_learning_phase(1) # input image dimensions img_rows, img_cols = 28, 28 # the data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape , 1, img_rows, img_cols) x_test = x_test.reshape(x_test.shape , 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape , img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape , img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) # Noised data x_train = x_train.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) x_test = x_test.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) print('x_train shape:', x_train.shape) print(x_train.shape , 'train samples') print(x_test.shape , 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) def pad_backend(inputs, in_channels, out_channels): pad_dim = (out_channels - in_channels)//2 return K.spatial_3d_padding(inputs, padding = ((0,0),(0,0),(pad_dim,pad_dim))) def residual_block(incoming, nb_blocks, out_channels, downsample=False, downsample_strides=2): residual = incoming in_channels = incoming.get_shape().as_list() for i in range(nb_blocks): identity = residual if not downsample: downsample_strides = 1 residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, strides=(downsample_strides, downsample_strides), padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) # Downsampling (it is important to use the pooL-size of (1, 1)) 1: identity = AveragePooling2D(pool_size=(1, 1), strides=(2, 2))(identity) # Zero_padding to match channels (it is important to use zero padding rather than 1by1 convolution) if in_channels != out_channels: identity = Lambda(pad_backend)(identity, in_channels, out_channels) residual = keras.layers.add( ) return residual # define and train a model inputs = Input(shape=input_shape) net = Conv2D(8, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(inputs) net = residual_block(net, 1, 8, downsample=True) net = BatchNormalization()(net) net = Activation('relu')(net) net = GlobalAveragePooling2D()(net) outputs = Dense(10, activation='softmax', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(net) model = Model(inputs=inputs, outputs=outputs) model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics= ) model.fit(x_train, y_train, batch_size=100, epochs=5, verbose=1, validation_data=(x_test, y_test)) # get results K.set_learning_phase(0) resnet_train_score = model.evaluate(x_train, y_train, batch_size=100, verbose=0) print('Train loss:', resnet_train_score ) print('Train accuracy:', resnet_train_score ) resnet_test_score = model.evaluate(x_test, y_test, batch_size=100, verbose=0) print('Test loss:', resnet_test_score ) print('Test accuracy:', resnet_test_score ) 备注: (1)深度残差收缩网络的结构比普通的深度残差网络复杂,也许更难训练。 (2)程序里只设置了一个基本模块,在更复杂的数据集上,可适当增加。 (3)如果遇到这个TypeError:softmax() got an unexpected keyword argument 'axis',就点开tensorflow_backend.py,将return tf.nn.softmax(x, axis=axis)中的第一个axis改成dim即可。 参考文献: M. Zhao, S. Zhong, X. Fu, et al., Deep residual shrinkage networks for fault diagnosis, IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898 https://ieeexplore.ieee.org/document/8850096
相关资源
广告