神经网络推理优化方法总结

🎀个人主页: https://zhangxiaoshu.blog.csdn.net
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正!
💕未来很长,值得我们全力奔赴更美好的生活!

前言

随着人工智能的快速发展,神经网络模型的规模和复杂度不断增长。这些巨大的模型参数量给模型的部署带来了巨大的挑战。传统的神经网络模型往往需要大量的计算资源和时间来完成推理任务,这在实时性要求较高的场景下显得尤为不利。针对这一挑战,本文将介绍一系列常用的推理优化方法,旨在实现神经网络模型的高效、实时、准确部署。这些优化方法涵盖了模型压缩、模型剪枝、量化、硬件加速等多个方面。通过这些方法,可以在不损失模型性能的前提下,显著减少模型的参数量和计算复杂度,从而提高模型的部署效率和性能。


文章目录

  • 前言
  • 1.量化
  • 2. 剪枝
  • 3. 蒸馏
  • 4. 算子融合
  • 5. NAS
  • 6. 内核自调优
  • 7. 高性能算子开发
  • 总结


1.量化

神经网络量化是一种模型优化技术,通过将模型的参数和激活值从浮点数表示转换为定点数或低比特位整数表示,从而减少模型的参数量和计算复杂度。其原理是利用量化方法将模型参数和激活值映射到一个较小的值域中,以降低模型的存储需求和计算开销。
在这里插入图片描述

原理:

权重量化(Weight Quantization):将神经网络的权重从浮点数表示转换为定点数或低比特位整数表示。通常使用的量化方法包括线性量化、对称量化和非对称量化等,其中对称量化和非对称量化将权重映射到一个小范围的整数值。

激活量化(Activation Quantization):将神经网络的激活值也从浮点数表示转换为定点数或低比特位整数表示。激活量化通常与权重量化结合使用,以减少推理过程中的计算开销。

优点:

  • 减少存储需求:量化可以大大减少模型的参数量和存储空间需求,节省存储资源。

  • 降低计算开销:量化后的模型具有更低的计算复杂度,可以提高推理速度和效率,适用于实时性要求较高的场景。

  • 硬件加速:量化后的模型可以利用硬件的优化指令集进行加速,进一步提高推理效率。

缺点:

  • 精度损失:量化可能会引入一定程度的精度损失,导致模型性能下降。尤其是在较低比特位量化或不合适的量化方法下,精度损失可能会更加显著。

  • 量化误差:由于量化操作是对参数和激活值进行近似表示,因此会引入量化误差,影响模型的精度和泛化能力。

  • 量化训练成本:对于某些模型和任务,量化训练可能需要额外的计算资源和时间成本,尤其是在训练量化感知的模型时。

神经网络量化方法在实际应用中通常需要权衡模型的性能和推理效率,选择合适的量化策略和参数,以达到减少模型存储和计算开销的目的并尽可能保持模型的性能。

2. 剪枝

神经网络剪枝是一种模型压缩技术,通过减少神经网络中不重要的连接或节点来降低模型的参数量和计算复杂度。其原理是基于神经网络中存在的冗余连接和节点,这些冗余部分对模型的性能贡献较小,可以被剪枝掉而不显著影响模型的性能。
在这里插入图片描述

原理:

权重剪枝(Weight Pruning):根据权重的大小,**将较小的权重置零,然后将相应的连接剪掉。**这种方法基于稀疏性假设,即只有少量的连接对模型的性能起到关键作用,其余的可以被剪枝掉。

通道剪枝(Channel Pruning):针对卷积神经网络,**根据通道的重要性,将较不重要的通道剪掉。**这种方法通常通过计算通道的重要性指标(如通道的输出响应或梯度)来确定要剪枝的通道。

结构化剪枝(Structured Pruning):**在剪枝时保持特定的结构,例如保持卷积核的形状或保持通道的数量。**这样可以保证剪枝后模型的结构仍然保持一定的规律性,避免破坏模型的拓扑结构。

