MindSpore这款刚刚开源的深度学习框架我爱了

【摘要】 本文主要通过两个实际应用案例:一是基于本地 Jupyter Notebook 的 MNIST 手写数据识别;二是基于华为云服务器的 CIFAR-10 图像分类,对开源框架 MindSpore 进行介绍。 犹记得今年的华为开发者大会 HDC 2020 上,一直受人瞩目的深度学习框架 MindSpore 终于开源了。 我之前一直关注 MindSpore,还是挺期待的。MindSpore 是一款支持端、边、云独立/协同的统一训练和推理框架。与 TensorFlow、PyTorch  等流行深度学习框架对标,MindSpore 旨在大幅度降低 AI 应用开发门槛,让人工智能无处不在。 MindSpore 最大的特点就是开发门槛大大降低,提高开发效率,这样可以显著减少模型开发时间。 因此,使用MindSpore的优势可以总结为以下四点: ●简单的开发体验 ●灵活的调试模式 ●充分发挥硬件潜能 ●全场景快速部署 既然开源了,那就赶紧上手,试一试这款开源的 MindSpore 怎么样!本文我将介绍 MindSpore 的安装和上手教程,通过一个简单的图像识别案例来跑完整个 AI 训练和测试流程。 一、MindSpore 的安装开源框架 MindSpore 的安装方法有很多,可以在 Windows、Ubuntu 上安装,也可以在华为 Ascend 910 上安装。各种详尽的安装方法请见下面的链接: https://www.mindspore.cn/install 下面介绍两种最简单的安装方法! 1. Docker 安装 Docker 安装最为简单,可参考: https://gitee.com/mindspore/m... 以 0.3.0-alpha 版本为例: CPU:docker pull mindspore/mindspore-cpu:0.3.0-alpha GPU:docker pull mindspore/mindspore-gpu:0.3.0-alpha 安装好后,可以看到安装的镜像,并使用下面的命令创建一个你的容器: docker run -it mindspore/mindspore-cpu:0.3.0-alpha /bin/bash2. Win10+Anaconda+MindSpore ...

July 2, 2020 · 3 min · jiezi

重磅YOLOv4阅读笔记附思维导图和论文译文

