深度学习基础—结构化机器学习项目

news2024/11/16 11:35:06

1.正交化


        这是一个老式电视,有一组旋钮可以对画面进行调节,例如高度、宽度、画面梯形角度、画面位置、画面旋转等等,但是如果有一个旋钮,旋转时可以调节上面所有参数,那么就会出现一种情况:当前的画面高度和宽度都合适,但是画面位置不对,我旋转该万能旋钮,画面位置对了,结果高度和宽度又不合适了。这里面就体现正交化的思想:电视设计师在设计旋钮的过程,尽可能的让一个旋钮只控制一种功能或属性,多个旋钮控制互不相关的功能或属性,只有这样,才能让调节更加合适。

        正交化在坐标系中可视化,就像平面中的x轴和y轴,3维坐标系中的x、y、z轴。在x轴上移动坐标,永远不会影响y轴的坐标,它们相互垂直。由此,这启发我们也在深度学习领域设置一组旋钮,这些旋钮分别控制不同的功能,当我们的模型在某一方面的表现不好时,就可以针对问题调整对应的旋钮,从而提高模型的性能。

        一个模型的完成需要经过:训练集、验证集、测试集、实际运用。从这四个方面考虑模型的性能,如果一个模型在训练集表现不好,就需要一组正交旋钮调整,让模型在训练集表现的更好,比如更大的训练集、更好的优化算法。如果一个模型在训练集表现良好,但在验证集表现不好,就需要正交旋钮调整超参数。如果一个模型在训练和验证集都表现良好,但是在测试集表现不好,就需要正交旋钮调整比如开发集规模更大。如果一个模型在前三个阶段都可以,但是实际运用效果较差,就需要正交旋钮调整比如损失函数、损失函数的评价指标(也是优化目标)等等。

2.单实数评估指标


        在训练网络的过程中,我们通常的目标是损失函数最小化,但是对于网络整体的性能究竟如何?我们想让网络朝那些方向发展?就需要设计一个评估指标,表示网络当前的性能。

        机器学习和深度学习是一个实验性和经验性的过程,通常我们产生一个idea,就编写代码,然后进行训练测试,根据评估指标,修改idea进而再次迭代这一过程。假设我们有一个猫咪图片分类器A和B,A的查准率(一张图片被正确识别为猫的概率)是95%,召回率(所有猫的图片有多少被正确识别的)是90%。B的查准率是98%,召回率是85%。这两个分类器在两个指标各有优劣,我们可以使用平均数来将两个指标合成为一个指标。使用调和平均数:

        其中,P是查准率,R是召回率。

        经过计算发现A分类器效果更好,因此淘汰B分类器,对A分类器再进行优化。但是有些指标难以合成为一个评估指标,如下:

        分类器A的运行时间最短,但是准确率最低,B运行时间较短,准确率也还可以,C运行时间远远大于A和B,但是准确率最高。如果从准确率出发,会选择C分类器,但是它的运行时间1.5s,难以接受。如果选择最快的分类器A,它的准确率又比较低。可以采用简单的线性合成,例如:

        但是这种方式过于随意。还可以采用约束条件,比如选出最具有代表性的指标作为优化指标——准确率,其余指标进行条件约束,这样情况下我们可以尽可能的满足其他需求下,优化准确率。比如我们选择RunningTime的时间不超过100ms,这样的话C就被淘汰,然后选择满足约束条件的模型中优化指标最好的,也就是B分类器,这样的话就可以帮助我们选择良好的模型。

3.训练集、验证集和测试集


        如果我们要训练一个有关地区分类的模型,有如下图片8个地区,应该如何进行训练集、开发集和测试集的划分?现有两种方案,第一种:训练集取一部分国家,开发集和测试集取一部分国家。第二种:训练集、开发集和测试集都从8个随机选取数据,也就是说每个集合8个国家的数据都涵盖部分。

        实际上,如果选择第一种方案,很有可能出现在训练集表现良好,在开发集和测试集表现较差。这是由于不同国家的地理环境、风土人情都不同,训练出来的模型适应这些国家,就不一定适应其他国家,因此需要选择第二种方案。第二种方案的训练集、开发集和测试集都来自同一分布,训练出来的模型鲁棒性较好。这就是训练集、开发集和测试集划分的重要原则:来自同一分布

        至于训练集、开发集和测试集的数据比例,见如下链接:深度学习基础—参数调优icon-default.png?t=N7T8http://t.csdnimg.cn/JDIXI