优点:

  • 减少参数量和计算复杂度:通过剪枝可以显著减少模型的参数量和计算量,节省存储空间和计算资源。

  • 提高推理效率:剪枝后的模型具有更少的参数和计算量,推理速度更快,适用于实时性要求较高的场景。

  • 保持模型性能:在合理选择剪枝比例和方法的情况下,可以保持模型的性能,减少剪枝带来的精度损失。

缺点:

  • 计算开销大:剪枝算法通常需要额外的计算开销和时间成本,尤其是对于复杂的神经网络模型。

  • 精度损失:不当的剪枝策略或过度剪枝可能会导致模型性能下降,引入一定程度的精度损失。

  • 模型依赖性:不同类型的模型和任务可能需要不同的剪枝策略和参数调优,剪枝的效果可能会受到模型结构和数据集的影响。

神经网络剪枝方法在实际应用中通常需要综合考虑模型的性能、推理速度和资源消耗,选择合适的剪枝策略和参数,以达到压缩模型的目的并保持模型的性能。

3. 蒸馏

神经网络蒸馏是一种模型压缩技术,通过训练一个较小且更简单的模型来近似一个复杂的模型,以达到模型压缩和加速推理的目的。其原理是利用大模型(教师模型)的输出作为训练数据,来指导小模型(学生模型)学习复杂模型的表示能力和决策边界。
在这里插入图片描述

原理:

教师模型:通常是一个大型且复杂的模型,其在训练集上表现良好,但具有较高的计算成本。

学生模型:通常是一个较小且简单的模型,其在参数量和计算量上都要比教师模型小很多,可以在资源受限的环境中进行高效部署。

蒸馏过程:通过**将教师模型的软标签(即概率分布)作为辅助信息,来引导学生模型学习复杂模型的输出分布。**在训练过程中,学生模型的目标是最小化与教师模型输出之间的差异,同时保持模型的简洁性。

优点:

  • 模型压缩:通过训练一个小模型来近似一个大模型,可以显著减少模型的参数量和计算复杂度,节省存储空间和计算资源。

  • 推理效率:蒸馏后的小模型具有更少的参数和计算量,推理速度更快,适用于资源受限的环境和实时性要求较高的场景。

  • 保持模型性能:在合理选择蒸馏参数和损失函数的情况下,可以保持模型的性能,使得蒸馏后的模型能够在保持精度的同时具备更高的推理效率。

缺点:

  • 计算开销:蒸馏过程通常需要额外的计算资源和时间成本,尤其是在训练复杂的教师模型和学生模型时。

  • 精度损失:不当的蒸馏策略或参数选择可能会导致模型性能下降,引入一定程度的精度损失,尤其是在学生模型相对较小或任务复杂度较高时。

  • 模型依赖性:不同类型的模型和任务可能需要不同的蒸馏策略和参数调优,蒸馏的效果可能会受到模型结构和数据集的影响。

神经网络蒸馏方法在实际应用中通常需要综合考虑模型的性能、推理效率和资源消耗,选择合适的蒸馏策略和参数,以达到压缩模型的目的并保持模型的性能。

4. 算子融合

神经网络压缩方法中的算子融合是一种将多个计算操作合并为一个更大的操作的技术。其原理是通过合并相邻的计算操作,以减少计算和内存访问之间的开销,并优化模型的计算流程。 算子融合通常发生在神经网络模型的图优化阶段,用于减少模型的运行时计算开销。

原理:

算子融合的原理基于以下几个核心思想:

减少内存访问开销:在神经网络的推理过程中,内存访问通常是性能瓶颈之一。通过将多个计算操作合并为一个操作,可以减少内存访问的次数和数据的传输量,从而提高模型的推理效率。

优化计算流程:将多个相邻的计算操作合并为一个操作,可以降低计算的复杂度,并优化模型的计算流程。这样可以减少计算中间结果的存储和传输,进而提高模型的推理速度。

降低计算开销:合并相邻的计算操作可以减少计算的数量和复杂度,从而降低模型的计算开销。这对于资源受限的设备和实时性要求较高的场景尤为重要。