今天刷看到了YOLOv4之时,有点激动和兴奋,等了很久的YOLOv4,你终究还是出现了论文地址:https://arxiv.org/pdf/2004.10934.pdf GitHub地址:https://github.com/AlexeyAB/darknet 觉得作者很地道,论文附上开源,没有比这更开心的事情了吧! 首先附上对论文总结的思维导图,帮助大家更好的理解! 下边是对论文的翻译,有些地方可能翻译的不是很准备,欢迎指正补充 (思维导图和论文译文PDF均可在公众号【计算机视觉联盟】回复YOLOv4获取)摘要有很多特征可以提高卷积神经网络(CNN)的准确性。需要在大型数据集上对这些特征的组合进行实际测试,并需要对结果进行理论证明。某些特征仅在某些模型上运行,并且仅在某些问题上运行,或者仅在小型数据集上运行;而某些特征(例如批归一化和残差连接)适用于大多数模型,任务和数据集。我们假设此类通用特征包括加权残差连接(WRC),跨阶段部分连接(CSP),交叉小批量标准化(CmBN),自对抗训练(SAT)和Mish激活。我们使用以下新功能:WRC,CSP,CmBN,SAT,Mish激活,马赛克数据增强,CmBN,DropBlock正则化和CIoU丢失,并结合其中的一些特征来实现最新的结果:在MS COCO数据集上利用Tesla V10以65 FPS的实时速度获得了43.5%的AP(65.7%AP50)。开源代码链接:https://github.com/AlexeyAB/darknet。 1、介绍大多数基于CNN的物体检测器仅适用于推荐系统。例如,通过慢速精确模型执行的城市摄像机搜索免费停车位,而汽车碰撞警告与快速不精确模型有关。提高实时物体检测器的精度不仅可以将它们用于提示生成推荐系统,还可以用于独立的过程管理和减少人工输入。常规图形处理单元(GPU)上的实时对象检测器操作允许以可承受的价格对其进行运行。最精确的现代神经网络无法实时运行,需要使用大量的GPU进行大量的mini-batch-size训练。我们通过创建在常规GPU上实时运行的CNN来解决此类问题,并且该培训仅需要一个传统的GPU。 这项工作的主要目标是在产生式系统中设计一个运行速度快的目标探测器,并对并行计算进行优化,而不是设计一个低计算量的理论指标(BFLOP)。我们希望所设计的对象易于训练和使用。如图1中的YOLOv4结果所示,任何人使用传统的GPU进行训练和测试,都可以获得实时、高质量和令人信服的目标检测结果。我们的贡献概括如下: 我们开发了一个高效且功能强大的目标检测模型。它使每个人都可以使用1080Ti或2080TiGPU来训练超快、精确的物体探测器。我们验证了当前最新的“免费袋”和“特殊袋”检测方法在探测器训练过程中的影响。我们修改了最新的方法,使其更有效,更适合于单个GPU的培训,包括CBN[89]、PAN[49]、SAM[85]等。 2、相关工作(Related work)2.1 目标检测算法(Object detection models)目标检测算法一般有两部分组成:一个是在ImageNet预训练的骨架(backbone),,另一个是用来预测对象类别和边界框的头部。对于在GPU平台上运行的检测器,其骨干可以是VGG [68],ResNet [26],ResNeXt [86]或DenseNet [30]。对于在CPU平台上运行的那些检测器,其主干可以是SqueezeNet [31],MobileNet [28、66、27、74]或ShuffleNet [97、53]。对于头部,通常分为两类,即一级对象检测器和二级对象检测器。最具有代表性的两级对象检测器是R-CNN [19]系列,包括fast R-CNN [18],faster R-CNN [64],R-FCN [9]和Libra R-CNN [ 58]。还可以使两级对象检测器成为无锚对象检测器,例如RepPoints [87]。对于一级目标检测器,最具代表性的模型是YOLO [61、62、63],SSD [50]和RetinaNet [45]。近年来,开发了无锚的(anchor free)一级物体检测器。这类检测器是CenterNet [13],CornerNet [37、38],FCOS [78]等。近年来,无锚点单级目标探测器得到了发展,这类探测器有CenterNet[13]、CornerNet[37,38]、FCOS[78]等。近年来发展起来的目标探测器经常在主干和头部之间插入一些层,这些层通常用来收集不同阶段的特征图。我们可以称它为物体探测器的颈部。通常,颈部由几个自下而上的路径和几个自上而下的路径组成。具有这种机制的网络包括特征金字塔网络(FPN)[44]、路径聚集网络(PAN)[49]、BiFPN[77]和NAS-FPN[17]。除上述模型外,一些研究人员将重点放在直接构建用于检测对象的新主干(DetNet [43],DetNAS [7])或新的整个模型(SpineNet [12],HitDe-tector [20])上。 总而言之,普通的检测器由以下几个部分组成: 输入:图像,斑块,图像金字塔骨架:VGG16 [68],ResNet-50 [26],SpineNet [12],EfficientNet-B0 / B7 [75],CSPResNeXt50 [81],CSPDarknet53 [81]颈部: 其他块:SPP [25],ASPP [5],RFB [47],SAM [85]路径聚合块:FPN [44],PAN [49],NAS-FPN [17] ],Fully-connected FPN,BiFPN [77],ASFF [48],SFAM [98]Heads : ...

June 28, 2020 · 2 min · jiezi

中美高校合作开发深度学习框架或可用于疫情防范控制