4.什么时候应该改变开发集、测试集和评估指标


        在实际运用模型的时候,可能出现一些情况:模型的目标出现偏差,这时候就需要改变开发集、测试集和评估指标了。

4.1.改变评估指标

        假设有猫咪分类器A和B,实际中希望分类器向用户推送猫咪的照片。A模型只有3%的错误率,但是其中会推送一些低俗照片,这是用户所不能接受的。B分类器虽然有5%的错误率,但是不会推送低俗照片。模型的评估指标是错误率,如下:

        这种情况下,评估指标告诉我们模型A效果更好,但是实际运用用户告诉我们模型B更好。就启示我们,评估指标出现了问题,因此需要更改评估指标。可以对评估指标进行修改:

        其中,mdev开发集的样本数量,w(i)是惩罚权重,如果是低俗照片,该值大,比如10或100等,如果不是,该值小,比如1。这样就赋予了低俗图片更大的错误率,这样就有了更加准确的目标,即错误率越小。

        改变评估指标其中也蕴含着正交化的思想,即改变评估指标只是第一步,第二步与其独立,就是优化损失函数。可以将损失函数也加上惩罚权重,比如:

        这是对惩罚权重进行归一化的损失函数,通过这样,如果模型的J很大,就说明低俗照片分类的很多,优化函数就会向更少的低俗照片分类进行优化,从而降低损失。

4.2.改变开发集、测试集

        还是猫咪分类器的例子,可能出现一种情况,开发集和测试集选择的图片全是高清大图,而实际部署模型后,用户上传的图片千奇百怪,可能很不清晰。这就会导致一种情况,模型在评估指标、开发集和测试集上的表现都很好,但是实际中表现就不好。

        这启发我们去更改开发集和测试集,可能需要我们在开发集和测试集添加一些不清晰的图片或各种花样的图片,让模型能更好的反应实际情况。

5.人类水平表现与改善模型


5.1.什么是人类水平表现

        机器学习项目的发展是随着时间的增加,模型的性能逐渐上升,但是并不是无限上升,而是在一定程度后,趋于平缓,这个一定程度就是指人类水平表现和贝叶斯最优错误率之间。如下图所示,紫色的线就是机器学习项目准确率的曲线,而蓝色的线是人类水平表现的准确率线,绿色的线是贝叶斯最优错误率的线。

        贝叶斯最优错误率是指理论上所能达到的最优错误率,没有任何办法设计一个函数可以达到最优错误率。

        人类水平表现是指人类能达到的错误率,对于自然感知领域,人类的准确率是比较高的,因为人擅长听、看等,因此人类水平表现距离贝叶斯最优很近。

5.2.机器学习与人类水平表现关系

        在未超过人类表现前,机器学习发展迅速,但是超过人类表现,机器学习的发展就比较缓慢。这里可能有两个原因:1.人类水平表现和贝叶斯最优之间没有多少差距,因此模型到这个区间没有更多的改善空间。2.在没超过人类表现以前,我们可以有很多工具和技巧来发展机器学习,但是一旦超过人类水平,这些技巧可能就不起作用了。

        如下图所示,假如正在进行一个图像识别的分类任务,训练误差为8%,开发误差为10%,在机器学习发展未超过人类水平表现的情况下,来看看不同人类水平表现错误率对模型训练策略的影响:

        由于人类擅长识别图像,因此人类水平表现的错误率和贝叶斯最优错误率相差不大,且贝叶斯最优错误率一定比人类水平表现小,而我们的目的是为了优化模型从而使机器学习项目更加接近贝叶斯最优错误率,这里称贝叶斯最优错误率和机器学习项目训练集错误率的差值为可避免误差。同时用人类水平表现来估计贝叶斯最优错误率。

        如果人类水平表现错误率为1%,那么可避免误差就是7%,而粗略估计训练集和开发集误差之差为方差,则方差为2%。还是在下面那个链接提到:

