├── 1.常见深度学习框架 ├── README.md └── 香港浸会大学框架性能比较.pdf ├── 10.对抗蒸馏 └── README.md ├── 2.基础网络 ├── README.md └── VGG.pdf ├── 3.神经网络的优化 ├── README.md └── opt.png ├── 4.模型之间的转换 ├── README.md └── det1_.png ├── 5.模型的部署 ├── README.md └── 在CPP下使用TVM来部署mxnet模型(以Insightface为例).md ├── 6.神经网络的设计 ├── 1.png ├── 2.jpg ├── 3.jpg ├── MTCNN-优化.md └── README.md ├── 7.神经网络的适用场景 └── README.md ├── 8.基础网络的训练 └── README.md ├── 9.相关面试题 └── README.md └── README.md /1.常见深度学习框架/README.md: -------------------------------------------------------------------------------- 1 | ### 常用深度学习框架 2 | 3 | #### 2018.09.13 4 | 5 | 深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon等。我们参考开源的测试结果,结合自己整理的数据,针对主流的深度学习框架进行简单对比及介绍。 6 | 7 | | 框架 | 机构 | 支持语言 | Stars | Forks | 8 | | --------------------------------------------------------- | ----------- | ------------------- | ---------- | ----- | 9 | | [Caffe](https://github.com/BVLC/caffe) | BVLC | C++/Python/Matlab | 25480 | 15560 | 10 | | [CNTK](https://github.com/Microsoft/CNTK) | Microsoft | C++ | 15083 | 4020 | 11 | | [Keras](notebooks/Keras_TF_CNN.ipynb) | Fchollet | Python | 33332 | 12563 | 12 | | [Tensorflow](https://github.com/tensorflow/tensorflow) | Google | Python/C++/Go... | 109115 | 67339 | 13 | | [MXNet](https://github.com/apache/incubator-mxnet) | DMLC | Python/C++/R... | 15162 | 5484 | 14 | | [PyTorch](https://github.com/pytorch/pytorch) | Facebook | Python | 18517 | 4426 | 15 | 16 | 17 | 18 | ### 性能对比 19 | 20 | 21 | #### 1. 训练时间: Network DenseNet-121 (Multi-GPU) 22 | 23 | **运行于 SSD 硬盘** 24 | 25 | | 框架 | 1xV100/CUDA 9/CuDNN 7 | 4xV100/CUDA 9/CuDNN 7 | 26 | | --------------- | :------------------: | :------------------: | 27 | | Pytorch | 27min | 10min | 28 | | Keras(TF) | 38min | 18min | 29 | | Tensorflow | 33min | 22min | 30 | | MXNet(Gluon) | 29min | 10min | 31 | 32 | **运行于RAM内存中** 33 | 34 | | 框架 | 1xV100/CUDA 9/CuDNN 7 | 4xV100/CUDA 9/CuDNN 7 | 35 | | -------------- | :------------------: | :------------------: | 36 | | Pytorch | 25min | 8min | 37 | | Keras(TF) | 36min | 15min | 38 | | Tensorflow | 25min | 14min | 39 | | MXNet(Gluon) | 28min | 8min | 40 | 41 | 42 | 43 | #### 2. 1000张图片推理时间(s): Network ResNet-50 44 | 45 | | 框架 | K80/CUDA 8/CuDNN 6 | P100/CUDA 8/CuDNN 6 | 46 | | ---------------- | :----------------: | :-----------------: | 47 | | CNTK | 8.5 | 1.6 | 48 | | Keras(TF) | 10.2 | 2.9 | 49 | | Tensorflow | 6.5 | 1.8 | 50 | | MXNet | 7.7 | 1.6 | 51 | | PyTorch | 7.7 | 1.9 | 52 | 53 | 54 | #### 3. CPU推理时间(s): E5-2630v4, Network FCN5 55 | 56 | | 框架 | 1 Thread | 2 Threads | 4 Threads | 8 Threads | 16 Threads | 32 Threads | 57 | | ----------- | :--------: | :-------: | :-----: | :-----: | :-----: | :------: | 58 | | Caffe | 1887.2ms | 1316.7ms | 1051.8ms | 952.1ms | 952.3ms | 834.7ms | 59 | | CNTK | 1238.7ms | 616.3ms | 352.7ms | 229.5ms | 155.9ms | 192.4ms | 60 | | Tensorflow | 992.2ms | 773.6ms | 419.3ms | 252.3ms | 149.7ms | 124.7ms | 61 | | MXNet | 1386.8ms | 915.5ms | 559.0ms | 499.1ms | 416.3ms | 413.9ms | 62 | 63 | 64 | ### 框架评价 65 | 66 | | 框架 |安装成本| 代码理解程度 | API丰富程度 | 模型丰富程度 | 文档完整程度 |训练与测过程 | 学习资源 67 | | ------------------ | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 68 | | CNTK | 良好 | 良好 | 良好 | 良好 | 优秀 | 良好 | 良好 | 69 | | Keras | 良好 | 良好 | 优秀 | 优秀 | 良好 | 优秀 | 良好 | 70 | | MXNet | 良好 | 良好 | 良好 | 良好 | 良好 | 优秀 | 优秀 | 71 | | Pytorch | 优秀 | 优秀 | 良好 | 良好 | 优秀 | 良好 | 良好 | 72 | | Tensorflow | 良好 | 良好 | 优秀 | 优秀 | 优秀 | 优秀 | 优秀 | 73 | | Caffe | 良好 | 优秀 | 良好 | 良好 | 优秀 | 良好 | 优秀 | 74 | 75 | 76 | 77 | ### 推荐框架 78 | 79 | 80 | 目前众多的深度学习框架,使用者只要选择适合自己的框架即可,我们在日常使用中,考虑到训练的快捷程度,部署难度以及对CNN、RNN模型的直接程度,推荐以下几款深度学习框架。 81 | 82 | 83 | #### 1.Keras 84 | 85 | Keras 提供了简单易用的 API 接口,入门快,特别适合初学者入门。其后端采用 TensorFlow, CNTK,以及 Theano。另外,Deeplearning4j 的 Python 也是基于 Keras 实现的。Keras 几乎已经成了 Python 神经网络的接口标准。 86 | 87 | #### 2.TensorFlow 88 | 89 | 谷歌出品,追随者众多。代码质量高,支持模型丰富,支持语言多样, TensorBoard 可视化工具使用方便。 90 | 91 | #### 3.MXNet 92 | 93 | 已被亚马逊选为 AWS 上的深度学习框架,支持动态图计算。MXNet 有许多中国开发者,因而有非常良好的中文文档支持。Gluon 接口使得 MXNet 像 Keras 一样简单易用。 94 | 95 | 96 | ### 参考资料 97 | 1. [香港浸会大学深度学习框架Benchmark](http://dlbench.comp.hkbu.edu.hk/?v=v8) 98 | 2. [DeepLearningFrameworks](https://github.com/ilkarman/DeepLearningFrameworks) 99 | 3. [博客](http://app.myzaker.com/news/article.php?pk=5a13b55c1bc8e05d71000016) 100 | 4. [开发者如何选择深度学习框架?](https://www.zhihu.com/question/68114194/answer/465874315) 101 | -------------------------------------------------------------------------------- /1.常见深度学习框架/香港浸会大学框架性能比较.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xindongzhang/HyperDL-Tutorial/a2c385a643ed6485371000a8b678941950e540e2/1.常见深度学习框架/香港浸会大学框架性能比较.pdf -------------------------------------------------------------------------------- /10.对抗蒸馏/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 你的神经网络真的收敛了么? 6 | 7 | ***1、为什么小模型的作为backbone效果会差?*** 8 | 在深度学习目标检测(图像分割)领域,我们发现当我们使用层数越深,并且在imagenet上表现越好的分类网络作为backbone时,它的检测和分割效果越好效果越好。比如我们使用resnet101作为backbone时候,faster_rcnn在coco2017检测数据集上的mAP可以达到40.1,而使用resnet50作为backbone时候,mAP只达到37.1。而ssd使用resnet50作为backbone时候,mAP达到30.6,使用mobilenet作为backbone只达到21.7。参看gluoncv公布的训练结果。https://gluon-cv.mxnet.io/model_zoo/detection.html#faster-rcnn 9 | 10 | 那为什么使用mobilenet这种小网络会比resnet101这种大网络效果差这么多呢?主流的想法是小网络的容量小、表现效果差,等等。 11 | 12 | **那到底是那么原因呢?**我们可以观察gluoncv官网的ssd_mobilenet[[1\]](https://zhuanlan.zhihu.com/p/68563369#ref_83831_1)和ssd_resnet50[[2\]](https://zhuanlan.zhihu.com/p/68563369#ref_83831_2)在coco上的训练log。我们发现ssd_resnet50[[2\]](https://zhuanlan.zhihu.com/p/68563369#ref_83831_2)的CrossEntropy和SmoothL1最终收敛到2.14+,和1.22+左右,而ssdmobilenet 的CrossEntropy和SmoothL1最终收敛到2.84+,和3.29+左右。同样我们可以去观察gluoncv官网的faster_rcnn分别在resnet50和在resnet101上的训练loss,我们可以发现loss收敛的越小模型在coco 2017的验证集上的mAP越高。并且当backbone使用fpn的方法增大了模型的体积,模型的loss会将的更低,相应的mAP也越高。由此我个人认为使用小模型的作为backbone的迁移学习任务(尤其是目标检测任务)效果差的真正原因是模型欠拟合。 13 | 14 | ***2、你的神经网络真的收敛了么?*** 15 | 16 | 既然知道小网络作为backbone效果差的真正原因是模型欠拟合,那如果我们要提高小网络的效果,最主要的任务就是降低小网络的loss(当然大网络的loss如果被进一步降低效果自然越好,比如可以观看faster_rcnn+fpn+resnet101就比faster_rcnn+resnet101的loss低一点点,当然效果也就提升一点点)。 17 | 18 | **而我们不妨假设如果小网络最终”收敛“的loss如果可以达到大网络收敛的loss,那小网络能否达到大网络的效果呢?**可能由于小网络的容量小,参数少,很难收敛到大网络的最终收敛的loss。当然方法是人想的,不然怎么能发paper。 19 | 20 | 我个人认为降低小网络的loss主要有两种方式: 21 | 22 | **1、提高效果的模型体积**,如FPN,DLA,shortcut,concat 等等。不过当模型体积增大到一定程度,他所能得到的收益也越小,比如可以观看gluoncv官网的log。faster_rcnn+fpn+resnet101就比faster_rcnn+resnet101的loss低一点点,当然效果也就提升一点点。而faster_rcnn+fpn+resnet50就比faster_rcnn+resnet50的loss低很多,当然效果也就提升也高了很多。 23 | 24 | **2、改变训练方式**,比如很早提出的知识蒸馏,2018年的cascade rcnn和snip,以及2019年的各种anchor free,都是改变训练方式,虽然他们的动机各不相同,但是我觉得大部分都是进一步降低loss,提高模型的效果。 25 | 26 | ​ 第一种方式对于个人觉得对于做模型压缩的人来说不太可取,而第二种方式才是主要考虑方向。对于改变训练方式的方法,读者可以参看我的上一篇文章[https://zhuanlan.zhihu.com/p/64138476](https://zhuanlan.zhihu.com/p/64138476)对抗蒸馏,使用对抗生成网络和cosine attention的机制,将大网络的知识迁移到小网络,进一步降低小网络最终的收敛loss。目前开放的使用ssd_resnet50作为teacher net ssd_mobilenet作为student net在voc数据集上将**ssd_mobilenet**的**CrossEntropy**和**SmoothL1**最终收敛到1.388+ 0.659+,mAP达到78.2+,而**原始ssd_mobilenet**在voc上的**CrossEntropy**和**SmoothL1**最终收敛到1.962+ 0.944+,**mAP**达到75.4,由于gpu资源限制目前在coco上还没训练完。训练log地址为,[https://github.com/p517332051/GAN-Knowledge-Distillation-SSD/blob/master/ssd_512_mobilenet1_0_resnet50_v1_voc_g_d_new_train.log](https://github.com/p517332051/GAN-Knowledge-Distillation-SSD/blob/master/ssd_512_mobilenet1_0_resnet50_v1_voc_g_d_new_train.log)。 27 | 28 | ​ 通过这种方法,我发现小网络并非不是不可以继续收敛,而是训练方式得到改善自然可以继续降低他的loss,而随之loss降低,网络的效果可以进一步提升。期望我的方法能起到抛砖引玉的效果,能推动学术界和工业界神经网络压缩的工作的进展。 29 | 30 | 31 | 32 | 知乎链接[https://zhuanlan.zhihu.com/p/68563369](https://zhuanlan.zhihu.com/p/68563369) 33 | 34 | ## 参考 35 | 36 | 1. [^](https://zhuanlan.zhihu.com/p/68563369#ref_83831_1_0)https://raw.githubusercontent.com/dmlc/web-data/master/gluoncv/logs/detection/ssd_512_mobilenet1_0_coco_train.log 37 | 2. ^[a](https://zhuanlan.zhihu.com/p/68563369#ref_83831_2_0)[b](https://zhuanlan.zhihu.com/p/68563369#ref_83831_2_1)https://raw.githubusercontent.com/dmlc/web-data/master/gluoncv/logs/detection/ssd_512_resnet50_v1_coco_train.log 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /2.基础网络/README.md: -------------------------------------------------------------------------------- 1 | 2 | ## 深度学习经典卷积神经网络 3 | 4 | 随着深度学习的发展,研究人员提出了很多模型,这其中一些设计方式,在当时取得了很好的效果,也为其他科研工作者提供了很好的思路。CNN 的经典结构始于1998年的LeNet-5,成于2012年历史性的AlexNet,从此广泛用于图像相关领域,主要包括: 5 | 6 | 1.LeNet-5, 1998年 7 | 8 | 2.AlexNet, 2012年 9 | 10 | 3.ZF-Net, 2013年 11 | 12 | 4.GoogleNet, 2014年 13 | 14 | 5.VGG, 2014年 15 | 16 | 6.ResNet, 2015年 17 | 18 | 经过科研工作者的反复验证及广泛使用,这些模型逐渐成为经典,我们这里收集了一些常用的模型进行介绍。 19 | 20 | 21 | ### 1. VGG 22 | 23 | [论文地址](https://arxiv.org/abs/1409.1556) 24 | 25 | VGGNet是牛津大学计算机视觉组(Visual Geometry Group)和 Google DeepMind 公司的研究员一起研发的的深度卷积神经网络。VGGNet 探索了卷积神经网络的深度与其性能之间的关系,一共有六种不同的网络结构,但是每种结构都有含有5组卷积,每组卷积都使用3x3的卷积核,每组卷积后进行一个2x2最大池化,接下来是三个全连接层。在训练高级别的网络时,可以先训练低级别的网络,用前者获得的权重初始化高级别的网络,可以加速网络的收敛。VGGNet 相比之前state-of-the-art的网络结构,错误率大幅下降,并取得了ILSVRC 2014比赛分类项目的第2名和定位项目的第1名。同时VGGNet的拓展性很强,迁移到其他图片数据上的泛化性非常好。VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3*3)和最大池化尺寸(2*2)。 26 | 到目前为止,VGGNet依然经常被用来提取图像特征。 27 | 28 | [经典卷积神经网络之VGGNet](https://blog.csdn.net/marsjhao/article/details/72955935) 29 | 30 | [VGG模型核心拆解](https://blog.csdn.net/qq_40027052/article/details/79015827) 31 | 32 | ### 2. GoogLeNet 33 | 34 | [[v1] Going Deeper with Convolutions](http://arxiv.org/abs/1409.4842 ) 35 | 36 | [[v2] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift](http://arxiv.org/abs/1502.03167 ) 37 | 38 | [[v3] Rethinking the Inception Architecture for Computer Vision](http://arxiv.org/abs/1512.00567) 39 | 40 | [[v4] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning](http://arxiv.org/abs/1602.07261) 41 | 42 | 43 | GoogLeNet的最早版本,出现在2014年的" Going deeper with convolutions "。之所以名为 "GoogLeNet" 而非 "GoogleNet" ,文章说是为了向早期的LeNet致敬。GoogleNet提出了一个全新的深度 CNN 架构——Inception,无全连接层,可以节省运算的同时,减少了很多参数,参数数量是AlexNet的1/12,数量只有5 million,而且在ImageNet竞赛中取得了很好的成绩。 44 | 45 | [GoogleNet系列论文学习](https://blog.csdn.net/cdknight_happy/article/details/79247280) 46 | 47 | 48 | ### 3. Resnet 49 | 50 | [论文地址](https://arxiv.org/abs/1512.03385) 51 | 52 | ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它 "简单与实用" 并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域都纷纷使用ResNet,具有很强的适应性。ResNet的作者[何凯明](http://kaiminghe.com/)也因此摘得CVPR2016最佳论文奖。 53 | 54 | [ResNet解析](https://blog.csdn.net/lanran2/article/details/79057994) 55 | 56 | [ResNet学习](https://blog.csdn.net/xxy0118/article/details/78324256) 57 | 58 | 59 | ### 4. MobileNet-V1 & MobileNet -V2 60 | 61 | [V1论文地址](https://arxiv.org/abs/1704.04861) 62 | 63 | [V2论文地址](https://arxiv.org/abs/1801.04381) 64 | 65 | MobileNet是Google团队针对移动端提出的高效图像识别网络,深入的研究了Depthwise Separable Convolutions使用方法后设计出MobileNet,Depthwise Separable Convolutions的本质是冗余信息更少的稀疏化表达。在此基础上给出了高效模型设计的两个选择:宽度因子(Width Multiplier)和分辨率因子(Resolution Multiplier);通过权衡大小、延迟时间以及精度,来构建规模更小、速度更快的MobileNet。 66 | 67 | MobileNet V2是之前MobileNet V1的改进版。MobileNet V1中主要是引入了Depthwise Separable Convolution代替传统的卷积操作,相当于实现了spatial和channel之间的解耦,达到模型加速的目的,整体网络结构还是延续了VGG网络直上直下的特点。和MobileNet V1相比,MobileNet V2主要的改进有两点:1、Linear Bottlenecks。也就是去掉了小维度输出层后面的非线性激活层,目的是为了保证模型的表达能力。2、Inverted Residual block。该结构和传统residual block中维度先缩减再扩增正好相反,因此shotcut也就变成了连接的是维度缩减后的feature map。 68 | 69 | [深度解读谷歌MobileNet](https://blog.csdn.net/t800ghb/article/details/78879612) 70 | 71 | [轻量化网络:MobileNet-V2](https://blog.csdn.net/u011995719/article/details/79135818) 72 | 73 | ### 5. U-NET 74 | 75 | [论文地址](http://arxiv.org/abs/1505.04597) 76 | 77 | [项目地址](https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/) 78 | 79 | 这是Encoder-Decoder网络的一种,在无监督学习中的框架,利用conv与deconv降维升维来进行学习,分别叫做encoder与decoder编码解码,一般基于卷积网络,encoder后相当于学习到了特征,而decoder后相当于还原了图像,既可以用输入图像进行训练,训练好一层加深一层。再可以利用有监督微调,从而达到分类或者图像转换的目的。 80 | 81 | ### 6. GAN 82 | 83 | 总结:利用两个网络对抗生成模型,生成器与辨别器,生成器输入图像,生成所需图像,辨别器辨别所需图像与生成图像,使生成器的生成图像骗过辨别器。 84 | 85 | 86 | ### 7.DenseNet 87 | 88 | CVPR17 的Best Paper,模型体积小,准确率高。我们利用densenet + ctc进行进行OCR文字识别训练,效果不错。比基于resnet、vgg等基础网络的ocr效果好。 89 | -------------------------------------------------------------------------------- /2.基础网络/VGG.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xindongzhang/HyperDL-Tutorial/a2c385a643ed6485371000a8b678941950e540e2/2.基础网络/VGG.pdf -------------------------------------------------------------------------------- /3.神经网络的优化/README.md: -------------------------------------------------------------------------------- 1 | ### 神经网络的优化 2 | 3 | 网络的优化分为几个方面:包括网络准确率的优化、网络速度的优化、模型大小的优化,有些时候我们最求其中的某一方面,有些时候我们需要综合考虑 4 | 各个方面,选取一个适合自己的方案。我们这里引用几个讲解详细的博客,加入我们自己的实际经验,记录一下我们在模型优化方面一些理解。 5 | 6 | ### 参考文献 7 | 8 | [1] https://zhuanlan.zhihu.com/p/55846103 9 | 10 | [2] https://github.com/Ewenwan/MVision/blob/master/CNN/Deep_Compression/readme.md 11 | 12 | #### 1.准确率的优化 13 | 14 | 主要优化方法有:数据增强(Data Augmentation),权重初始化(weight initialization),随机梯度下降法(Stochastic Gradient descent),批规范化(Batch normalization) ,Dropout 等。 15 | 16 | 简单的思想,我们可以采用高准确率的模型,例如任务准确率在VGG16上不高,那我们可以采用Resnet50,densenet121等。这是一个再简单不过的做法,但是在特定模型下,针对具体任务,同样具有很多的优化方式。 17 | 18 | 模型合适的初始化参数设置,当我们从0开始训练一个模型的时候,选择合适的初始化参数方式,对后续的准确率具有一定影响,这个可以根据实验、经验测试选择。 19 | 20 | 加载预训练模型,例如我们在做OCR的时候,直接进行CTC文字识别,很多时候得到的准确率不高,但是如果我们采用imagenet预训练好的模型,进行文字识别的训练,往往效果会得到提升。 21 | 22 | 合适的学习率,通常训练我们初始学习率较大,然后逐渐降低学习率,防止过拟合,但是在有些模型下,并不完全这样操作。例如在Mnasnet的训练下,初始学习率从0到0.25做一个warming up,然后继续训练降低学习率。 23 | 24 | 不同框架也具有一定差异,例如resnet50,利用mxnet结合mixup,能够做到79%以上的准确率。所以大家在训练自己的模型的时候,要综合考虑多个方面,进行模型的优化。 25 | 26 | #### 2.网络速度的优化 27 | 28 | 模型速度优化,我们这里只讨论前向计算的速度。在模型不变的情况下,需要对前向计算框架进行优化,包括利用SIMD、NEON等指令集加速,特殊的计算方式,如winnograd 卷积计算方式等。 29 | 30 | 在网络设计上,可以考虑高效的计算模型,如mobilenetv1/v2,shufflenetv1/v2,mnasnet等。这些网络中高效计算的block单元是我们值得参考借鉴的地方。这种网络在设计之初,就考虑了速度与准确率的平衡,这是高效网络设计的很有效的方式。 31 | 32 | 另外可以考虑采用剪枝,量化等方式,参考链接: 33 | 34 | #### 3.模型大小的优化 35 | 36 | 模型压缩的主要分为在设计之初的模型优化,以及针对已有模型的压缩。 37 | -------------------------------------------------------------------------------- /3.神经网络的优化/opt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xindongzhang/HyperDL-Tutorial/a2c385a643ed6485371000a8b678941950e540e2/3.神经网络的优化/opt.png -------------------------------------------------------------------------------- /4.模型之间的转换/README.md: -------------------------------------------------------------------------------- 1 | ### 深度学习模型的转换 2 | 3 | 由于各种深度学习框架的层出不穷,我们在进行算法开发到算法部署的过程中,往往都需要用到不同的框架。例如我们很有可能使用tensorflow,pytorch等进行算法开发和调试,在早期工程inference的时候我们往往使用较为轻量的caffe或者魔改后的caffe。到了移动端部署我们可能会使用feather CNN nihui的NCNN或者小米的mace等框架。facebook ONNX的出现为模型的转换提供了一种思路,但除了pytorch等框架能很好的支持ONNX。其他等框架并未很好的对接ONNX。在[MMdnn](https://github.com/Microsoft/MMdnn)出现之前,大家都把caffemodel作为一个中间体来进行转换。 4 | 5 | 我们会逐步讲一下转换工具,包括MMdnn,keras2onnx,keras2caffe,tf2coreml,coreml2onnx,mxnet2caffe等。我们利用这些工具大多数用来转到onnx或者caffe,利于模型在移动端部署,无论转到ncnn,mace,都是比较方便的中间模型。 6 | 7 | 其实就模型转换而言只是个填参数的过程,把模型结构搭好,把参数填进去就即可,但是实践过的朋友大家一定会知道这其中存在不少坑,但是我们更希望有一种自动化的模型转换方案来进行模型转换。 8 | 9 | ### 1.MMdnn的使用 10 | 11 | [MMdnn](https://github.com/Microsoft/MMdnn)的出现为模型转换带来了不少的福音,[MMdnn](https://github.com/Microsoft/MMdnn)提供了一种IR(中间表示)来来衔接各个模型之间的转换。他囊括并支持了主流的DNN框架。 12 | 13 | 下面我就简要讲一下几个的简单模型转换 14 | 15 | 在此我推荐一个查看模型结构的工具[Netron](https://github.com/lutzroeder/Netron) 支持数种主流深度学习框架(Caffe,Tensorflow,ONNX等)的模型结构查看。 16 | 17 | 例如下图是MTCNN Pnet的模型结构图 18 | 19 | ![det1_](./det1_.png) 20 | 21 | 22 | 23 | #### MMdnn的安装 24 | 25 | [MMdnn](https://github.com/Microsoft/MMdnn)的安装非常简单 26 | 27 | ``` 28 | pip install mmdnn 29 | ``` 30 | 31 | #### 转换中的一些坑 32 | 33 | ##### 1.并不是所有Layer和所有网络都支持转换 34 | 35 | 由于各个深度学习框架之间的设计模式不同有的是基于命令式的有的是基于符号形式的。各个框架之间的op的粒度不同,又由于没有一个统一的标准,支持所有框架之间的转换是一件非常难的事情。MMdnn也只是把一些提供的常用的op,如conv,pooling等常规op。 36 | 37 | ##### 2.Tensorflow与caffe的padding方式并不相同 38 | 39 | 这个问题会出现在MobileNet在转换的过程中,因为Tensorflow的padding方式和其他框架是不同的。Tensorflow标准的卷积操作通常采用非对称的padding,而caffe等其他框架的卷积操作则是采用对称的padding。 40 | 41 | 如下图 ,比如当 卷积核的大小为3x3 stride为2的时候。尽管他们的padding方式不同,但卷积之后的尺寸确是一样的。 42 | 43 | ![img](https://github.com/Microsoft/MMdnn/wiki/image/mobilenet1.png) 44 | 45 | 46 | 47 | #### 转换步骤 48 | 49 | 例如现在我们想把MTCNN的Keras Pnet转化成caffeodel用于部署。 50 | 51 | ``` 52 | mmtoir -f keras -w pnet.h5 -o pnet 53 | ``` 54 | 55 | 把keras模型转化成MMdnn IR中间表示,在当然目录下会生成一个.npy 的weights文件和一个.pb文件。接着使用 56 | 57 | ``` 58 | mmtomodel -f caffe -in pnet -iw pnet.npy -o pnet 59 | ``` 60 | 61 | ### 2.keras2onnx 62 | 63 | ### 3.tf2coreml 64 | 65 | ### 4.mxnet2caffe 66 | 67 | ### 5.tf2ncnn 68 | 69 | ncnn作为开源中较为流行的移动端前向计算框架,我们在训练完模型后,需要将对应的模型转换的ncnn支持的模型,ncnn提供了onnx2ncnn,caffe2ncnn,tf2ncnn,等工具,在我们测试用,caffe2ncnn与onnx2ncnn支持较好,绝大多数模型都可以部署,但是很多时候使用者喜欢用keras或者tf作为训练框架,这时我们要做tf到ncnn的转换,特别是一些特殊层的处理,这里我们给出一些参考方式。 70 | 71 | 如果采用keras训练模型,可以先用keras2onnx将模型转到onnx,然后再利用ncnn提供的onnx2ncnn转化到ncnn的模型。 72 | 73 | 对于tf训练的模型,可以参考:https://github.com/Tencent/ncnn/issues/5#issuecomment-472258072 ,这种方式同样可以解决模型转换的问题。 74 | 75 | 模型转换的一些难点主要在dw卷积的转化,relu6的设置等。 76 | 77 | 78 | -------------------------------------------------------------------------------- /4.模型之间的转换/det1_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xindongzhang/HyperDL-Tutorial/a2c385a643ed6485371000a8b678941950e540e2/4.模型之间的转换/det1_.png -------------------------------------------------------------------------------- /5.模型的部署/README.md: -------------------------------------------------------------------------------- 1 | ### 一、常用移动端深度学习框架 2 | 3 | 深度学习发展很快,最近又出现了几个新的移动端前向框架,例如[Tengine](https://github.com/OAID/Tengine)和 [TVM](https://github.com/dmlc/tvm). 4 | 我们还没有对这两个框架进行深入研究,但是在对应的wiki中,可以看到这两个框架的速度对于现有框架都具有一定优势,通过短暂的了解,Tengine还是很不错的,支持op跟模型种类都比较丰富,还支持GPU运算。感兴趣的读者可以多了解一下。 5 | 6 | #### ---------------- 2018.12.07 分割线 ---------------- 7 | 8 | 各大公司开源了自己的移动端深度学习框架,其中包括TensorFlow Lite、Caffe2、MACE、paddle-mobile(MDL)、FeatherCNN、NCNN等。我们参考开源的测试结果,结合自己整理的数据,针对主流的移动端深度学习框架进行简单对比及介绍。 9 | 10 | 11 | | 框架 | 机构 | 支持平台 | Stars | Forks | 12 | | --------------------------------------------------------- | ----------- | -------------- | ---------- | ----- | 13 | | [Caffe2](https://github.com/caffe2/caffe2) | Facebook | ARM | 8270* | 2080* | 14 | | [TF_lite](https://github.com/tensorflow) | Google | ARM | * | * | 15 | | [MACE](https://github.com/XiaoMi/mace) | Xiaomi | ARM/DSP/GPU | 2442 | 412 | 16 | | [paddle-mobile](https://github.com/PaddlePaddle/paddle-mobile) | Baidu | ARM/GPU | 4038 | 774 | 17 | | [FeatherCNN](https://github.com/Tencent/FeatherCNN) | Tencent | ARM | 658 | 170 | 18 | | [NCNN](https://github.com/Tencent/ncnn) | Tencent | ARM | 4606 | 1163 | 19 | 20 | 21 | ### 二、性能对比 (截至2018.09) 22 | 23 | #### 1. NCNN / FeatherCNN / MACE 24 | 25 | **CPU:kryo&2.15GHz*2 (ms)** 26 | 27 | | 框架 | SqueezeNet_v1.1 | MobileNet_v1 | ResNet18 28 | | --------------- | :------------------: | :------------------: | :-----:| 29 | | NCNN | 47.64 | 68.71 | 142.28 | 30 | | FeatherCNN | 36.39 | 58.92 | 100.13 | 31 | | MACE | 42.37 | 65.18 | 160.7 | 32 | 33 | 34 | #### 2. paddle-mobile (MDL) 35 | 36 | **CPU:高通835 (ms)** 37 | 38 | | 框架 | squeezenet | mobilenet_v1 | googlenet_v1 39 | | ---------------- | :--------: | :----------: | :----------: | 40 | | 1 Thread | 82.41 | 105.43 | 341.25 | 41 | | 2 Threads | 56.17 | 62.75 | 233.35 | 42 | | 4 Threads | 36.45 | 37.13 | 158.55 | 43 | 44 | 45 | ### 三、框架评价 46 | 47 | | 框架 |集成成本| 库文件大小 | 模型支持程度 | 文档完整程度 | 速度 | 48 | | ------------------ | :----: | :-----: | :----: | :-----: | :----: | 49 | | caffe2 | 一般 | 良好 | 优秀 | 良好 | 一般 | 50 | | TF_Lite | 一般 | 良好 | 优秀 | 良好 | 优秀 | 51 | | MACE | 良好 | 优秀 | 良好 | 良好 | 优秀 | 52 | | MDL | 优秀 | 优秀 | 良好 | 良好 | 良好 | 53 | | FeatherCNN | 良好 | 优秀 | 良好 | 良好 | 优秀 | 54 | | NCNN | 优秀 | 优秀 | 良好 | 优秀 | 优秀 | 55 | 56 | 57 | ### 四、几款移动端深度学习框架分析 58 | 59 | 移动端的框架,基本不支持训练,只支持前向推理。 60 | 61 | 62 | #### 1.腾讯的FeatherCNN和ncnn 63 | 64 | 这两个框架都是腾讯出的,FeatherCNN来自腾讯AI平台部,ncnn来自腾讯优图。 65 | 66 | 重点是:都开源,都只支持CPU 67 | 68 | ncnn开源早点,文档、相关代码丰富一些,使用者相对多一些。FeatherCNN开源晚,底子很好,从测试结果看,速度具有微弱优势。 69 | 70 | 71 | #### 2.百度的 paddle-mobile(MDL) 72 | 73 | MDL可以支持CPU和GPU,FPGA在开发中。 74 | 75 | #### 3.小米的 MACE 76 | 77 | 它有几个特点:异构加速、汇编级优化、支持各种框架的模型转换。 78 | 79 | 小米支持的GPU不限于高通,这点很通用,很好,比如瑞芯微的RK3299就可以同时发挥出cpu和GPU的好处来。 80 | 81 | #### 4.其它 82 | 83 | 在移动端,caffe2、tensorflow lite都可以考虑,只是可能没有以上的框架效率高。 84 | 85 | 另外据说支付宝有xNN的深度框架,商汤有PPL框架,这两个都是企业自用没有开源。 86 | 87 | 国内杭州九言科技的开源方案,用的人不多,可以参考。 88 | 89 | #### 5.总结 90 | 91 | 上面的大部分框架都是主要面向android的,但是用于arm-Linux也是可以的。 92 | 93 | 现在越来越多的厂商开源移动端的深度学习框架,对于从业者是好事,有更多的选择,不用从头造轮子。 94 | 95 | 相信将来会有更多的技术手段用于移动端部署深度学习网络,包括模型压缩、异构加速、汇编优化等。 96 | 97 | 98 | ### 五、推荐框架 99 | 100 | 针对目前开源的移动端深度学习前向框架,结合我们使用、测试的结果,我们推荐以下几个框架。 101 | 102 | #### 1.NCNN 103 | 104 | 第一个高效使用的移动端开源库,支持模型丰富,更新快,文档逐渐完善,被大家采用较多,遇到坑相对少。 105 | 106 | #### 2.MACE 107 | 108 | 性能优秀,支持GPU,但是刚刚开源,可能会遇到一些开发问题。 109 | 110 | #### 3.MDL 111 | 112 | 百度出品,一定的品质保证,更新较快。 113 | 114 | ### 参考资料 115 | 116 | [移动端深度学习框架小结](https://blog.csdn.net/yuanlulu/article/details/80857211) 117 | 118 | [NCNN性能分析](https://www.zhihu.com/question/276372408) 119 | 120 | [NCNN性能对比](https://www.zhihu.com/question/263573053) 121 | 122 | [MACE、NCNN、FeatherCNN性能对比](https://www.zhihu.com/question/283022477/answer/430168888) 123 | -------------------------------------------------------------------------------- /5.模型的部署/在CPP下使用TVM来部署mxnet模型(以Insightface为例).md: -------------------------------------------------------------------------------- 1 | ### 在CPP下使用TVM来部署mxnet模型(以Insightface为例) 2 | 3 | 自从AI被炒作以来,各个深度学习框架层出不穷。我们通常来讲,作为AI从业者,我们通常经历着标注-训练-部署的过程。其中部署是较为痛苦的工作,尤其是在跨平台如(移动端需要native对接的时候。)当然用于inference框架同样也是层出不穷。但是大多数框架框架往往性能都一般,或者缺少相关op,或者就是转换模型较为困难。TVM的出现很大程度上为模型部署带来了福音。 4 | 5 | 但是网上将用于TVM部署的教程还比较少,尤其是通过cpp和移动端部署。本文以Insightface Model Zoo中的MobileFaceNet为例,介绍一下如何编译Mxnet模型、在python下inference、在cpp下inference、对比人脸余弦距离、以及在android下的部署。 6 | 7 | ### 安装 8 | 9 | TVM编译环境的安装需要LLVM编译器,可以简要遵循官方的教程。 [official installation tutorial](https://docs.tvm.ai/install/from_source.html#build-the-shared-library). 10 | 11 | LLVM 7.0 可能会导致编译错误,推荐使用LLVM 6.0.1 12 | 13 | #### 编译模型 14 | 15 | TVM使用了一系列的优化措施来优化计算图,当模型编译完之后会生成若干个编译好的文件。在编译前要指定预编译的平台、架构、指令集等参数。 16 | 17 | ```python 18 | import numpy as np 19 | import nnvm.compiler 20 | import nnvm.testing 21 | import tvm 22 | from tvm.contrib import graph_runtime 23 | import mxnet as mx 24 | from mxnet import ndarray as nd 25 | 26 | prefix,epoch = "emore1",0 27 | sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, epoch) 28 | image_size = (112, 112) 29 | opt_level = 3 30 | 31 | shape_dict = {'data': (1, 3, *image_size)} 32 | target = tvm.target.create("llvm -mcpu=haswell") 33 | # "target" means your target platform you want to compile. 34 | 35 | #target = tvm.target.create("llvm -mcpu=broadwell") 36 | nnvm_sym, nnvm_params = nnvm.frontend.from_mxnet(sym, arg_params, aux_params) 37 | with nnvm.compiler.build_config(opt_level=opt_level): 38 | graph, lib, params = nnvm.compiler.build(nnvm_sym, target, shape_dict, params=nnvm_params) 39 | lib.export_library("./deploy_lib.so") 40 | print('lib export succeefully') 41 | with open("./deploy_graph.json", "w") as fo: 42 | fo.write(graph.json()) 43 | with open("./deploy_param.params", "wb") as fo: 44 | fo.write(nnvm.compiler.save_param_dict(params)) 45 | ``` 46 | 47 | 运行该代码后会生成三个文件分别为deploy_lib.so 、deploy_graph.json 、deploy_param.params 。其中deploy_lib.so 为编译好的动态库,deploy_graph.json为部署使用的计算图、deploy_param.params为模型参数。 48 | 49 | #### 使用TVM Python Runtime 进行简单的测试 50 | 51 | TVM的Runtime(运行时)并不需要任何依赖,直接clone tvm后 make runtime.即可。 52 | 53 | ```python 54 | import numpy as np 55 | import nnvm.compiler 56 | import nnvm.testing 57 | import tvm 58 | from tvm.contrib import graph_runtime 59 | import mxnet as mx 60 | from mxnet import ndarray as nd 61 | 62 | ctx = tvm.cpu() 63 | # load the module back. 64 | loaded_json = open("./deploy_graph.json").read() 65 | loaded_lib = tvm.module.load("./deploy_lib.so") 66 | loaded_params = bytearray(open("./deploy_param.params", "rb").read()) 67 | 68 | input_data = tvm.nd.array(np.random.uniform(size=data_shape).astype("float32")) 69 | 70 | module = graph_runtime.create(loaded_json, loaded_lib, ctx) 71 | module.load_params(loaded_params) 72 | 73 | # Tiny benchmark test. 74 | import time 75 | for i in range(100): 76 | t0 = time.time() 77 | module.run(data=input_data) 78 | print(time.time() - t0) 79 | ``` 80 | 81 | #### 使用C++来推理MobileFaceNet人脸识别模型 82 | 83 | 在C++下 TVM Runtime(运行时)仅仅需要编译时输出的so文件,包含 “tvm_runtime_pack.cc” 。runtime的体积也比较小,只有几百K。 84 | 85 | 下列的CPP代码包含了通过输入一张对齐后的人脸识别照片,输出归一化的之后的人脸向量。 86 | 87 | ```cpp 88 | #include 89 | #include 90 | #include 91 | #include 92 | #include 93 | 94 | class FR_MFN_Deploy{ 95 | 96 | private: 97 | void * handle; 98 | 99 | public: 100 | FR_MFN_Deploy(std::string modelFolder) 101 | { 102 | 103 | tvm::runtime::Module mod_syslib = tvm::runtime::Module::LoadFromFile(modelFolder + "/deploy_lib.so"); 104 | //load graph 105 | std::ifstream json_in(modelFolder + "/deploy_graph.json"); 106 | std::string json_data((std::istreambuf_iterator(json_in)), std::istreambuf_iterator()); 107 | json_in.close(); 108 | 109 | int device_type = kDLCPU; 110 | int device_id = 0; 111 | // get global function module for graph runtime 112 | tvm::runtime::Module mod = (*tvm::runtime::Registry::Get("tvm.graph_runtime.create"))(json_data, mod_syslib, device_type, device_id); 113 | this->handle = new tvm::runtime::Module(mod); 114 | 115 | //load param 116 | std::ifstream params_in(modelFolder + "/deploy_param.params", std::ios::binary); 117 | std::string params_data((std::istreambuf_iterator(params_in)), std::istreambuf_iterator()); 118 | params_in.close(); 119 | 120 | TVMByteArray params_arr; 121 | params_arr.data = params_data.c_str(); 122 | params_arr.size = params_data.length(); 123 | tvm::runtime::PackedFunc load_params = mod.GetFunction("load_params"); 124 | load_params(params_arr); 125 | } 126 | 127 | cv::Mat forward(cv::Mat inputImageAligned) 128 | { 129 | //mobilefacnet preprocess has been written in graph. 130 | cv::Mat tensor = cv::dnn::blobFromImage(inputImageAligned,1.0,cv::Size(112,112),cv::Scalar(0,0,0),true); 131 | //convert uint8 to float32 and convert to RGB via opencv dnn function 132 | DLTensor* input; 133 | constexpr int dtype_code = kDLFloat; 134 | constexpr int dtype_bits = 32; 135 | constexpr int dtype_lanes = 1; 136 | constexpr int device_type = kDLCPU; 137 | constexpr int device_id = 0; 138 | constexpr int in_ndim = 4; 139 | const int64_t in_shape[in_ndim] = {1, 3, 112, 112}; 140 | TVMArrayAlloc(in_shape, in_ndim, dtype_code, dtype_bits, dtype_lanes, device_type, device_id, &input);// 141 | TVMArrayCopyFromBytes(input,tensor.data,112*3*112*4); 142 | tvm::runtime::Module* mod = (tvm::runtime::Module*)handle; 143 | tvm::runtime::PackedFunc set_input = mod->GetFunction("set_input"); 144 | set_input("data", input); 145 | tvm::runtime::PackedFunc run = mod->GetFunction("run"); 146 | run(); 147 | tvm::runtime::PackedFunc get_output = mod->GetFunction("get_output"); 148 | tvm::runtime::NDArray res = get_output(0); 149 | cv::Mat vector(128,1,CV_32F); 150 | memcpy(vector.data,res->data,128*4); 151 | cv::Mat _l2; 152 | // normlize 153 | cv::multiply(vector,vector,_l2); 154 | float l2 = cv::sqrt(cv::sum(_l2).val[0]); 155 | vector = vector / l2; 156 | TVMArrayFree(input); 157 | return vector; 158 | } 159 | 160 | }; 161 | ``` 162 | 163 | 我们可以通过输入两张对齐后的人脸照片来提取人脸向量。 164 | 165 | ```cpp 166 | cv::Mat A = cv::imread("/Users/yujinke/Desktop/align_id/aligned/20171231115821836_face.jpg"); 167 | cv::Mat B = cv::imread("/Users/yujinke/Desktop/align_id/aligned/20171231115821836_idcard.jpg"); 168 | FR_MFN_Deploy deploy("./models"); 169 | cv::Mat v2 = deploy.forward(B); 170 | cv::Mat v1 = deploy.forward(A); 171 | ``` 172 | 173 | 测量余弦相似度 174 | 175 | ```cpp 176 | inline float CosineDistance(const cv::Mat &v1,const cv::Mat &v2){ 177 | return static_cast(v1.dot(v2)); 178 | } 179 | std::cout<2、不是关于原点对称
3、计算exp比较耗时 | - | 111 | | Tanh | tanh(x)=2σ(2x)−1 | 梯度弥散没解决 | 1、解决了原点对称问题
2、比sigmoid更快 | 112 | | ReLU | f(x)=max(0,x) | 梯度弥散没完全解决 | 1、解决了部分梯度弥散问题
2、收敛速度更快 | 113 | | Leaky ReLU | f(x)=αx(x<=0) α固定
f(x)=x(x<0) | - | 解决了神经死亡问题 | 114 | | pRelu | f(x)=αx(x<=0) α可学习
f(x)=x(x<0) | 增加了极少量的参数,
降低过拟合风险 | - | 115 | | Maxout | max(wT1x+b1,wT2x+b2) | 参数比较多,本质上是在输出结果上又增加了一层 | 克服了ReLU的缺点,比较提倡使用 | 116 | 117 | 118 | 119 | ##### 15.1x1卷积的作用 120 | 121 | 1. 实现跨通道的信息交互和整合。1x1卷积核只有一个参数,当它作用在多通道的feature map上时,相当于不同通道上的一个线性组合, 122 | 实际上就是加起来再乘以一个系数,但是这样输出的feature map就是多个通道的整合信息了,能够使网络提取的特征更加丰富。 123 | 2. feature map通道数上的降维。降维这个作用在GoogLeNet和ResNet能够很好的体现。举个例子:假设输入的特征维度为100x100x128, 124 | 卷积核大小为5x5(stride=1,padding=2),通道数为256,则经过卷积后输出的特征维度为100x100x256,卷积参数量为 125 | 128x5x5x256=819200。此时在5x5卷积前使用一个64通道的1x1卷积,最终的输出特征维度依然是100x100x256,但是此时的卷积参数 126 | 量为128x1x1x64 + 64x5x5x256=417792,大约减少一半的参数量。 127 | 3. 增加非线性映射次数。1x1卷积后通常加一个非线性激活函数,使网络提取更加具有判别信息的特征,同时网络也能做的越来越深。 128 | 129 | ##### 16.无监督学习方法有哪些 130 | 131 | 强化学习、K-means 聚类、自编码、受限波尔兹曼机 132 | 133 | ##### 17.增大感受野的方法? 134 | 135 | 空洞卷积、池化操作、较大卷积核尺寸的卷积操作 136 | 137 | ##### 18.目标检测领域的常见算法? 138 | 139 | 1.两阶段检测器:R-CNN、Fast R-CNN、Faster R-CNN 140 | 2.单阶段检测器:YOLO、YOLO9000、SSD、DSSD、RetinaNet 141 | 142 | ##### 19.回归问题的评价指标 143 | 144 | 1.平均绝对值误差(MAE) 145 | 2.均方差(MSE) 146 | 147 | ##### 20.卷积层和全连接层的区别 148 | 149 | 1.卷积层是局部连接,所以提取的是局部信息;全连接层是全局连接,所以提取的是全局信息; 150 | 2.当卷积层的局部连接是全局连接时,全连接层是卷积层的特例; 151 | 152 | ##### 21.反卷积的棋盘效应及解决方案 153 | 154 | 图像生成网络的上采样部分通常用反卷积网络,不合理的卷积核大小和步长会使反卷积操作产生棋盘效应 155 | 156 | 解决方案: 157 | 158 | 159 | ##### 22.分类的预训练模型如何应用到语义分割上 160 | 161 | 1.参考论文: Fully Convolutional Networks for Semantic Segmentation 162 | 163 | ##### 23.SSD和YOLO的区别 164 | 165 | 166 | ##### 24.交叉熵和softmax,还有它的BP 167 | 168 | 169 | #### 实践部分 170 | 171 | 172 | 1.python中range和xrange有什么不同 173 | 174 | 两者的区别是xrange返回的是一个可迭代的对象;range返回的则是一个列表,同时效率更高,更快。 175 | 176 | 2.python中带类和main函数的程序执行顺序 177 | 178 | 1)对于  if __name__ == '__main__': 的解释相关博客已经给出了说明,意思就是当此文件当做模块被调用时,不会从这里执行, 179 | 因为此时name属性就成了模块的名字,而不是main。当此文件当做单独执行的程序运行时,就会从main开始执行。 180 | 181 | 2)对于带有类的程序,会先执行类及类内函数,或者其他类外函数。这里可以总结为,对于没有缩进的程序段,按照顺序执行。然后,才 182 | 到main函数。然后才按照main内函数的执行顺序执行。如果main内对类进行了实例化,那么执行到此处时,只会对类内成员进行初始 183 | 化,然后再返回到main 函数中。 执行其他实例化之后对象的成员函数调用。 184 | 185 | 3.神经网络的参数量计算 186 | 187 | 4.计算空洞卷积的感受野 188 | 189 | 5.mAP的计算 190 | 191 | 6.Python tuple和list的区别 192 | 193 | 7.Python的多线程和多进程,Python伪多线程,什么时候应该用它 194 | 195 | 8.tensorflow while_loop和python for循环的区别,什么情况下for更优? 196 | 197 | while loop的循环次数不确定的情况下效率低,因为要不断重新建图 198 | 199 | #### 参考文献 200 | 201 | [1] https://blog.csdn.net/u014722627/article/details/77938703 202 | 203 | [2] https://www.cnblogs.com/houjun/p/8535471.html 204 | 205 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HyperDL-Tutorial 2 | 3 | > HyperDL-Tutorial 是一个深度学习相关的系列文章,总结了我们在深度学习实践中的一些经验。 4 | 5 | # 目录 6 | 7 | 1. [常见深度学习框架](1.常见深度学习框架/README.md) 8 | 2. [基础网络](2.基础网络/README.md) 9 | 3. [神经网络的优化](3.神经网络的优化/README.md) 10 | 4. [模型之间的转换](4.模型之间的转换/README.md) 11 | 5. [适用于移动端的框架](5.适用于移动端的框架/README.md) 12 | 6. [神经网络的设计](6.神经网络的设计/README.md) 13 | 7. [神经网络的适用场景](7.神经网络的适用场景/README.md) 14 | 8. [基础网络的训练](8.基础网络的训练/README.md) 15 | 9. [相关面试题](9.相关面试题/README.md) 16 | 10. [对抗蒸馏](10.对抗蒸馏/README.md) 17 | 18 | 19 | > 教程在逐渐完善中,感兴趣的同学可以给我们提一些意见,如果文中理解有误或者表述不当,也欢迎指出。 20 | 21 | > 欢迎大家转载,请标明出处,谢谢大家。 22 | 23 | > 如果你也愿意分享自己的技术心得,欢迎加我们的交流群 QQ:737677707, 备注:HyperDL 24 | --------------------------------------------------------------------------------