技术编辑:芒果果丨发自 思否编辑部SegmentFault 思否报道丨公众号:SegmentFault 网络科学是一个学术领域,旨在揭示网络背后的结构和动态,如电信、计算机、生物和社会网络。近年来,网络科学家一直在试图解决的一个基本问题是确定一组最能影响网络功能的最佳节点,被称为「关键参与者」。 最近,中国国防科技大学、加州大学洛杉矶分校和哈佛医学院的研究人员开发了一个深度强化学习分析框架,称为 FINDER,可以更有效地识别复杂网络中的关键参与者。 相关研究论文已发表在《自然机器智能》杂志上,论文中描述的框架是在经典网络模型生成的合成网络上进行训练的,然后应用到现实世界的场景中。 FINDER 识别网络中的关键参与者确定关键参与者可以大大有益于许多现实世界的应用,例如,加强网络免疫技术,以及协助控制流行病、药物设计和病毒营销。 然而,由于其具有 NP 难性,使用具有多项式时间复杂度的精确算法来解决此问题具有很高的挑战性。 参与这项研究的高级研究人员之一  Yangyu Liu 说:“这项工作的动机是网络科学中的一个基本问题: 我们如何才能找到一组最优的关键参与者,他们的激活(或删除)将最大限度地增强(或降低)网络功能?针对具体的应用场景,已经提出了许多近似和启发式的策略,但是我们仍然缺乏一个统一的框架来有效地解决这个问题。” “FINDER”代表通过深度强化学习寻找网络关键参与者的缩写,它以最近开发的深度学习技术为基础,用于解决组合优化问题。研究人员将 FINDER 训练在一个由经典网络模型生成的大型小型合成网络上,使用特定于它试图解决的任务的奖励函数来引导它。 这个策略引导 FINDER 确定它应该做什么(例如,它应该选择什么节点)来根据当前的状态(例如,当前的网络结构)确定在一段时间内积累最大的回报应采取的措施。 另一位参与此项研究的高级研究员 Yizhou Sun 说:“在传统的强化学习任务中,比如机器人技术中,代表状态和动作可能很简单,但是网络却不是这样。我们在这个项目中面临的另一个挑战是确定如何表示一个网络,因为它有一个离散的数据结构,位于一个极其高维的空间。 为了解决这个问题,我们扩展了当前的图形神经网络来表示节点(动作)和图形(状态),这是与强化学习任务共同学习的。” 为了有效地表示复杂的网络,研究人员共同确定了各个网络状态和动作的最佳表示,以及当网络处于特定状态时确定最佳动作的最佳策略。由此产生的表示方法可以指导 FINDER 识别网络中的关键参与者。 新的深层加固框架已取得良好效果由 Sun,Liu 和他们的同事设计的新框架具有很高的灵活性,因此可以通过简单地改变奖励函数来应用于各种现实世界的网络分析。 它也非常有效,因为它在效率和速度方面超过了许多以前制定的确定网络中关键角色的战略。 值得注意的是,FINDER 可以很容易地扩大规模,以分析包含数千甚至数百万节点的广泛网络。 Yangyu Liu 表示:“与现有技术相比,FINDER 在复杂网络中寻找关键参与者的有效性和效率方面取得了优异的成绩。在解决复杂的现实世界网络上具有挑战性的优化问题方面,它代表了一种范式转变。 FINDER 不需要特定领域的知识,只需要真实网络的程度异质性,只需对小的合成图进行一次离线自我训练,就可以实现这一目标,然后在大得多的现实世界网络的不同领域中得到惊人的普及。” 迄今为止,新的深层加固框架已经取得了很好的效果。 在未来,它可以用于研究社交网络、电网、传染病的传播以及许多其他类型的网络。 新项目进行中,可用于人类健康研究Yangyu Liu 和 Yizhou Sun 与研究团队收集的结果强调了如经典网络模型 Barabási-Albert 模型的前景,并从中汲取了灵感。 虽然简单的模型可能看起来非常基本,但实际上,它们通常捕获了许多现实世界网络的主要特征,即程度异构性。 当试图解决与复杂网络相关的复杂优化问题时,这个特性可能具有巨大的价值。 “我的实验室正在沿着同样的研究方向进行几个不同研究,包括:(1)设计更好的图形表示学习架构; (2)探索如何在不同领域的不同图形甚至图形之间转移知识; (3)研究图形上的其他 NP 难题,并从学习的角度解决这些问题。” Yizhou Sun 和他在加州大学洛杉矶分校的团队计划为网络科学研究开发新技术。而 Yangyu Liu 和他在 HMS 的团队则希望开始在真正的生物网络上测试 FINDER。 ...

June 28, 2020 · 1 min · jiezi

深度学习四大名著发布PythonTensorFlow机器学习深度学习四件套