深度学习基础—参数调优icon-default.png?t=N7T8http://t.csdnimg.cn/JDIXI

        方差和偏差在机器学习中的理解方式是以贝叶斯最优错误率为0%为前提的,但是实际上这是很难达到的,比如音频分类,如果音频的质量很差,人类都难以听清楚内容,那么贝叶斯最优错误率也很难为0。因此可避免误差就是偏差的一种实际表现。那么在人类水平表现错误率为1%的情况下,偏差比方差大,此时更应该注意偏差,于是可以采用更复杂的网络、更长的训练时间或更优的模型与优化算法等技巧来进行优化。

        如果人类水平表现错误率为7.5%,那么可避免误差就是0.5%,方差就是2%。此时更应该注意方差,可以采用正则化、更多的数据或更优的模型等技巧来进行优化。

        那在机器学习发展超过人类水平表现的情况下呢?

        上图所示,以人类团队的错误率作为人类水平表现,那么绿色框中的人类水平表现为0.5%,比训练误差0.3%和开发误差0.4%都高,此时机器学习的性能已经超过人类水平表现了,此时不知道可避免误差为多少。因为可能是模型过拟合了,或者说贝叶斯最优错误率为0.1%、0.2%或0.3%都有可能,这时无法判断究竟是偏差大还是方差大,于是对于机器学习项目的进展就很缓慢,也就是紫线后面的趋势。

        注意:人类水平表现究竟是取大众水平还是取顶尖水平?比如在医学图像识别案例中:

        普通人识别图片的错误率为3%,普通医生为1%,经验丰富的医生为0.7%,而经验丰富的医生的团队为0.5%。可以确定的是,贝叶斯最优错误率是理想情况下能达到的最小值,而人类水平表现一定<=贝叶斯最优错误率,因此用顶尖水平作为人类水平表现来估计贝叶斯错误率是最好的选择。而如果在一些场合只需要模型超过个人水平,那用普通人的水平作为人类水平表现就是合理的。

        人类擅长自然感知类型的任务,比如视听说等,因此在图像分类识别或语音识别,人类水平表现和贝叶斯最优很接近,机器学习模型很难超过人类的表现。但是并不是所有的模型都无法超过人类,比如预测类(天气预报等)或癌症视图分析等,这些方面机器做的水平就比人类高。

5.3.如何根据人类水平表现改善模型

        我们说过,可避免误差是偏差的重要反映,因此如果可避免误差大于方法,就选择训练大模型、训练更长时间、更好的优化算法或更优的模型和超参数搜索等方式改进。如果方差更大,那就选择更多的数据、正则化或更优的模型和超参数搜索等方式改进。

        这也是正交化思维的体现之一,保证训练集误差很低可以看成低可避免误差,这是一种优化模型的维度。而确保训练集误差低,开发集误差也低,是低方差的体现,也是另一种优化模型的维度。

6.误差分析


6.1.误差分析

        假设正在进行猫咪图片分类器,分类器有10%的错误率和90%的正确率,这还远远达不到预期,并且观察错误分类发现,很多小狗的照片被分类为小猫,那么是否应该针对这类小狗图片进行优化?

        回答这个问题前,首先应该进行误差分析,所谓误差分析就是人工针对错误案例进行标注、分析,从而得到模型的优化方向的技术。误差分析需要从开发集中取出部分错误数据,这里假设取100个错误分类的样本,然后进行人工统计,有多少小狗被分类成小猫了。

        这里分成两种情况:情况一:100个错误样本中只有5个小狗,那么即使将这五个小狗全部优化分类正确,也才提升了0.5%的准确率(10%*5%),分类器仍有9.5%的提升空间。情况二:100个错误样本中有50个小狗,如果全部分类正确,就提升了5%的准确率,提升幅度比较大。

        现在再来回答刚刚问题。如果优化小狗图片对模型的提升很多,那就有优化的必要;但是如果没有多大提升,那不如把精力花费在更有效的途经上。

        同时,我们可以考虑多个评估想法,比如误差分析的时候考虑:改善分类错误的小狗、改善分类错误的猫科动物、改善图片清晰度低。取100个分类错误的开发集样本,列一张表格:

图片

猫科动物

图片不清晰

备注

1

比特犬

2

下雨天的猎豹

...

100

模糊的柴犬

总计%

8%

43%

65%

        针对这张表格的误差分析,发现图片不清晰的比例很大,因此优化图片不清晰样本比优化狗对模型的改善有效的多。

        如果在误差分析统计的过程中,发现有其他的评估考虑,比如发现有图片出现破损或污染,也可以在表格中再添加一列,然后再次进行误差分析(重新人工标注)。