优点:

  • 提高推理效率:算子融合可以减少模型的计算量和内存访问次数,从而提高模型的推理效率,适用于实时性要求较高的场景。

  • 减少计算开销:通过合并相邻的计算操作,可以降低模型的计算复杂度和运行时开销,节省计算资源。

  • 优化模型结构:算子融合可以优化模型的计算流程,减少中间结果的存储和传输,从而提高模型的推理速度和效率。

缺点:

  • 增加模型复杂度:算子融合可能会增加模型的复杂度和实现难度,需要设计合适的算法和优化策略来实现。

  • 潜在精度损失:合并计算操作可能会引入一定程度的数值精度损失,影响模型的性能和精度。因此,在进行算子融合时需要进行仔细的权衡和调优。

  • 依赖模型结构:算子融合的效果可能会受到模型结构和计算图的影响,不同类型的模型和任务可能需要不同的融合策略和参数选择。

算子融合作为神经网络压缩方法的一部分,通常与其他技术结合使用,以实现更高效的模型推理和更好的性能。在实际应用中,需要综合考虑模型的性能、推理效率和资源消耗,选择合适的算子融合策略和参数,以达到压缩模型的目的并保持模型的性能。

5. NAS

神经网络架构搜索(Neural Architecture Search,NAS)是一种自动化地搜索神经网络结构的方法。它通过搜索整个神经网络结构的空间,找到最优的网络结构,以达到提高模型性能和效率的目的。

原理:

搜索空间定义:首先,需要定义一个搜索空间,包括神经网络的结构组成元素,如卷积层、池化层、全连接层等,以及它们的连接方式和超参数。

搜索策略选择:NAS算法通过不同的搜索策略来探索搜索空间,常见的方法包括随机搜索、进化算法、强化学习等。这些方法根据给定的搜索空间和目标函数,自动地生成和评估不同的网络结构。

性能评估:对于每个生成的网络结构,需要通过在验证集或测试集上进行评估来计算其性能。通常,使用准确率或其他指标作为目标函数,根据目标函数的值来选择最优的网络结构。

迭代优化:NAS算法通常是一个迭代的过程,通过不断地生成、评估和调整网络结构,逐步优化模型的性能,直到达到停止条件为止。

优点:

  • 自动化搜索:NAS可以自动地搜索最优的网络结构,减少了手动设计的人力和时间成本。

  • 性能提升:NAS可以找到更加复杂和有效的网络结构,提高了模型的性能和泛化能力。

  • 适应性强:NAS可以根据具体的任务和数据集来搜索最优的网络结构,适用于各种不同的应用场景。

缺点:

  • 计算开销大:NAS算法通常需要大量的计算资源和时间成本来搜索网络结构,尤其是在搜索空间较大的情况下。

  • 需求资源多:NAS算法对计算资源和存储资源的需求较高,需要进行大规模的搜索和评估,才能得到准确的结果。

  • 可解释性差:由于NAS算法是一种黑盒优化方法,生成的网络结构通常难以解释,不利于对模型进行解释和理解。

综上所述,神经网络架构搜索(NAS)作为一种自动化地搜索最优神经网络结构的方法,在提高模型性能和效率方面具有很大的潜力。然而,它也面临着计算开销大、需求资源多和可解释性差等挑战,需要在实际应用中综合考虑其优缺点,并根据具体情况选择合适的方法和策略。

6. 内核自调优

神经网络压缩方法中的内核自调优是一种通过自动化技术来优化神经网络中的操作核(kernel)的方法。内核自调优的目的是减少模型的参数量和计算量,同时保持模型的性能和精度。它的原理是根据训练数据和任务特性,自动地调整操作核的大小、形状或其他属性,以优化模型的性能。

原理:

搜索空间定义:首先,需要定义一个操作核的搜索空间,包括操作核的大小、形状、步长、填充等属性。这些属性可以根据具体的任务和数据集来确定,通常是根据经验或领域知识进行定义。

自动化搜索:内核自调优算法通过不同的搜索策略来探索操作核的搜索空间,以找到最优的操作核配置。常见的搜索方法包括随机搜索、进化算法、梯度优化等。