Python 程序员深度学习的“四大名著”: 这四本书着实很不错!我们都知道现在机器学习、深度学习的资料太多了,面对海量资源,往往陷入到“无从下手”的困惑出境。而且并非所有的书籍都是优质资源,浪费大量的时间是得不偿失的。 给大家推荐这几本好书并做简单介绍: 1、《Deep Learning with Python》 推荐指数:★★★★☆ 本书自出版以来收到众多好评,因为是 Keras 作者写的书,所以全书基本围绕着 Keras 讲深度学习的各种实现,从 CNN,RNN 到 GAN 等,偏入门,但也承载着很多作者对深度学习整体性的思考。这是一本偏实战的书,教你使用 Keras 快速实现深度学习经典项目。看完这本书,基本能对 Keras 和深度学习实战有比较初步的掌握了。 本书源码 GitHub 地址: https://github.com/fchollet/d... 2、《Python Machine Learning》 推荐指数:★★★☆☆ 本书使用了 Scikit-Learn 和 TensorFlow,分别讲解机器学习和深度学习,并每章配备实操代码。还有一点是讲解了如何将机器学习模型发布到 Web 应用。整个知识体系相对更加完善,是一本比较全面的机器学习书籍。 本书源码 GitHub 地址: https://github.com/rasbt/pyth... 3、《Hands-On Machine Learning with Scikit-Learn & TensorFlow》 推荐指数:★★★★★ 本书中文译为《Scikit-Learn 与 TensorFlow 机器学习实用指南》。这本书最大的特色从理论上讲就是言简意赅,全书基本上没有太多复杂的数学公式推导,语言通俗易懂,很容易看得懂、看得下去。正本书兼顾理论与实战,是一本非常适合入门和实战的机器学习书籍。 本书源码 GitHub 地址: https://github.com/ageron/han... 4、《Deep Learning》 推荐指数:★★★★☆ 又名“花书”。该书由三位大佬 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 撰写,是深度学习领域奠基性的经典教材。相信这本书大部分人入坑深度学习的都知道! ...

June 27, 2020 · 1 min · jiezi

Spark如何与深度学习框架协作处理非结构化数据

随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片、音频、文本)进行大数据处理的业务场景越来越多。本文会介绍Spark如何与深度学习框架进行协同工作,在大数据的处理过程利用深度学习框架对非结构化数据进行处理。 Spark介绍Spark是大规模数据处理的事实标准,包括机器学习的操作,希望把大数据处理和机器学习管道整合。 Spark使用函数式编程范式扩展了MapReduce模型以支持更多计算类型,可以涵盖广泛的工作流。Spark使用内存缓存来提升性能,因此进行交互式分析也足够快速(如同使用Python解释器,与集群进行交互一样)。缓存同时提升了迭代算法的性能,这使得Spark非常适合机器学习。 由于Spark库提供了Python、Scale、Java编写的API,以及内建的机器学习、流数据、图算法、类SQL查询等模块;Spark迅速成为当今最重要的分布式计算框架之一。与YARN结合,Spark提供了增量,而不是替代已存在的Hadoop集群。在最近的Spark版本中,Spark加入了对于K8s的支持,为Spark与AI能力的融合提供了更好的支持。 深度学习框架介绍TensorFlow TensorFlow最初是由Google机器智能研究部门的Google Brain团队开发,基于Google 2011年开发的深度学习基础架构DistBelief构建起来的。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。 TensorFlow是一个非常基础的系统,因此也可以应用于众多领域。但由于过于复杂的系统设计,对读者来说,学习TensorFlow底层运行机制更是一个极其痛苦的过程。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,同时也间接导致了许多基于TensorFlow的第三方框架出现BUG。 Keras Keras 于2015年3月首次发布,拥有“为人类而不是机器设计的API”,得到Google的支持。它是一个用于快速构建深度学习原型的高层神经网络库,由纯Python编写而成,以TensorFlow、CNTK、Theano和MXNet为底层引擎,提供简单易用的API接口,能够极大地减少一般应用下用户的工作量。 严格意义上讲,Keras并不能称为一个深度学习框架,它更像一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失灵活性。Keras最初作为Theano的高级API而诞生,后来增加了TensorFlow和CNTK作为后端。学习Keras十分容易,但是很快就会遇到瓶颈,因为它缺少灵活性。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。 PyTorch PyTorch于2016年10月发布,是一款专注于直接处理数组表达式的低级API。 前身是Torch(一个基于Lua语言的深度学习库)。Facebook人工智能研究院对PyTorch提供了强力支持。PyTorch支持动态计算图,为更具数学倾向的用户提供了更低层次的方法和更多的灵活性,目前许多新发表的论文都采用PyTorch作为论文实现的工具,成为学术研究的首选解决方案。 Caffe/Caffe2.0 Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,于2013年底由加州大学伯克利分校开发,核心语言是C++。它支持命令行、Python和MATLAB接口。Caffe的一个重要特色是可以在不编写代码的情况下训练和部署模型。如果您是C++熟练使用者,并对CUDA计算游刃有余,你可以考虑选择Caffe。 在Spark大数据处理中使用深度学习框架在Spark程序中使用一个预训练过的模型,将其并行应用于大型数据集的数据处理。比如,给定一个可以识别图片的分类模型,其通过一个标准数据集(如ImageNet)训练过。可以在一个Spark程序中调用一个框架(如TensorFlow或Keras)进行分布式预测。通过在大数据处理过程中调用预训练模型可以直接对非结构化数据进行直接处理。 我们重点介绍在Spark程序中使用Keras+TensorFlow来进行模型推理。 使用深度学习处理图片的第一步,就是载入图片。Spark 2.3中新增的ImageSchema包含了载入数百万张图像到Spark DataFrame的实用函数,并且以分布式方式自动解码,容许可扩展地操作。 使用Spark's ImageSchema: from pyspark.ml.image import ImageSchemaimage_df = ImageSchema.readImages("/data/myimages")image_df.show()也可以利用Keras的图片处理库: from keras.preprocessing import imageimg = image.load_img("/data/myimages/daisy.jpg", target_size=(299, 299))可以通过图片路径来构造Spark DataFrame: def get_image_paths_df(sqlContext, dirpath, colName): files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir(dirpath) if f.endswith('.jpg')] return sqlContext.createDataFrame(files, StringType()).toDF(colName)使用Keras接口加载预训练模型: from keras.applications import InceptionV3model = InceptionV3(weights="imagenet")model.save('/tmp/model-full.h5')model = load_model('/tmp/model-full.h5')定义图片识别推理方法: ...

