zoukankan      html  css  js  c++  java
  • 深度学习论文翻译解析(十九):Searching for MobileNetV3

    论文标题:Searching for MobileNetV3

    论文作者:Andrew Howard, Mark Sandler, Grace Chu, Liang-Chieh Chen, Bo Chen, Mingxing Tan, Weijun Wang, Yukun Zhu, Ruoming Pang, Vijay Vasudevan, Quoc V. Le, Hartwig Adam

    论文地址:https://arxiv.org/abs/1905.02244.pdf

    参考的 MobileNets 翻译博客:https://blog.csdn.net/Chunfengyanyulove/article/details/91358187(https://blog.csdn.net/thisiszdy/article/details/90167304)

    声明:小编翻译论文仅为学习,如有侵权请联系小编删除博文,谢谢!           

      小编是一个机器学习初学者,打算认真研究论文,但是英文水平有限,所以论文翻译中用到了Google,并自己逐句检查过,但还是会有显得晦涩的地方,如有语法/专业名词翻译错误,还请见谅,并欢迎及时指出。

    如果需要小编其他论文翻译,请移步小编的GitHub地址

      传送门:请点击我

      如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote

      MobileNet V3 相关技术如下:

    • 1,用 MnasNet 搜索网络结构
    • 2,用 V1 的深度可分离
    • 3,用 V2 的倒置残差线性瓶颈结构
    • 4,引入 SE模块
    • 5,新的激活函数 h-swish(x)
    • 6,网络搜索中利用两个策略:资源受限的 NAS 和 NetAdapt
    • 7,修改 V2 最后部分减小计算

      个人感觉没有V1,V2 那么惊艳(没有革命性的东西),但是确实是对V2 各部分进行优化,结合了最新的东西,引入了新的激活函数,堆了一堆trick 来提速。

    1,摘要

      我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互补的方法来提高整体水平。通过这个过程,我们创建了两个新的发布的 mobileNet模型:MobileNetV3-Large 和 MobileNetV3-Small,他们针对高资源和低资源用例。然后将这些模型应用于目标检测和语义分割。针对语义分割(或任何密集像素预测)任务,我们提出了一种新的高效分割解码器 Lite reduce Atrous Spatial Pyramid Pooling(LR-ASPP)。我们实现了移动分类,检测和分割的最新技术成果。与 MobileNetV2 相比,MobileNetV3-Large 在 ImageNet 分类上的准确率提高了 3.2%,同时延迟降低了 20%。与 MobileNetV2 相比,MobileNetV3-small 的准确率高 6.6%,同时延迟降低了 5%。与 MobileNetV3-Large 检测速度比 MobileNetV2 快 25%,在COCO检测上的精度大致相等。MobileNetV3-Large  LR-ASPP 的速度比 MobileNetV2 R-ASPP 快 30%,在城市景观分割,MobileNetV3-Large LR-ASPP 比  MobileNet V2 R-ASPP 快  34%。

      图1,Pixel 1 延迟与 top-1 ImageNet 准确性之间的权衡。所有模型均使用输入分辨率 224。大V3和小V3使用乘数 0.75,1和1.25显示最佳边界。所有延迟都是使用 TFLite【1】在同一设备的单个大内核上测量的。MobileNetV3-Small和 Large是我们建议的下一代移动模型。

      图2:MAdds 和 top-1 精度之间的衡量。这允许比较针对不同硬件或软件框架的模型。所有 MobileNet V3 的输入分辨率均为 224,并使用乘数 0.35, 0.5, 0.75, 1 和 1.25 。有关其他分辨率,请参考第6节。彩色效果最佳。

    1,简介

      高效的神经网络在移动应用程序中变得无处不在,从而实现全新的设备上的体验。他们也是个人隐私的关键推动者,允许用户获得神经网络的好处,而不需要将数据发送到服务器进行评估。神经网络效率的提升不仅通过更高的精度和更低的延迟来改善用户体验,还通过降低功率损耗来帮助保持电池寿命。

      本文描述了我们开发 MobilenetV3 大型和小型模型的方法,以提供下一代高精度高效的神经网络模型来驱动设备上的计算机视觉。新的网络推动了最新技术的发展,并展示了如何将自动化搜索与新的体系结构进步结合起来,以构建有效的模型。

      本文的目标是开发最佳的移动计算机视觉架构,以优化移动设备上的精确延迟交换。为了实现这一点,我们引入了(1)互补搜索技术,(2)适用于移动设备的非线性的新高效版本,(3)新的高效网络设计,(4)一个新的高效分割解码器。我们提供了深入的实验,以证明每种技术在广泛的用例和移动电话上评估的有效性和价值。

      论文组织如下。我们从第二节中有关工作的讨论开始。第三节回顾了用于移动模型的高效构建块。第四节回顾了体系结构搜索以及 MnasNet 和 NetAdapt 算法的互补性。第五节描述了通过联合搜索提高模型效率的新型架构设计。第六节介绍了大量的分类,检测和分割实验,以证明有效性和理解不同元素的贡献。第七节载有结论和今后的工作。

    2,相关工作

      设计深度神经网络结构来实现精度和效率之间的最优平衡是近年来一个活跃的研究领域。无论是新颖的手工结构还是算法神经结构搜索,都在这一领域发挥了重要作用。

      SqueezeNet【22】广泛使用带有挤压和扩展模块的1*1 卷积,主要集中于减少参数的数量。最近的工作将关注点从减少参数转移到减少操作的数量(MAdds)和实际测量的延迟。MobileNetV1【19】采用深度可分离卷积,大大提高了计算效率。MobileNetV2【39】在此基础上进行了扩展,引入了一个具有反向残差和线性瓶颈的资源高效块。ShuffleNet【49】利用组卷积和信道洗牌操作进一步减少 MAdds。冷凝集【21】在训练阶段学习组卷积,以保持层与层之间有用的紧密连接,以便功能重用。ShiftNet【46】提出了与点向卷积交织的移位操作,以取代昂贵的空间卷积。

      为了使体系结构设计过程自动化,首先引入了强化学习(RL)来搜索具有竞争力的精度的高效体系结构【53, 54, 3, 27, 35】。一个完全可配置的搜索空间可能会以指数级增长且难以处理。因此,早期的架构搜索工作主要关注单元级结构搜索,并且在所有层中重用相同的单元。最近,【43】探索了一个块级分层搜索空间,允许在网络的不同分辨率块上使用不同的层结构。为了降低搜索的计算成本,在【28, 5, 45】中使用了可微架构搜索框架,并进行了基于梯度的优化。针对现有网络适应受限移动平台的问题,【48, 15, 12】提出了更高效的自动化网络简化算法。

      量化【23, 25, 37, 41, 51, 52, 37】是另外一个重要的补充努力,以提高网络效率通过降低精度的算法。最后,知识蒸馏【4, 17】提供了一种附加的补充方法,在大型“教师”网络的指导下生成精确的小型“学生”网络。

      将上述翻译总结一下,即目前常用的一些减少网络计算量的方法

    • 基于轻量化网络设计:比如 MobileNet 系列,ShuffleNet系列,Xception等,使用Group卷积,1*1 卷积等技术减少网络计算量的同时,尽可能的保证网络的精度。
    • 模型剪枝:大网络往往存在一定的冗余,通过减去冗余部分,减少网络计算量。
    • 量化:利用 TensorRT 量化,一般在 GPU 上可以提速几倍
    • 知识蒸馏:利用大模型(teacher model)来帮助小模型(student model)学习,提高 student modelde 精度。

      mobileNet系列当然是典型的第一种方法。

    3,高效的移动建筑块

      移动模式已经建立在越来越高效的基础之上。MobileNetV1【17】引入深度可分离卷积作为传统卷积层的有效替代。深度可分离卷积通过将空间滤波与特征生成机制分离,有效的分解了传统卷积。深度可分离卷积由两个独立的层定义:用于空间滤波的轻量级深度卷积和用于特征生成的较重的1*1点卷积。

      MobileNetV2【37】引入了线性瓶颈和反向残差结构,以便利用问题的低秩性质使层结构更加有效。这个结构如图3所示,由1*1 展开卷积,深度卷积和1*1 投影层定义。当且仅当他们具有相同数量的通道时,输入和输出才通过剩余连接进行连接。这种结构在输入和输出处保持了紧凑的表示,同时在内部扩展到高维特征空间,以便增加非线性每个通道转换的表达能力。

      MnasNet 建立在 MobileNetV2 结构上,通过在瓶颈结构中引入基于挤压和激励的轻量级注意模块。注意:与【20】中提出的基于 ResNet 的模块相比,挤压和激励模块集成在不同的位置。模块位于展开中的深度过滤器之后,以便注意应用于最大的表示,如图4所示。

      对于MobileNet V3,我们使用这些层的组合作为构建块,以便构建最有效的模型。层也升级与修改的 swish 非线性【34】。挤压和激励以及 swish 非线性都使用了 Sigmoid,它的计算效率很低,而且很难在定点算法中保持精度,因此我们将其替换为硬 Sigmoid,如5.2 节所讨论的。

    4,网络搜索

      网络搜索已被证明是发现和优化网络架构的一个非常强大的工具。对于MobilenetV3,我们使用平台感知的 NAS 通过优化每个网络块来搜索全局网络结构。然后,我们使用 NetAdapt 算法搜索每个层的过滤器数量。这些技术是互补的,可以结合起来为给定的硬件平台有效的找到优化模型。

    4.1  使用NAS感知平台进行逐块(Blockwise)搜索

      与【43】类似,我们采用平台感知神经结构方法来寻找全局网络结构。由于我们使用相同的基于RNN的控制器和相同的分解层次搜索空间,所以对目标延迟在 80ms 左右的大型移动模型,我们发现了与【43】类似的结果。因此,我们只需重用与初始大型移动模型相同的 MnasNet-A1【43】,然后在其上应用 NetAdapt【48】和其他优化。

       然而,我们发现原始的奖励设计并没有针对小型手机模型进行优化。具体来说,它使用一个多目标奖励 ACC(m)*[LAT(m)/TAR]w 来近似 pareto 最优解,根据目标延迟 TAR 为每个模型 m 平衡模型精度 ACC(m) 和延迟 LAT(m) 。我们观察到精度变化更显著延迟小模型,因此,我们需要一个较小的重量系数 w=0.15(vs 原始 w=-0.07)来弥补大精度变化不同的延迟。在新的权重因子 w 的增强下,我们从头开始一个新的架构搜索,以找到初始的 seed 模型,然后应用 NetAdapt 和其他优化来获得最终的 MobileNetV3-Small模型。

    4.2  使用NetAdapt 进行 Layerwise 搜索

       我们在架构搜索中使用的第二种技术是 NetAdapt【48】。这种方法是对平台感知 NAS 的补充:它允许以顺序的方式对单个层进行微调,而不是试图推断出粗糙但全局的体系结构。详细请参阅原文。简而言之,这项技术的进展如下:

      1,从平台感知 NAS 发现的种子网络体系结构开始。

      2,对于每一个步骤:

        (a) 提出一套新的建议。每个提议都表示对体系结构的修改,与前一步相比,该体系结构至少可以减少延迟。

        (b)对于每一个提议,我们使用前一个步骤的预先训练的模型,并填充新提出的架构,适当地截断和随机初始化缺失的权重。对于 T 步的每个建议进行微调,以获得对精度的粗略估计。

        (c)根据某种标准选择最佳建议

      3,重复前面的步骤,直到达到目标延迟。

      在【48】中,度量是为了最小化精度的变化。我们修改了这个算法,使延迟变化和精度变化的比例最小化。也就是说,对于每个 NetAdapt 步骤中生成的所有建议,我们选择一个最大化的建议: ACC/latency。延迟满足2(a)中的约束。直觉告诉我们,由于我们的建议是离散的,所以我们更喜欢最大化权衡曲线斜率的建议。

      这个过程重复进行,直到延迟达到目标,然后从头开始重新培训新的体系结构。我们使用与在【46】中为 MobileNetV2 相同的提案生成器。具体来说,我们允许以下两种建议:

      1,减少任何扩展层的尺寸

      2,减少共享相同瓶颈大小的所有块中的瓶颈——以维护剩余连接

      在我们的实验中,我们使用 T=10000,并发现虽然它增加了提案的初始微调的准确性。然而,当从零开始训练时,它通常不会改变最终的精度。设 δ = 0.01|L|,其中L为种子模型的延迟。

    5,网络提升

      除了网络搜索,我们还为模型引入了一些新的组件,以进一步改进最终模型。在网络的开始和结束阶段,我们重新设计了计算昂贵的层。我们还引入了一种新的非线性,h-swish,它是最近的 swish非线性的改进版本,计算速度更快,更易于量化。

    5.1  重新规划昂贵的层

      一旦通过架构搜索找到模型,我们就会发现,一些最后的层以及一些较早的层比其他层更昂贵。我们建议对体系结构进行一些修改,以减少这些慢层的延迟,同时保持准确性。这些修改超出了当前搜索空间的范围。

      第一个修改将重新处理网络的最后几层是如何交互的,以便生成最终层功能更有效率。目前的模型基于 MobileNetV2 的倒瓶颈结构和变体,使用1*1 卷积作为最后一层,以扩展高维特征空间。这一层非常重要,因为它具有丰富的预测功能。然而,这是以额外的延迟为代价的。

      为了减少延迟并保留高维特征,我们将该层移到最终的平均池之外。最后一组特征现在计算为 1*1 空间分辨率,而不是 7*7 的空间分辨率。这种设计选择的结果是,在计算和延迟方面,特征的计算变得几乎是免费的。

      一旦降低了该特征生成层的成本,就不再需要以前的瓶颈投影层来减少计算量。该观察匀速我们删除前一个瓶颈层中的投影和过滤层,从而进一步降低计算复杂度。原始阶段和优化后的阶段如图5所示。有效的最后一个阶段将延迟减少 10毫秒,即 15% 的运行时间,并将操作数量减少了 3000 万个 MAdd ,几乎没有损失精度。第六节包含了详细的结果。

      另一个昂贵的层是初始化过滤器集。目前的移动模型倾向于在一个完整的 3*3 卷积中使用 32个滤波器来构建初始滤波器库进行边缘检测。通常这些过滤器是彼此的镜像。我们尝试减少滤波器的数量,并使用不同的非线性来尝试减少冗余。我们决定对这一层使用硬 swish 非线性,因为它的表现和其他非线性测试。我们能够将过滤器的数量减少到 16 个,同时保持与使用 ReLU 或 swish 的 32个过滤器相同的精度。这节省了额外的 3 毫秒和 1000 万 MAdds。

    5.2  非线性

      在【36,13,16】中引入了一种称为 swish 的非线性,当作为 ReLU 的替代时,它可以显著提高神经网络的精度。非线性定义为:

      虽然这种非线性提高了精度,但是在嵌入式环境中,它的成本是非零的,因为在移动设备上计算Sigmoid函数要昂贵的多。我们用两种方法处理这个问题。

      1,我们将 Sigmoid 函数替换为它的分段线性硬模拟:ReLU6(x + 3)/6,类似于【11,44】。较小的区别是,我们使用的是 ReLU6,而不是自定义的裁剪常量。类似的,Swish的硬版本也变成了

      最近在【2】中也提出了类似的 hard-swish 版本。图6显示了 Sigmoid和 Swish 非线性的软,硬版本的比较。我们选择常量的动机是简单,并且与原始的平滑版本很好地匹配。在我们的实验中,我们发现所有这些函数的硬版本在精度上没有明显的差异,但是从部署的角度来看,他们具有多种优势。首先,几乎所有的软件和硬件框架上都可以使用 ReLU6 的优化实现。其次,在量子化模式下,它消除了由于近似 Sigmoid 的不同实现而带来的潜在的数值精度损失。最后,即使优化了量化的 Sigmoid实现,其速度也比相应的 ReLU 慢的多。在我们的实验中,使用量化模式下的 swish 替换 h-swish 使推理延迟增加了 15%。

      2,随着我们深入网络,应用非线性的成本会降低,因为每层激活内存通常在分辨率下降时减半。顺便说一句,我们发现 swish 的大多数好处都是通过只在更深的层中使用他们实现的。因此,在我们的架构中,我们只在模型的后半部分使用 h-swish。我们参照表1和表2来获得精确的布局。

      即使有了这些优化,h-swish 仍然会引入一些延迟成本。然而正如我们在第六节证明准确性和延迟的净效应是没有优化积极的,大量使用时一个优化的实现基于分段函数。即使这些优化,h-swish还介绍了延迟成本。然而正如我们在第六节证明准确性和延迟的净效益是积极没有优化,大量使用时一个优化的实现基于分段函数。

    5.3  大的压缩和激活

      在【43】中,压缩和激活瓶颈的大小与卷积瓶颈的大小有关。取而代之的是,我们将他们全部替换为固定为膨胀层通道数的 1/4。我们发现这样做可以在适当增加参数数量的情况下提高精度,并没有明显的延迟成本。

    5.4  MobileNetV3 定义

      MobileNetV3 被定义为两个模型:MobileNetV3-Large 和 MobileNetV3-Small。这些模型针对的是高资源用例和低资源用例。通过应用平台感知的 NAS 和 NetAdapt 进行网络搜索,并结合本节定义的网络改进,可以创建模型,我们网络的完整规范见表1和表2。

    6,实验

      我们提供了实验结果来证明新的 MobileNet V3模型的有效性。我们报告实验分类,检测和分割的结果。我们也报告各种消融研究,以阐明各种设计决策的影响。

    6.1  分类

      由于已经成为标准,我们在所有分类实验中都是由 ImageNet【38】,并将准确度与各种资源实验度量(如延迟和乘法加法(MAdds))进行比较。

      实验的分类部分,土豪谷歌实验了16块 TPU,batchsize设置为 4096进行训练,然后作者选择在谷歌的 Pixel  Phone 进行测试

    6.1.1  训练设置

      我们在 4*4  TPU Pod【24】上使用 0.9 动量的标准 TensorFlow  RMSProp Optimizer 进行同步训练。我们使用初始学习率为 0.1, 批次大小为 4096(每个芯片 128 张图片),学习率衰减率为 0.01 每三个周期。我们使用 dropout of  0.8 ,l2 的权重衰减为 1e-5.用于与 Inception【40】相同的图像预处理。最后,我们使用衰减为 0.9999 的指数移动平均。我们所有的卷积层都使用批次处理归一化层,平均衰减为  0.99。

    6.1.2  测试设置

      为了测试延迟,我们使用标准的谷歌像素手机,并通过标准的 TFLite 基准测试工具运行所有网络。我们在所有测试中都使用单线程大内核。我们没有报告多核推理时间,因为我们发现这种设置对移动应用程序不太实用。

      上图为作者在ImageNet网络的测试结果,结果可以看出 V3 Large 相比较于 V2 1.0 精度上提高了大约3个点,但是速度上从 64降到了51(Pixel-1 手机),V3 small 相较于 V2 0.35 ,精度提升了大约 7个点,速度稍有提升,从 16.5ms 到 15.8ms(Pixel-1 手机)

    6.2  结果

      如图1所示,我们的模型优于目前的技术状态,如 MnasNet,ProxylessNas 和 MobileNetV2。我们在表3中报告了不同像素手机上的浮点性能。我们在表4中包括量化结果。

      在图7中,我们展示了MobileNet V3 性能权衡作为乘法和分辨率的函数。请注意,MobileNetV3-Small 的性能比 MobilenetV3-Large 的性能好很多,其乘法器缩放到与性能匹配的倍数接近3%。另一方面,决议提供了比乘数更好的权衡。但是,需要注意的是,分辨率通常是由问题决定的(例如分割和检测问题通常需要更高的分辨率),因此不能总是用作可调参数。

      表5中非线性的影响  我们研究在哪里插入 h-swish 非线性以及使用一个优化的改进实现了独立的实现。可看出,使用一个优化的 h-swish 节省 6 ms(超过 10%的运行时)。优化 h-swish 比起 传统的 ReLU 只会增加一个额外 1ms

      图8显示了基于非线性的选择和网络的有效边界宽度。MobileNetV3 使用 h-swish 中间的网络和支配 ReLU。有趣的是要注意,添加 h-swish 整个网络是略优于插值扩大网络的前沿。

      其他组件的影响  在图9中,我们展示了不同组件的引入是如何沿着延迟/准确率曲线移动的。

      上图对比了在不同谷歌手机上面,模型量化后(float量化,非int8量化)的耗时,其中P-1,P-2,P-3 分别代表的是不同性能的手机。这里说一下 V3-Large网络,可见量化后,Top-1 精度从下面的 70.9 上升到 73.8ms,符合政策情况,在P1-P3的加速效果来看P1 加速了 8ms,P2加速了6ms,P-3加速了5ms,与V2网络相比,提速快一些。但是V3-Small 在量化后提速效果不大。

      上图是作者实验了使用不同分辨率以及不同的模型深度的精度的对比,分辨率分别选择的是【96,128,160,192,224,256】,深度分辨选为原来的【0.35,0.5,0.75,1.0,1.25】。可见,其实resolution 对于精度以及速度的平衡效果更好,可以达到更快的速度,同时精度没有改变模型深度低,反而更高。

      上图展示了MobileNet V3中单个组件的影响,过程是测试移动到右边。

    6.3  检测

      在 SSDLite中,我们使用 MobileNet V3作为骨干特征题器的替代,并与COCO dataset 上的其他骨干网络进行了对比。

      在MobileNet V2之后,我们将第一层  SSDLite 附加到输出步长为 16 的最后一个特征提取器层,并将第二层 SSDLite 附加到输出步长为 32 的最后一个特征提取器层。根据检测文献,我们将这两个特征提取层分别称为 C4和 C5.对于MobileNet V3-Large,C4是第13 个瓶颈块的膨胀层。对于 MobileNetV3-Small ,C4是第9个瓶颈层的膨胀层。对这两个网络,C5都是池化层之前的一层。

      我们还将 C4和 C5之间的所有特征层的信道数减少2。这是因为 MobileNetV3的最后几层被调优为输出 1000 类,当将 90 个类转移到 COCO 时,这可能是多余的。

      COCO 测试集的结果如表6所示。在信道缩减的情况下,MobileNetV3-Large 比具有几乎相同映射的 MobileNetV2快 25%。在相同的延迟下,MobileNet V3  比 MobileNet V2和 MnasNet 高  2.4 和 0.5 。对于这两种 MobileNet V3模型,通道减少技巧在没有地图丢失的情况下可以减少大约 15% 的延迟,这表明 ImageNet 分类和 COCO对象检测可能更喜欢不同的特征提取器形状。

    6.4  语义分割

      在本小节中,我们使用 MobileNetV2 和提出的 MobileNetV3作为移动语义分割的网络骨架。此外,我们比较了两个分割头。第一个是在 【39】中提出的 R-ASPP。R-ASPP是一种无源空间金字塔池化模块的简化设计,它只是采用由11个卷积和一个全局平均池化操作组成的两个分支。在本文中,我们提出了另一种轻量级分割头,称为 Lite R-ASPP(或 LR-ASPP),如图10所示,Lite R-ASPP是对 R-ASPP的改进,它部署全局平均池化的方式类似于挤压-激活模块,其中我们使用了一个大的池内核,具有较大的步长(以节省一些计算),并且模块中只有 一个 11 个卷积。我们对 MobileNet V3 的最后一个块应用 Atrous Conv 来提取更密集的特性,并进一步从底层特性添加一个跳过连接来捕获更详细的信息。

      我们使用独立 mIOU 对 CityScapes 数据集进行了实验,只使用了fine 注释。我们采用与【8,39】相同的训练方案。我们所有的模型都是从零开始训练,没有使用ImageNet[36] 进行预训练,并且使用单尺度输入进行评估。与目标检测类似,我们发现我们可以在不显著降低性能的情况下,将网络主干最后一块的信道减少2倍。我们认为这是因为主干网络设计了 1000 类 ImageNet 图像分类,而Cityscapes 只有 19类,这意味着主干网络存在一定的信道冗余。

    7,总结和未来工作

      在这篇文章中,我们介绍了 MobilenetV3大大小小的模型,展示了在移动分类,检测和分割方面的最新技术。我们描述了我们的努力,利用多种类型的网络架构搜索以及先进的网络设计,以交付下一代移动模型。我们还展示了如何适应非线性,如swish 和应用压缩和激励的量化友好和有效的方式,将他们作为有效的工具引入移动模型领域。我们还介绍了一种新的轻量级分割解码器,称为 LR-ASPP。尽管如何将自动搜索技术与人类直觉最好地结合起来仍然是一个悬而未决的问题,但我们很高兴的展示了这些初步的积极结果,并将在未来的工作中继续改进这些方法。

    不经一番彻骨寒 怎得梅花扑鼻香
  • 相关阅读:
    C++成员变量与函数内存分配
    Sqlite ContentProvider Loader 上下文 对话框
    好书好人生--读书的步骤
    小智慧40
    流媒体开发之-直播界面切换电视台频道
    HDU 4617Weapon(两条异面直线的距离)
    BON取代半岛电视,美国人要“换口味”了吗?
    【Todo】Lucene系统学习
    Zookeeper学习 & Paxos
    C++中的虚继承 & 重载隐藏覆盖的讨论
  • 原文地址:https://www.cnblogs.com/wj-1314/p/12108424.html
Copyright © 2011-2022 走看看