6.2.清除标注错误数据

        如果在训练的过程中发现,图片和标签不一致,比如下图中第六张图片是狗,标签是1(猫)。那么是否值得花费时间去修复这个错误的标签?

        在训练集上,如果偶尔出现一两个这样的错误,由于训练集很大,因此可能这样的错误不会对训练产生影响,深度学习对随机错误还是很健壮的。但是如果经常出现这样的错误,比如标注人员是色盲,把所有某种颜色的狗都看成了猫,也就是系统错误,这样就对模型产生比较深的影响,就需要修改错误标签。

        在开发集和测试集上,如果这些标签错误严重影响了在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。但是,如果它们没有严重影响到用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。也就是利用误差分析,比如还是10%的错误率,其中6%是标注错误的样本,那么只有0.6%的错误是标注错误,9.4%是其他错误,这时候就集中优化这9.4%。如果错误率降到2%,但是还是0.6%的错误样本(原来那0.6%没有被优化一点),此时0.6%就占了2%错误率的30%,这个比例已经很大了,因此就需要集中修改错误标注的标签。

        开发集的目标是,从多个不同的模型中选择最优的模型,因此如果开发集中存在较高比例的错误标注,就值得进行修改,否则开发集评估的模型不再可信。

        在清除错误标签数据时注意:

        1.开发集和测试集保持同一分布,即同时检查开发集和测试集的错误标签。

        2.不仅考虑错误标签,对于正确的标签也需要考虑(通常不需要这样做)。

        3.可以不用花很多精力考察训练集。

        最后注意:通常进行一个项目,建议先快速搭建一个简单粗糙的模型进行训练,然后观察方差和偏差,决定模型的优化方向,这样的效率比直接考虑复杂的有效的多。

7.训练集与开发集测试集来自不同分布


7.1.训练集与开发集测试集来自不同分布的优点

        在训练模型的时候,如果数据越多,算法效果越好,这就导致开发人员会搜集大量的数据,因此训练集数据和开发集、测试集可能无法来自同一分布,事实证明,这种方式对算法的改善还有很大作用。

        如上图所示,猫咪分类器的数据来源有两种,一种是从网页爬虫获得,可以获得大量的高清图片。而第二种是用户手机app上传,这种方式数据较少,且清晰度可能更低。假如第一种方式可以获得200000张图片,而第二种方式可以获得10000张图片,如何划分训练集、开发集和测试集效果更好?

        第一种:将所有图片合并并洗牌随机分配给训练集、开发集和测试集,这样做的好处是来自同一分布,但是缺点却很明显:搭建的模型在实际运用中接受的更多数据是用户上传的模糊图片。

        第二种:将5000张手机上传图片和200000张图片合并作为训练集,另5000张图片一半作为开发集,一半作为测试集。这样的好处是模型将更加关系开发集的优化,也就是我们的实际目标。缺点是:训练集、开发集和测试集不是同一分布。

        但是事实证明第二种方式更加有效,可以长期为系统带来更好的性能。其实背后的道理显而易见,训练集的数据量很大,因此模型比较健壮,当在开发集表现不好时,就会使用一些技巧进行优化,降低在开发集上的损失,于是模型逐渐在开发集和测试集上表现的更好。

7.2.如何分析不同分布的偏差和方差

        下图所示的情况(图片分类)究竟是什么?

        如果训练集和开发集属于同一分布,那么这就属于高方差。但是如果不属于同一分布,问题的就说不清了,因为开发集可能比训练集的图片难以识别,比如分辨率低,图片重要区别元素少等。因此这9%的方差很难说清究竟是高方差还是其他问题。为了解决这样的问题,我们需要设置训练—开发集。

        上图是我们原先设置训练集、开发集、测试集的方式,从训练集中随机打乱,分出一部分数据作为训练—开发集,这样训练—开发集和训练集来自同一分布,只在训练集跑优化算法,而训练—开发集只进行向前传播,然后进行方差、偏差分析。如下图:

        可以把分析数据填入下图所示的表格中,假如下图正在进行汽车语音识别的任务,我们获取到大量的各行各业的语音数据和少部分专业汽车语音数据。显然可以把各行各业的语音数据作为训练集和训练—开发集,把专业数据作为开发集和测试集,如果人类对各行各业的语音数据的人类水平表现误差为4%,训练误差为7%,训练—开发误差为10%,开发集和测试集的误差为6%(也可以在专业数据上进行人类水平表现和训练模型,这样有助于获得更多的误差数据分析模型的优化方向),下图第一列是大量的各行各业的语音数据,第二列是少部分专业汽车语音数据,第一行是人类水平表现误差,第二行是训练误差,第三行是不进行优化算法的误差。

        则上图中,人类水平表现和训练误差间衡量的是可避免误差(也就是偏差),训练误差和训练—开发误差之间衡量的是方差(同一分布),训练—开发误差和开发误差、测试误差之间衡量的是数据不匹配问题(就是因为不同分布导致的开发、测试误差和训练—开发误差出现差距的问题)。

        对于方差、偏差我们都有相应的处理手段,但是对于数据不匹配问题,目前没有系统有效的方式来解决,只能靠一些手段去试。比如做误差分析,或者看看训练集和开发集,试图找出这两个数据集的分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。

        有一种办法是人工数据合成,比如,如果要合成语音识别的数据,就可以将两段音频合成为一段,这样虽然增加了数据量,让训练集更像开发集,但可能出现模型的过拟合,因为新音频的本质和原来的音频有很多相似之处,只是人类听不出来。因此使用人工数据合成时,一定要谨慎,很有可能从所有可能性的空间只选了很小一部分去模拟数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jconsole远程连接