性能评估:对于每个生成的操作核配置,需要通过在验证集或测试集上进行评估来计算其性能。通常使用准确率、损失函数或其他指标作为目标函数,根据目标函数的值来选择最优的操作核配置。

迭代优化:内核自调优算法通常是一个迭代的过程,通过不断地生成、评估和调整操作核配置,逐步优化模型的性能,直到达到停止条件为止。

优点:

  • 减少计算复杂度:内核自调优可以根据任务需求和数据特性,调整操作核的大小和形状,以减少模型的参数量和计算量,提高模型的推理效率。

  • 保持模型性能:通过自动化搜索和优化,内核自调优可以保持模型的性能和精度,使得压缩后的模型仍能达到原始模型的性能水平。

  • 适应性强:内核自调优可以根据具体的任务和数据集来调整操作核的配置,适用于各种不同的应用场景和任务要求。

缺点:

  • 计算开销大:内核自调优算法通常需要大量的计算资源和时间成本来搜索最优的操作核配置,尤其是在搜索空间较大的情况下。

  • 需求资源多:内核自调优算法对计算资源和存储资源的需求较高,需要进行大规模的搜索和评估,才能得到准确的结果。

  • 超参数选择困难:内核自调优的性能很大程度上依赖于搜索空间的定义和搜索策略的选择,需要仔细选择和调整超参数,以获得最佳的性能。

综上所述,神经网络压缩方法中的内核自调优作为一种自动化优化技术,在减少模型参数量和计算量的同时保持模型性能方面具有很大的潜力。然而,它也面临着计算开销大、需求资源多和超参数选择困难等挑战,需要在实际应用中综合考虑其优缺点,并根据具体情况选择合适的方法和策略。

7. 高性能算子开发

神经网络压缩方法中的高性能算子开发是一种针对特定硬件平台或加速器的优化技术,旨在提高神经网络模型的推理性能和效率。其原理是通过针对硬件特性和优化目标,设计和实现高效的计算操作核(kernel),以加速神经网络模型的推理过程。

原理:

硬件特性分析:首先,需要对目标硬件平台或加速器的特性进行分析和理解,包括计算单元的结构、内存层次结构、指令集支持等。

算法优化:根据硬件特性和优化目标,设计和实现高效的计算操作核,以减少计算量、内存访问和数据传输,提高计算效率和并行度。

并行化和优化:利用硬件的并行计算能力和优化指令集,对计算操作核进行并行化和优化,以最大程度地发挥硬件性能,并降低计算和内存访问的延迟。

低级优化:针对特定硬件平台或加速器的特性和限制,进行底层优化,如内存对齐、向量化、流水线并行等,以进一步提高计算效率和性能。

优点:

  • 提高推理效率:高性能算子开发可以根据硬件特性和优化目标,设计和实现高效的计算操作核,从而提高神经网络模型的推理效率和速度。

  • 充分利用硬件资源:通过针对硬件平台或加速器进行优化,充分发挥硬件的计算能力和并行性,提高模型的计算效率和性能。

  • 定制化和适应性强:高性能算子开发可以根据具体的硬件平台和应用需求进行定制化设计,适应不同硬件环境和应用场景的需求。

缺点:

  • 开发成本高:高性能算子开发需要深入理解硬件特性和优化目标,设计和实现高效的计算操作核,开发成本较高。

  • 兼容性和移植性差:由于针对特定硬件平台或加速器进行优化,高性能算子可能不具备通用性和移植性,对不同硬件环境和平台可能需要重新开发或调整。

  • 维护困难:随着硬件技术的不断更新和变化,高性能算子的维护和优化工作也会变得更加困难和耗时。

综上所述,神经网络压缩方法中的高性能算子开发作为一种针对特定硬件平台或加速器的优化技术,在提高模型推理性能和效率方面具有很大的潜力。然而,它也面临着开发成本高、兼容性和移植性差以及维护困难等挑战,需要在实际应用中综合考虑其优缺点,并根据具体情况选择合适的方法和策略。