June 18, 2020 · 1 min · jiezi

mask-rcnn-部署小技巧

int8进行网络传输目的:我们项目需要用到instance segmentation, 所以 rcnn_mask输出层数据量特别大,同时因为图片尺寸有1024*1024*3这么大.如果不压缩一下直接进行网络传输,数据量会很大,接口延迟很高.为了部署后,请求推理服务时,数据输入层和输出层的传输量减少.从float32 转变成 int8,传输量减少了4倍.处理:输入层:先转换成 int8,然后再转成float32 def build(self, mode, config): input_image = KL.Input( shape=[None, None, config.IMAGE_SHAPE[2]], name="input_image",dtype=tf.int8) input_image = KL.Input(tensor=K.cast(input_image,dtype= tf.float32)) 输出层: mrcnn_mask = build_fpn_mask_graph(detection_boxes, mrcnn_feature_maps, input_image_meta, config.MASK_POOL_SIZE, config.NUM_CLASSES,模型导出时加上去 mrcnn_mask = KL.Lambda(lambda x: x*255)(mrcnn_mask) mrcnn_mask = KL.Lambda(lambda x: tf.cast(x,dtype=tf.int8))(mrcnn_mask)云函数服务 拿到`mrcnn_mask`输出层数据后,再转换成 `float32`- 模型导出:导出时注意 `output` 名称要对应.def save_model(): config = QuesConfig()PRETRAINED_MODEL_PATH = "/xxxxx/weights"MODEL_NAME = 'xxxxx_0601.h5'export_dir = "./saved_model/1/"h5_to_saved_model(config, PRETRAINED_MODEL_PATH, MODEL_NAME, export_dir)def h5_to_saved_model(config, model_dir, model_name, export_dir): if tf.gfile.Exists(export_dir): tf.gfile.DeleteRecursively(export_dir)config.display()model = modellib.MaskRCNN(mode="inference", config=config, model_dir=model_dir)model_path = os.path.join(model_dir, model_name)model.load_weights(model_path, by_name=True)with K.get_session() as session: save_m(export_dir, session)def save_m(export_dir, session): ...

June 4, 2020 · 1 min · jiezi

DeepMind-发布-Acme-框架用于强化学习算法开发的分布式框架

技术编辑:芒果果丨发自 思否编辑部SegmentFault 思否报道丨公众号:SegmentFault DeepMind 发布了 Acme 框架,该框架旨在通过使 AI 驱动的代理可以执行各种规模的运行来简化强化学习算法的开发。 Acme 背后的工程师和研究人员共同撰写了一篇关于这项工作的技术论文,根据他们的说法,Acme 可以用来创建比以前的方法具有更大并行性的代理。 Acme 试图解决复杂性和规模问题Acme 是用于培训强化学习代理的开发套件,该套件试图解决复杂性和规模问题,其组件用于构建从算法和策略到学习者的各种抽象级别代理。 有人认为,这样做可以让想法快速迭代,并在生产过程中对这些想法进行评估,主要是通过培训循环、强迫性日志记录和检查点。 在 Acme 内部,参与者与环境紧密互动,观察环境产生观察结果,并采取相应的行动,将其反馈到环境中。在观察了随之而来的过度之后,行为者有机会更新自己的状态。这通常与其行动选择政策又短,这些政策决定了他们为应对环境而采取的行动。 一种特殊类型的 Acme actor 包括演示和学习两个部分,它们被称为“代理”,其状态更新是由学习器组件中的一些步骤触发的。也就是说,参与主体在很大程度上会将他们的行动选择放到自己的行动组成部分。 Acme 框架加强环境互动强化学习技术让代理人与环境互动,声称他们自己的训练数据,并在电子游戏、机器人技术、自动驾驶机器人出租车等领域取得了突破。 相关技术最近的进展归因于所使用的训练数据量的增加,进行了新的系统设计,使代理人与环境实例相互作用,以迅速积累经验。 DeepMind 断言,将算法的单进程原型扩展到分布式系统通常需要重新实现相关的代理,这就是 Acme 框架的用武之地。 Acme 改善强化学习可再现性,可提供构建新代理的能力Acme 提供了一个数据集模块,位于参与者和学习者组件之间,并由 DeepMind 本周发布的称为 Reverb 的低级存储系统提供支持。 此外,该框架还建立了一个用于插入 Reverb 的通用接口,从而实现了不同风格的预处理以及正在进行的观测数据聚合。 行动、学习和存储组件在 Acme 内的不同线程或过程中划分,这具有两个好处:环境交互与学习过程异步发生,并且数据生成加速。在其他地方,Acme 的速率限制允许从学习到行动执行所需的速率,只要流程保持在一定的定义公差内,就可以不受阻碍地运行。 例如,如果一个进程由于网络问题或资源不足而开始落后于另一个进程,则速率限制器将组织落后者,而另一个则追赶上来。 除了这些工具和资源,Acme 还附带了一组示例代理,作为其各自的强化学习算法以及强大的研究基准的实现。 DeepMind 表示,未来可能会有更多这样的服务。研究人员表示:“通过提供这些,我们希望 Acme 将帮助改善强化学习中的可再现性,并为学术研究社区提供简单的构建新代理的能力。此外,我们的基线应该提供更多的标准来衡量该领域的进展。”

June 4, 2020 · 1 min · jiezi

BN和LN

Batch NormalizationBN的参数计算是以一个mini batch为组的,每一层的输出$Z= R^{batch\_size,hidden\_size}$在进激活函数之前,针对每一个神经元,即每一个输出$Z_i = R^{batch\_size,1}$做统计归一。统计指标为每个batch的输出的一个维度的均值和方差,对应的会有两个hidden_size维的向量: $$\mu_{ Z_i} = \frac{1}{batch\_size} \sum\limits^{batch\_size}_{j=1} Z_{i,j} $$$$\sigma_{Z_i}=\sqrt{\frac{1}{batch\_size}\sum\limits_{j=1}^{batch\_size}(\mu_{Z_i} - Z_i)^2} $$ BN的更新BN得到两个参数向量后会对该层的输出$Z$做变换,即更新该层的输出到一个合理的分布上。更新分两步,1. 变换到一个均值为0方差为1的分布上(针对的是每一维度)。2. 再做一次平移和缩放操作,这一步是通过一个线性变换得到的,平移参数可学习。两步更新后再过激活函数。$$ Z'_i = \frac {Z_i - \mu_{Z_i}}{\sigma_{Z_i}} $$$$ Z''_i = gZ'_i+b $$ BN特点: 所有的操作都是在一个维度上进行的,参数的计算依赖于batch_size倾向于认为同一位置的特征的同一维度的信息应该具有相同的分布,也可以认为同一位置的特征具有相同分布。因为参数和batch_size相关,batch_size太小会带来分布和整体不一致的问题。故train的batch_size不适宜太小,且需尽量打散,以保证分布和整体接近。在infer阶段和train阶段会有不一样的策略。infer阶段往往只有一个样本,再去求参数,明显不可行,所以一般会在train阶段迭代的更新$\mu和\sigma$参数,以估计所有训练样本的参数,且存下来,作为infer阶段使用的参数。Layer NormalizationLN的计算是在单个样本级别上做的normlize。对每一层的输出$Z= R^{batch\_size,hidden\_size}$ 在激活之前,针对每一个样本$Z_j = R^{1,hidden_size}$求参数$\mu 和\sigma$,求取方式和BN类似,只是方向不同。最终batch_size个样本得到batch_size组参数。LN的更新,依据每个样本的参数逐个更新各个样本的每一维度。然后做同样的缩放和平移。平移参数和缩放参数可学习。LN特点: 所有的操作都是在单个样本上计算的,所以不依赖于batch_size,所以不用存储$\mu和\sigma$参数到infer阶段。train和infer一致。倾向于认为一个样本内部的所有feature是相似的,可以直接在样本内各个维度上norm。这一假设在nlp任务中比较得到明显。一个句子的各个特征就是各个字词处理后得到的,基本是相似的。但假如输入特征是类似年龄,性别,身高这种多个不同特征concat起来的,再直接求样本内部的norm,由于各个feature的分布不一样,就会存在很大的问题。对比BN不太适合NLP任务中的不定长类任务。 不定长的样本,在靠后位置的有效样本会变少,相当于变相的batch_size在变小。在RNN类的循环网络中,越往后相当于样本越长,有效样本越少,BN效果会变差。在infer阶段如果一个很长的样本在train阶段没有见过,则会找不到对应的参数。LN比较适合NLP任务 变长样本处理起来无问题。一个样本的各个特征一般是比较相似的,如一个句子的特征是各个字,concat后,各个维度的分布也是一致的。在TF,pytoch等的实现中,LN一般是针对最内层的向量内部做norm参数。如[batch_size,seq_len,hidden_size]这样的一个输出,在LN时,是针对最内层的hidden_size个神经元求参,更是不会和padding的feature起冲突。而BN相当于在一个[batch_size*seq_len,hidden_size]的矩阵上做BN,这时求均值方差时会把padding的样本也算进去。LN和BN都需要两步变换,第一步变换得到一个$\mu=0 且\sigma=1$的分布,这一步目的把神经元的输出变换到一个比较均衡的分布上,达到参数稳定的目的。第二部通过两个可学系参数(tf中的$\gamma和\beta $)做缩放和平移,以期恢复原数据的表达的能力。

May 31, 2020 · 1 min · jiezi

深度学习优质实践案例用-Keras-实现人群中的口罩检测

Keras 是一个由 Python 编写的开源人工神经网络库,可以作为 Tensorflow、Microsoft-CNTK 和 Theano 的高阶应用程序接口,进行深度学习模型的设计、调试评估、应用和可视化。 Gitee 上这位优秀的开发者也是一名深度学习爱好者,为了做一次目标检测学习了 RCNN,FastRCNN,FasterRCNN 的理论,随后便诞生了这个项目,我们一起来看看他是怎么做的吧。 项目名称:keras 口罩检测 项目作者:唐振超 开源许可协议:GPL-3.0 项目地址:https://gitee.com/tang_zhen_chao/keraskouzhaojiance 介绍使用 keras 搭建 fasterRCNN,在 VOC 格式的口罩数据集上训练,达到了检测人群中有无戴口罩的目的。 软件架构*可前往项目主页查看 安装教程 需要numpy,matplotlib,scikit-learn,Pillow,tensorflow1.x,keraspip install package或者conda install package如果要训练,需要使用VOC格式数据集,需要安装labelimg使用说明 ./model_data/logs下必须有模型权重文件,由于权重较大,所以未上传./theory下是做这个东西的流程与方便理解代码的原理说明./net下是fasterRCNN的模型构建run.py用于直接运行看结果,voctrain.py用于训练自己的VOC数据集结果显示 点击链接前往项目主页看看项目的详细信息:https://gitee.com/tang_zhen_chao/keraskouzhaojiance

May 28, 2020 · 1 min · jiezi