jconsole可以远程连接的前提&#xff08;需要在部署应用时像下面示例这样设置&#xff09;&#xff1a; -Djava.rmi.server.hostname127.0.0.1 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port3214 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.m…

milvus使用milvus migration工具迁移数据

1.前提&#xff1a;这个数据迁移工具是collection 维度的 2.文章内是2.3.1–》2.4.5数据迁移&#xff0c;公司内部需求&#xff0c;各位看官注意哈 官方架构图&#xff1a; 想要迁移的milvus 官方称之为&#xff1a;源source milvus 要迁入的表 目标的milvus 官方称之为&…

JWT结构详解与JWT设置

JWT结构详解与JWT设置 1. 什么是token2. 为什么要使用token3. 什么是JWT4. JWT的格式4.1 header4.2 payload4.3 signature 5. JWT校验流程6. JWT使用案例6.1 token的创建6.2 判断token是否可以刷新6.3 刷新token6.4 token的校验6.5 用户验证流程 1. 什么是token Token是服务端…

Prometheus+Grafana的安装和入门

概念 什么是Prometheus? Prometheus受启发于Google的Brogmon监控系统&#xff08;相似kubernetes是从Brog系统演变而来&#xff09;&#xff0c; 从 2012年开始由google工程师Soundclouds使用Go语言开发的开源监控报警系统和时序列数据库 (TSDB)。&#xff0c;并且与2015年早…

2017年系统架构师案例分析试题一

目录 案例 【题目】 【问题 1】(12 分) 【问题 2】(13 分) 答案 【问题 1】答案 【问题 2】答案 相关推荐 案例 阅读以下关于软件架构评估的叙述&#xff0c;在答题纸上回答问题 1 和问题 2。 【题目】 某单位为了建设健全的公路桥梁养护管理档案&#xff0c;拟开发一套公…

USB PHY—— PHY 基础

芯片厂商开发了一些 USB PHY 芯片&#xff0c;可以把 DP、DM上的差模信号转成共模信号。 USB PHY 负责最底层的信号转换&#xff0c;作用类似于网口的 PHY。 USB 信号传输前&#xff0c;需要通过 PHY 把 USB 控制器的数字信号转成线缆上的模拟信号。USB 控制器和 PHY 之间的总…

中国严肃游戏开发的最佳实践

严肃游戏产业在中国迅速发展&#xff0c;将娱乐与教育、培训和宣传活动融为一体。旨在实现特定学习成果或行为改变的严肃游戏在从企业培训到医疗保健和教育的各个领域越来越受欢迎。然而&#xff0c;为中国市场开发成功的严肃游戏需要深入了解当地文化、用户偏好和技术趋势。以…

函数栈帧的创建和销毁(VS2022)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、前面的困惑 二、什么是函数栈帧 三、关于函数栈帧的基础知识 1.栈 2.寄存器 2.1 什么是寄存器 2.2 相关的寄存器 2.3 相关汇编命令 2.4 预备知识 四、解析函数…

盘点4款可以免费使用的高效ai PPT制作工具。

平时我们自己制作一个PPT还是需要比较长的时间的&#xff0c;从构思内容&#xff0c;到制作主题和逻辑框架&#xff0c;然后是挑选模板、排版配色等&#xff0c;过程比较繁琐且费时。但是&#xff0c;现在出现了很多的AIPPT制作工具&#xff0c;能够快速的帮助用户生成一个完整…

来自工业界的知识库 RAG(六),独特的 RAG 框架 dsRAG 核心亮点解读