总结

  1. 神经网络量化:将模型参数和激活值从浮点数表示转换为定点数或低比特位整数表示,以减少存储需求和计算复杂度。

  2. 神经网络蒸馏:通过训练一个小模型来近似一个大模型,以达到模型压缩和加速推理的目的。

  3. 神经网络剪枝:通过减少神经网络中不重要的连接或节点来降低模型的参数量和计算复杂度。

  4. 算子融合:将多个计算操作合并为一个更大的操作,以减少计算和内存访问之间的开销,并优化模型的计算流程。

  5. 神经网络架构搜索(NAS):自动化地搜索最优的神经网络结构,以提高模型性能和效率。

  6. 内核自调优:通过自动化技术来优化神经网络中的操作核,以减少模型的参数量和计算复杂度,同时保持模型的性能和精度。

  7. 高性能算子开发:针对特定硬件平台或加速器,设计和实现高效的计算操作核,以提高模型的推理性能和效率。

每种方法都有其独特的优点和挑战,可以根据具体的应用需求和硬件环境选择合适的方法来压缩神经网络模型,以提高模型的性能、效率和部署效果。

参考:

神经网络的量化

一文搞懂【知识蒸馏】【Knowledge Distillation】算法原理

文中有不对的地方欢迎指正、补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/430263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言操作符详解(一)

一、操作符的分类 • 算术操作符&#xff1a; 、- 、* 、/ 、% • 移位操作符:<< >> • 位操作符: & | ^ • 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^ • 单⽬操作符&#xff1a; &#xff01;、、--、&、*、、…

Android Studio开发(一) 构建项目

1、项目创建测试 1.1 前言 Android Studio 是由 Google 推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发 Android 应用程序。 基于 IntelliJ IDEA: Android Studio 是基于 JetBrains 的 IntelliJ IDEA 开发的&#xff0c;提供了丰富的功能和插件…

[Redis]——Spring整合Redis(SpringDataRedis)

⭐准备工作&#xff1a; 确保Redis服务已启动idea开发环境 ⭐Redis整合步骤&#xff1a; 1.pom文件引入依赖 2.yml文件配置连接信息 3.修改Redis序列化方式 4.注入RedisTemplate 使用 小知识&#xff1a; Spring整合的Redis可以将Object对象自动序列化成字符串&#xff0…

数学建模【灰色关联分析】

一、灰色关联分析简介 一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种因素&#xff0c;多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中&#xff0c;哪些是主要因素&#xff0c;哪些是次要因素;哪些因素…

高级统计方法 第5次作业

作业评阅&#xff1a; 概念 1.问题 2.问题&#xff08;略&#xff09; 4.问题&#xff08;略&#xff09; &#xff08;a&#xff09;问题&#xff08;略&#xff09; 10%&#xff0c;忽略 X < 0.05和 X > 0.95的情况。 &#xff08;b&#xff09;问题&#xff08;略…

金田金業: 避险情绪骤升 黄金暴力拉升

现货黄金周一(3月4日)亚市早间开盘于2082美元/盎司&#xff0c;最高2119.86美元/盎司&#xff0c;最低2079.44美元/盎司&#xff0c;收盘2114.28美元/盎司&#xff0c;全天波幅约40美金&#xff0c;当日涨幅1.51%。 【基本面】 周一(3月4日)无重要数据公布&#xff0c;投资者关…

TPM引领智能制造新篇章:赋能企业转型升级

在智能制造日益成为工业发展主流趋势的今天&#xff0c;全面生产维护&#xff08;Total Productive Maintenance&#xff0c;简称TPM&#xff09;作为一种先进的管理理念和方法&#xff0c;正逐渐展现出其为企业实现智能制造赋能助力的巨大潜力。TPM不仅关注设备的维护和保养&a…

【机器学习】包裹式特征选择之递归特征添加法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Leetcode刷题笔记题解(C++):232. 用栈实现队列

思路&#xff1a;双栈实现入队列和出队列的操作 //AB栈来实现队列 //A栈用来push 可以利用A栈获取到队列的back即A.top //B栈用来pop 如果要获取队列的top&#xff0c;可以先把A栈元素依次弹出依次压入B栈中&#xff0c;然后B.top就是队列的top&#xff0c;pop也类似 cla…

云原生学习

1. 高可用架构 1.1 架构图 Kubernetes是属于主从设备模型&#xff08;Master-Slave架构&#xff09;&#xff0c;即有Master节点负责核心的调度、管理和运维&#xff0c;Slave节点则执行用户的程序。在Kubernetes中&#xff0c;主节点一般被称为Master Node 或者 Head Node&am…

【C语言】Leetcode 206.反转链表

博主主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《Leetcode》 题目 解决思路 思路一&#xff1a;翻转链表 struct ListNode* reverseList(struct ListNode* head) {if(head NULL){return NULL;}struct ListNode* n1 NULL,*n2 head,*n3 n2 -> next;while(…

手写分布式配置中心(三)增加实时刷新功能(短轮询)

要实现配置自动实时刷新&#xff0c;需要改造之前的代码。 服务端改造 服务端增加一个版本号version&#xff0c;新增配置的时候为1&#xff0c;每次更新配置就加1。 Overridepublic long insertConfigDO(ConfigDO configDO) {insertLock.lock();try {long id 1;List<Con…

【EI会议征稿通知】第六届人工智能技术与应用国际学术会议(ICAITA 2024)

第六届人工智能技术与应用国际学术会议(ICAITA 2024) 2024 6th International Conference on Artificial Intelligence Technologies and Applications 第六届人工智能技术与应用国际学术会议(ICAITA 2024)&#xff0c;由长春理工大学主办&#xff0c;长春理工大学电子信息工…

【Linux】Shell命令运行原理和权限详解

【Linux】Shell命令运行原理和权限详解 一、剩余指令的补充1.tar指令2.bc指令3.uname4.热键 二、Shell命令运行原理1.Shell2.为什么Linux不让用户直接使用kernel 三、Linux权限概念四、Linux权限管理1.文件访问的用户分类2.文件类型和访问权限&#xff08;1&#xff09;文件类型…

H3C PBR 实验

H3C PBR 实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;公司分别通过电信和联通线路接入互联网公司内网配置 RIP 互通&#xff0c;公网配置 OSPF 互通&#xff0c;R6上配置默认路由指向 R1&#xff0c;内网使用路由器模拟 PCR1 分别在电信和联通出口上配置…

【Python】进阶学习:pandas--info()用法详解

【Python】进阶学习&#xff1a;pandas–info()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

力扣hot10---子串

题目&#xff1a; 思路&#xff1a; 一看到子数组的和&#xff0c;就很容易想到前缀和&#xff0c;求出来前缀和数组后&#xff0c;对前缀和数组进行两重for循环遍历&#xff0c;就大功告成啦&#xff01;&#xff08;感觉想一会儿就可以想到&#xff09; 代码&#xff1a; …

《操作系统原理》算法总结

一、进程调度算法 先来先服务调度算法&#xff08;FCFS&#xff09; 每次调度是从就绪队列中&#xff0c;选择一个最先进入就绪队列的进程&#xff0c;把处理器分配给该进程&#xff0c;使之得到执行。该进程一旦占有了处理器&#xff0c;它就一直运行下去&#xff0c;直到该…

使用IGEV和双目相机生成深度图实现测距

介绍 以下是源代码的demo&#xff0c;我根据自己的需求&#xff0c;做了部分改动&#xff0c;比如双目相机输入的格式是RGBA&#xff0c;但IGEV处理的输入通道数是3&#xff0c;我就在其他py文件将图片转成RGB格式 设备 1080ti和jetson orin nx两个都可以 代码 import sys…

VS2019 - error C2653: 不是类或命名空间名称

文章目录 VS2019 - error C2653: 不是类或命名空间名称概述笔记类的头文件类的实现文件备注END VS2019 - error C2653: 不是类或命名空间名称 概述 工程开了预编译头包含. 编码中, 随手写一个类, 将功能函数加入, 还没开始用这个类, 先习惯性的编译一下. 编译报错如下: St…