背景介绍 在前面介绍了较多的开源 RAG 框架&#xff0c;比如主打 Rerank 的 QAnything, 主打精细文件解析的 RagFlow, 主打模块化灵活组合的 GoMate。这些库的设计除了少量的独特之处外&#xff0c;相似的部分很多。 最近有注意到一款另类的 RAG 框架 dsRAG&#xff0c;使用了…

openGauss在龙芯平台部署的实践

服务器环境 系统信息 NAME"Loongnix-Server Linux" VERSION"8" ID"loongnix-server" ID_LIKE"rhel fedora centos" VERSION_ID"8" PLATFORM_ID"platform:lns8" PRETTY_NAME"Loongnix-Server Linux 8"…

第四十篇-TeslaP40+Ollama+Ollama-WebUI(自编译)

本文介绍用自己编辑ollama-webui,链接本地ollama 环境 系统&#xff1a;CentOS-7 CPU: 14C28T 内存&#xff1a;32G 显卡&#xff1a;Tesla P40 24G 驱动: 535 CUDA: 12.2 Ollama: 0.3.0本地ollama 参考 [第二十四篇-Ollama-在线安装](https://blog.csdn.net/hai4321/articl…

2024软考:一场与“难”共舞的奇妙冒险,你值得拥有!

在这个时代&#xff0c;如果说有什么考试能让IT界的勇士们闻风丧胆&#xff0c;又爱又恨&#xff0c;那软考绝对能C位出道&#xff0c;成为众多技术大佬心中的“白月光”与“朱砂痣”。随着岁月悠悠&#xff0c;2024年的软考似乎又悄悄地在难度上动了点小心思&#xff0c;让人不…

vue设置水印

水印图例 1.新建Watermark.js 文件 const watermark {}const setWatermark (text, sourceBody) > {const id Math.random() * 10000 - Math.random() * 10000 / Math.random() * 10000if (document.getElementById(id) ! null) {document.body.removeChild(document.getE…

阿里云服务器开放端口的完整版图文教程

原文&#xff1a;阿里云服务器开放端口完整版教程&#xff1a;https://www.yundashi168.com/488.html 笔者近期开发完成的服务端程序部署在阿里云的ECS云服务器上面&#xff0c;一些应用程序配置文件需要设置监听的端口&#xff08;如Tomcat的8080、443端口等&#xff09;&…

萤石云 移动端demo指南

再来一篇&#xff0c;这次是萤石开放平台移动端demo的使用指南 一、Demo使用指南 从官网下载demo&#xff0c;下载地址demo首页如下&#xff1a; 填入对应参数 输入框是否必填解释服务器区域是国内选择Asia-China&#xff0c;海外选择对应的区域。选择后ApiUrl和WebUrl会自动…

餐饮行业eHR人力资源管理系统应该如何选择?

数字化转型与增长成为餐饮企业品牌竞争的创新壁垒&#xff0c;越来越多的餐饮企业&#xff08;门店&#xff09;依托数字化工具和手段&#xff0c;覆盖从内部组织到外部的数字化升级&#xff0c;包括员工管理、营销、客户管理&#xff0c;以及采购供应链等各环节的数字化运营。…

Netty从入门到超神-NIO 三大核心(selector,channel,buffer)(二)

前言 上一篇文章认识了一下Java的三大IO&#xff0c;这一章节我们详细了解一下NIO的工作原理以及三大核心Selector,Channel,Buffer并尝试来做一些小案例。 Java NIO 模型 Java NIO有三个核心的组件&#xff1a; selector 选择器 &#xff0c; channel 通道 &#xff0c; buf…

SpringBoot日常:Spring之@PostConstruct解析

简介 spring的Bean在创建的时候会进行初始化&#xff0c;而初始化过程会解析出PostConstruct注解的方法&#xff0c;并反射调用该方法。 PostConstruct 的使用和特点 只有一个非静态方法能使用此注解&#xff1b;被注解的方法不得有任何参数&#xff1b;被注解的方法返回值必…

Marin说PCB之TP测试的Layout设计要求

提及到TP点这个器件想必诸位道友们肯定不会陌生吧&#xff0c;我们的单板在量产之前都是需要做很多测试的&#xff0c;一般在产品研发的A版本和B版本的时候都是需要在单板上加上这个器件的。小编我最近在做一个改板&#xff0c;项目组为了降本增效&#xff0c;把单板的尺寸缩小…