收藏 | 一文带你总览知识蒸馏,详解经典论文
「免费学习 60+ 节公开课:投票页面,点击讲师头像」
作者:凉爽的安迪
来源 | 深度传送门(ID:deep_deliver)
【导读】这是一篇关于【知识蒸馏】简述的文章,目的是想对自己对于知识蒸馏学习的内容和问题进行总结。笔者挑选了部分经典的paper详读,希望对于对KD有需求的同学提供一个概览和帮助。
引子
昆虫记里写道:”蝴蝶以毛毛虫的形式吃树叶积攒能量逐渐成长,最后变换成蝴蝶这一终极形态来完成繁殖”。虽然蝴蝶和毛毛虫两者本质是同一种生物,但是面对不同环境和任务的时候,形态不同——毛毛虫形态下可以更方便地吃树叶,保护自己,积蓄能量;而蝴蝶能飞,可以扩大活动范围,提高繁殖几率。
图1,毛毛虫变成蝴蝶
在监督学习里也是这样的,在训练模型时,我们通常采用复杂模型或者Ensemble方式来获取最好的结果,导致参数冗余严重,像BERT里有3亿参数。因此在前向预测时,需要对模型进行复杂的计算(或多个模型加权),导致工程性能较差。
Hinton在NIPS 2014workshop中提出知识蒸馏(Knowledge Distillation,下面简称KD)概念:
把复杂模型或者多个模型Ensemble(Teacher)学到的知识 迁移到另一个轻量级模型( Student )上叫知识蒸馏。使模型变轻量的同时(方便部署),尽量不损失性能。
从定义上来看KD属于模型压缩、加速的一类玩法。(后面的研究也会将KD应用于模型表现的提升)。在这里,知识应该宽泛和抽象地理解,模型参数,网络层的输出(网络提取的特征)、网络输出等都可以理解为知识。
图2,Knowledge in KD
Overview & Timeline
按照待迁移的知识类型,KD主要分为三个大类:
Output Transfer——将网络的输出(Soft-target,后面会介绍其含义)作为知识;
Feature Transfer——将网络学习的特征作为知识;
Relation Transfer——将网络或者样本的关系作为知识;
图3,知识蒸馏分类——从迁移知识类别的角度
从时间线上来看,KD的发展脉络大致如下(部分论文):
图4,Timeline of KD
在第二part中,对于Paper内容的概述也将大概按照KD的类别分别展开。
Papers
2-1 Output Transfer
Output Transfer——将网络的输出(Soft-target,后面会介绍其含义)作为知识。在该部分,将主要介绍以下几篇paper。
2-1-1 《Distilling the Knowledge in a Neural Network 》
【Meta info】Hinton,NIPS 2014 workshop,Cites:2400
这篇paper是知识蒸馏的开山之作,由Hinton老爷子在NIPS 2014 workshop上提出,文章的思路非常简单、优雅。首先,我们对一些术语进行定义:
Teacher:原始较大的模型或模型Ensemble,用于获取知识
Student:新的较小的模型,接收teacher的知识,训练后用于前向预测
Hard target:样本原本的标签,One-hot
Soft target :Teacher输出的预测结果(一般是softmax之后的概率)
接下来,进入正题,介绍蒸馏的过程:
图6,知识蒸馏过程图示
图7,经典知识蒸馏过程
从模型效果上来看:
【Mnist】
图8,Mnist蒸馏结果对比
Teacher网络模型复杂,参数多,表征能力强,使用Hard Target作为训练目标,并且从直觉上来看,效果应该是好的(参数多),最终在测试集上错了67个。
Student网络模型简单,参数少,表征能力弱,在直接使用Hard target 作为训练目标时(不使用知识蒸馏),在测试集上错了146;使用Hard target + Soft target作为训练目标时,错了74个。
可以看出,加入了Soft target后,小网络从大网络中继承了大网络中学习的“知识”,但是这个实验中,最好的结果没有超过baseline。
【一个语音数据集】
Teacher(baseline)网络准确率58.9%,10个Teacher集成的准确率为61.1%,而神奇的是,Student网络(简单模型蒸馏Ensemble网络)的效果居然超过了Teacher网络!
我们考虑下起主要效果的因子:
以Mnist数据集为例,对于数字9而言,数字9与数字4和7长得比较像。网络在进行训练时,我们如果能够将数字之间的相似关系传递给模型,则网络可能学习到更好的结果。
图9,Mnist数据集
而对于Hard target和Soft target
图10,Hard target和Soft target对比
我们可以看出,软目标的优势在于:
弥补了简单分类中监督信号不足(信息熵比较少)的问题,增加了信息量;
提供了训练数据中类别之间的关系(数据增强);
可能增强了模型泛化能力。
What's more,关于软目标相关的思考,还有Label smoothing Regularization(LSR),即“标签平滑归一化”。LSR也是对“硬目标”的优化:
图11,LSR算法
具体推导可以参考
Müller R, Kornblith S, Hinton G. When Does Label Smoothing Help?[J]. arXiv preprint arXiv:1906.02629, 2019.
在经典的蒸馏网络中,参数T是一个超参数——温度。T表示软目标要soft的程度:
T = 1,公式同softmax输出后的结果;
T越接近0,公式越同One-hot编码,最大值趋向于1,最小值趋向于0;
提升T,则保留更多类别关系信息。
2-1-2 《Distilling Task-Specific Knowledge from BERT into Simple Neural Networks》
【Meta info】:2019, Cites:12
本文是对Bert网络进行蒸馏,其思想与经典蒸馏网络并无区别。
【背景】:
18年底,Bert在很多NLP任务上取得了STOA,但线上运算时,算力是“瓶颈”, 使用单核B70 CPU,Seq length=128时,QPS只有几十
KD在NLP应用较少
本文希望用Bi-LSTM网络蒸馏Bert网络
【网络Loss】:同经典KD,Loss分为两部分:
【网络结构】:
图12,Bi-LSTM蒸馏Bert
【效果】:可以看出蒸馏的结果弱于Bert但是比原始的双向LSTM效果好很多。
2-1-3 《Deep Mutual Learning》
【Meta info】:CVPR 2018,Cites:409
【背景】:
在经典的蒸馏过程中,teacher网络固定,只用来输出soft-target,难以学习student网络中反馈的信息,进而对训练过程进行优化
本文提出深度互学习,多个学生网络同时训练,通过真值和多个网络的输出结果“相互借鉴,共同进步”
本文不已模型压缩为主要目的,更多为了提升模型表现
【网络结构】(以两个网络为例):
图13,DML网络结构
【网络Loss】:
思路比较简单,Lc1是经典的交叉熵,Dkl是KL散度。
【实施】:
图14,DML训练过程
当存在多个子网络时:
【效果】:
可以看出,在DML思路下,网络效果比单个网络有了明显的提升;效果比经典的蒸馏网络也提升较大。
【有效因子】:
类别概率中包含了更多信息(同经典KD)
深度互学习的方法可能找到了更平缓的极值点(意味着泛化能力更强,小的波动不会对预测产生较大的影响),如下图所示,DML网络的Loss和单独训练网络Loss接近,但是,当对参数添加噪声时,DML的Loss小于单独训练的Loss(当网络输出对于输入噪声的敏感程度比较差的时候,可以认为网络输出处于一个比较平缓的局部最优点)。
图15,DML与单独网络Loss
【2-1-4】《Born Again Neural Networks》再生网络
【Meta info】:CVPR 2018,Cites:409
【思路】:
再生网络也不已模型压缩为主要目的,更多为了提升模型表现
再生网络基于蒸馏的理念,提供了一种Esemble的思路
教师、学生网络结构相同,第n个学生目标训练第n+1个学生,“口口相传”
最后进行集成
【网络结构】:
图16,再生网络
【效果】:
2-2 Feature Transfer
Feature Transfer——将网络学习的特征作为知识。在深度学习中,一般将隐藏层的输出看作是网络学习的特征,下面两篇paper中:第一篇paper以MLP为基础框架,则网络提取的特征为每个隐藏层的输出向量;第二篇paper以CNN为基础框架,则网络提出的特征为每层的Feature Map。
图1,特征迁移
2-2-1 《FitNets: Hints for Thin Deep Nets》
【Meta info】:ICLR 2015,Cites: 780
【背景】:
Deep可能是DNN主要的拟合能力的重要来源,之前的KD工作都是用较浅的网络作为student net,拟合能力可能较弱
这篇文章把“宽”且“深”的网络蒸馏成“瘦”且“更深”的网络
【思路】:
学生网络不仅仅拟合教师网络的soft-target,而且拟合隐藏层的输出(教师抽取的特征);
第一阶段让学生网络去学习教师网络的隐藏层输出(特征迁移);
第二阶段使用soft targets来训练学生网络(输出迁移)。
【网络结构】:
图2,FitNet网络结构
【实施】:
2-2-2 《Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer》
【Meta info】:ICLR 2017, Cites: 222
【思路】:
思路一:对卷积网络隐藏层输出的特征图——feature map(特征 & 知识)进行迁移(Attention transfer),让学生网络的feature map与教师网络的feature map尽可能相似
思路二:Loss对输入X求导,得到梯度更大的像素点,表明”更重要”,需要pay more attention
该特征迁移的方法也可以与soft-target的方式结合
【网络结构】:
图3,《Paying More Attention to Attention》网络结构
【思路1——Actication-based attention transfer】:
对卷积网络隐藏层输出的特征图——feature map(特征 & 知识)进行迁移(Attention transfer),让学生网络的feature map与教师网络的feature map尽可能相似;
该特征迁移的方法也可以与soft-target的方式结合。
【实施】:
首先将Teacher网络和Student网络都分成n个part(两者分part的数量相同),每个part内包含几个卷积核池化层都是可以的,不过为了提升预估的效率,一般学生网络每个part的网络结构比教师网络简单。同时,保证学生网络和教师网络每个part的最后一个卷积层得到的feature map的size大小相同,都是W * H(数量可以不同);
接下来,为了计算loss,每个part的最后一个卷积层C个W * H的特征图变换为1个W* H的的二维张量,原文提供了以下三种方式(比较简单可以回原paper详读):
特征图张量各通道绝对值相加;
特征图张量各通道绝对值p次幂相加;
取特征图张量各通道绝对值p次幂最大值
然后,计算教师网络和学生网络的特征图差异,并使其变小。
【网络Loss】:
【思路2——Gradient-based attention transfer】:
Loss对输入X求导, 判断损失函数对于输入X的敏感性,pay more attnetion to值得注意的像素(梯度大的像素)
【网络Loss】:
2-3 Relation Transfer
Relation Transfer——将网络或者样本的关系作为知识。该部分将主要介绍以下一篇paper:
图5,关系迁移
2-3-1 《A Gift from Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learning》
【Meta info】:CVPR 2017,Cites: 144
【思路】:学生网络学习教师网络层与层之间的关系(特征关系),“授之以渔”。
【网络结构】:
图6,FSP matrix网络结构
【实施】:
首先将Teacher网络和Student网络都分成n个part(两者分part的数量相同),每个part内包含几个卷积核池化层都是可以的,不过为了提升预估的效率,一般学生网络每个part的网络结构比教师网络简单。同时,保证学生网络和教师网络每个part的最后一个卷积层feature map的数量与下一个part第一个卷积层feature map的数量的数量相等;
定义”FSP matrix“用于衡量两层特征之间的关系,用前一层的特征图与下一层的特征图element-wise相乘并求和:
该步骤计算完毕后,可以得到一个m * n的 FSP matrix;
网络被分为了n个part,可以获取n-1个FSP matrix(上图中,分为了3个part,可以获取两个FSP matrix);
训练分为两个阶段:
第一个阶段,用FSP预训练学生网络的参数;
第二个阶段,用正常的分类loss优化学生网络。
【效果】:
在多个数据集上学生网络在参数减少很多的情况下,效果接近教师网络,且优于FitNets
2-4 Others
该部分将主要介绍以下的paper:
图8,其他paper
2-4-1 《KDGAN: Knowledge Distillation with Generative Adversarial Networks》
【Meta info】:NIPS 2018, Cites: 15
【背景】:
原始蒸馏网络中,学生网络难以学习到教师网络的所有“知识”,效果可能略差于教师网络
用对抗生成的方式模拟蒸馏的过程:生成器(学生网络,参数少、简单)负责基于输入X输出X的标签Y,判别器(教师网络,参数多、复杂)判断标签来自于学生网络还是真实的数据
前向计算时,只使用生成器,实现蒸馏的目的
【GAN】回顾:
GAN常用于图像生成:
经典GAN中,生成器G基于随机噪声生成图像;判别器D是一个分类器,判断图像是真实图像还是生成的。
最大-最小迭代训练:
固定G,用G的生成结果和真实数据优化D,使得V(D,G)尽可能大;
固定D,基于D的结果优化G,使得V(D,G)尽可能小;
KDGAN里作者提出了两种网络:NaGAN,KDGAN
思路1:【NaGAN】
【网络结构】(红框部分):
图9,NaGAN网络结构
【实施】:
【优劣】:
KD需要样本少,但是通常不能保证学生网络的效果达到教师网络的程度;
NaGAN需要样本大于KD,但是通常可以使得学生网络效果和教师网络差不多。
思路2:【KDGAN】:
【网络结构】:
图10,KDGAN网络结构
【实施】:
【训练过程】:
训练D:固定T和S,最大化似然函数。D更新时,希望将真实样本的标签判别为1;将C和T生成的标签判别为0,因此最大化D更新的损失函数;
训练T:固定D和S,最小化损失函数。损失函数分为两部分,第一部分为判别器D对于T生成的标签真实性的判别,T希望D判别的概率越小越好;第二部分为蒸馏Loss,T网络去拟合S网络输出的软目标;
训练S:固定D和T,最小化损失函数。损失函数分为两部分,第一部分为判别器D对于S生成的标签真实性的判别,S希望D判别的概率越小越好;第二部分为蒸馏Loss,S网络去拟合T网络输出的软目标。
迭代对抗训练。
2-4-2 《Ranking Distillation: Learning Compact Ranking Models With High Performance for Recommender System》
【Meta info】:KDD 2018,Cites: 12
【背景】:
检索系统或者推荐系统中模型庞大,可以用蒸馏网络的方式提升工程效率;
目标是给一个query,预测检索系统的Top K相关的doc。
【思路】:
第一阶段训练教师网络,对于每个query预测Top K相关doc,补充为学生网络的Ground truth信息;
第二阶段教师网络的Top K作为正例加到学生网络中一起进行训练,使得学生网络和教师网络的预测结果更像。
【Loss】:
w_r为每条教师网络中预测的样本的权重,有两种方式生成:
对位置进行加权(即,Top 1到K的顺序);
对排序相关性进行加权(考虑教师网络预测的的Item与query的相关性程度)。
【网络结构】:
图11,Ranking Distillation网络结构
Discussion
简单回顾一下,把复杂模型或者多个模型Ensemble(Teacher)学到的知识→ 迁移到另一个轻量级模型( Student )上叫知识蒸馏;。知识蒸馏属于模型压缩、加速的一类,要求在模型变轻量的同时(方便部署),尽量不损失性能;后来也应用于模型表现的提升。
按照迁移知识的类型大致可以分为三大类:
Output Transfer——将网络的输出——Soft-target作为知识;
Feature Transfer——将网络学习的特征作为知识;
Relation Transfer——将网络或者样本的关系作为知识。
知识蒸馏提升了模型的工程表现,相对于其他模型压缩方式,如模型Int8而言,KD给了我们更多的想象空间,毕竟如DML等训练方式,可能在一定程度上提升模型的效果。
最后是一些Take Home Messages~
以上就是《知识蒸馏简述》的全部内容如果大家觉得有帮助,可以帮忙点个赞或者收藏一下,这将是我继续分享的动力~
参考文献
1. Hinton G, Vinyals O, Dean J. Distilling the Knowledge in a Neural Network[J]. Computer Science, 2015, 14(7):38-39.
2. Tang R, Lu Y, Liu L, et al. Distilling Task-Specific Knowledge from BERT into Simple Neural Networks[J]. arXiv preprint arXiv:1903.12136, 2019.
3. Müller R, Kornblith S, Hinton G. When Does Label Smoothing Help?[J]. arXiv preprint
4. Zhang Y, Xiang T, Hospedales T M, et al. Deep mutual learning[C] // Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 4320-4328
5. Furlanello T, Lipton Z C, Tschannen M, et al. Born again neural networks[J]. arXiv preprint arXiv:1805.04770, 2018.
6. Romero A , Ballas N , Kahou S E , et al. FitNets: Hints for Thin Deep Nets[J]. Computer Science, 2014.
7. Zagoruyko S, Komodakis N. Paying more attention to attention: Improving the performance of convolutional neural networks via attention transfer[J]. arXiv preprint arXiv:1612.03928, 2016.
8. Yim J, Joo D, Bae J, et al. A gift from knowledge distillation: Fast optimization, network minimization and transfer learning[C] // Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition.
9. Wang X, Zhang R, Sun Y, et al. KDGAN: knowledge distillation with generative adversarial networks[C]//Advances in Neural Information Processing Systems. 2018: 775-786.
10. Tang J, Wang K. Ranking distillation: Learning compact ranking models with high performance for recommender system[C]
11. Cheng Y, Wang D, Zhou P, et al. A survey of model compression and acceleration for deep neural networks[J]. arXiv preprint arXiv:1710.09282, 2017.
原文地址:
https://zhuanlan.zhihu.com/p/92166184
(*本文为AI科技大本营转载文章,转载请联系作者)
◆
精彩推荐
◆
点击阅读原文,或扫描文首贴片二维码
所有CSDN 用户都可参与投票和抽奖活动
加入福利群,每周还有精选学习资料、技术图书等福利发送
推荐阅读
被追捧为“圣杯”的深度强化学习已走进死胡同
阿里达摩院2020趋势第一弹:感知智能的“天花板”和认知智能的“野望”
11年艺术学习“转投”数学,他出版首本TensorFlow中文教材,成为蚂蚁金服技术大军一员
召回→排序→重排:技术演进趋势的深度之旅,2020 必备!
如何写出让同事膜拜的漂亮代码?
AMD或推出64核128线程HEDT平台;地平线即将推出新一代自动计算平台;阿里达摩院公布2020十大科技趋势……
2019 最烂密码榜单出炉,教你设置神级密码!
GitHub Action 有风险?!
骗了马云 10 亿被骂 4 年后,院士王坚留下 4 条人生启示
万字长文回望2019:影响区块链行业发展的9大事件
你点的每个“在看”,我都认真当成了AI
相关文章:

[工具推荐]用了TrueCrypt 再无难掩之隐
缘起:混在网络n多年了,手头总有些东西不想被别人看到的东西,由于小弟人品好,相貌佳,总有很多朋友喜欢用我的电脑玩啊玩啊……。 近日,冠希、柏芝等前辈以身示法,为我等上了很好一堂关于隐私保护…

利用phpmailer类邮件发送
<?phprequire("class.phpmailer.php"); //下载的文件必须放在该文件所在目录$mail new PHPMailer(); //建立邮件发送类$address "接收方邮箱"; //接收方地址$mail->IsSMTP(); //使用SMTP方式发送$…
据说这是大多数人【减肥】的真实写照
有句诗说得好 “冬天不减肥,夏天徒伤悲” 在这个人人储存脂肪的季节绝对是你甩掉脂肪的好时机(毕竟这是一个拼颜值的时代颜值是天生的,可是身材绝不能输)但是 据说大多数人的减肥经历其实是这样的减肥第一步管住嘴,迈开…
PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法
在日常应用中,某些程序往往会被第三方程序下钩子(hook)。如果被下钩子的进程是我们的进程,并且第三方钩子严重影响了我们的逻辑和流程,我们就需要把这些钩子摘掉(Unhook)。本件讲述一种在32位系统上,如何摘掉API钩子的思路和方法。…

设置列表字段为主键
转贴:Sample event handler to set a field as a pr imary key (enforce no duplicates) Got this as a request from a reader- how to prevent users from adding items with same titles as ones that already exist in the list. Codeusing System;using System.Collectio…

谁登录了你的linux
最近有一台数据库服务器自动重启。查了一下相关登录信息:查看linux下的用户登录日志,包括用户登录时所用的主机的ip:more /var/log/secure who /var/log/wtmp干了些什么? root账户下输入su - username 切换到username下输入 histo…
一种使用GDI+对图片尺寸和质量的压缩方法
今天同事向我询问图片压缩的算法,我想起大概两三年前做过的一个项目。其中包含了尺寸和质量两种压缩算法,并且支持JPEG、bmp、PNG等格式。今天把这段逻辑贴出来,供大家参考。(转载请指明来源于breaksoftware的CSDN博客)…

.NET企业级应用架构设计系列之应用服务器
本文属spanzhang(张友邦)原创,发布地址为:http://blog.csdn.net/spanzhang。转载或引用请注明原文之出处,谢谢! .NET企业级应用架构设计系列之开场白 .NET企业级应用架构设计系列之技术选型 这里要说到的…
编程语言发展70年,用50种不同语言输出「Hello World」
「免费学习 60 节公开课,投票页面,点击讲师头像」作者 | Sylvain Saurel译者 | 风车云马责编 | 屠敏【导读】历经 70 年,不断出现的编程语言为开发者解决了哪些难题?其存在又有怎样的特性?本文将以「Hello World」为例…

函数循环的理解
2019独角兽企业重金招聘Python工程师标准>>> var ulObjdocument.getElementById("box"); var lisObjulObj.getElementsTagname("li"); for(var i0;i<lisObj.length;i) { lisObj[i].οnclickfunction()//循环时对应节点绑定事件,事…
从LeNet到GoogLeNet:逐层详解,看卷积神经网络的进化
「免费学习 60 节公开课:投票页面,点击讲师头像」作者 | MrCharles来源 | CSDN原力计划获奖作品(*点击阅读原文,查看作者更多文章)前言深度学习的兴起使卷积神经网络在计算机视觉方面大放异彩,本文将按时间…

Windows客户端C/C++编程规范“建议”——前言
前言 工作中接触了很多编程规范。其中最有意思的是,公司最近发布了一版C/C编程规范,然后我看到该规范的最后一段时,有这么一句:“该规范不适用于Windows平台开发”。看来这份规范是由做其他平台开发的同学制定的。那么做Windows开…

storm入门教程 第一章 前言[转]
1.1 实时流计算 互联网从诞生的第一时间起,对世界的最大的改变就是让信息能够实时交互,从而大大加速了各个环节的效率。正因为大家对信息实时响应、实时交互的需求,软件行业除了个人操作系统之外,数据库(更精确的说是…

Windows客户端C/C++编程规范“建议”——函数
1 函数 1.1 代码行数控制在80行及以内 等级:【要求】 说明:每个函数的代码行数控制应该控制在80行以内。如果超过这个限制函数内部逻辑一般可以拆分。如果试图超过这个标准,请列出理由。但理由不包含如下: 无法拆分。流程内部…
把自己朝九晚五的工作自动化了,有错吗?
作者 | Brian Merchant译者 | 谭开朗编辑 | 屠敏来源 | CSDN(ID:CSDNnews)【导读】用代码让自己工作开启自动化之际,是否意味着自己将面临被解雇的风险?2016年,Reddit上出现了一个匿名的帖子,内…

COM组件转换成.NET组件[转]
利用类型库导入器(Type Library Importer)可以将其包装成一个.NET组件,然后就可以像使用.NET组件一样使用它了。 .NET框架只是提供了一个包装,并没有真正改变原有的对象 1.找到要转换的.dll文件 2.在命令提示符窗口中输入.dll文件的文件路径,…
干货:Android 源码使用心得分享
我相信很多初学者会和我一样经常在网上去找Android开发源码,但是往往因为运行不起来非常的懊恼!在做爱开发网站的时候,收集App代码时就遇到了这种困难,我相信网络上面的源码大部分在发布前都会人工测试,能够正常运行才…
60分钟入门深度学习工具PyTorch
「免费学习 60 节公开课:投票页面,点击讲师头像」作者 | Soumith Chintala中文翻译、注释制作 | 黄海广配置环境:PyTorch 1.3,python 3.7,主机:显卡:一块1080ti;内存:32g…

Windows客户端C/C++编程规范“建议”——指针
2 指针 2.1 尽量使用智能指针 等级: 【推荐】说明:正确使用智能指针可以省去指针管理的工作。2.2 类成员变量指针释放后一定要置空 等级: 【必须】说明:如果类成员变量指针在释放后没有置空,将出现如下问题࿱…

Bug tracker .net 部署经验(完善中)
Bug tracker .net 部署经验1. 软件要求windows 2003 serverSP1IISSQL sever 2005Net framework2. 安装和配置Bug tracker .net 提供了一个readme 文件。解压安装文件至某一个目录。在SQL SERVER 2005中新建一个数据库。确保IIS工作正常。定义一个虚拟目录,将其指向安…

Windows客户端C/C++编程规范“建议”——函数调用
3 函数调用 3.1 谨慎使用递归方法 等级: 【推荐】说明:递归方式控制不当,可能会导致栈空间不够而崩溃。一般的递归都可以使用循环代替。3.2 不要使用using namespace 等级: 【必须】说明:这是曾经教科书上的一种写法&a…
“一百万行Python代码对任何人都足够了”
作者 | Jake Edge译者 | Kolen出品 | AI科技大本营(ID: rgznai100)编程语言通常对其操作过程的各个方面都有或明或暗的限制。诸如标识符的最大长度或变量可以存储的值的范围之类的事情,这些是相当明显的例子,但是还有其他一些例子…

网吧电影客户端Realplayer的装配问题
网吧电影客户端Realplayer的装配问题 作者: 出处:网吧联盟 ( 20 ) 砖 ( 22 ) 好 评论 ( 1 ) 条 进入论坛 更新时间:2005-11-24 16:54关 键 词:网吧阅读提示:一般有过开网吧经验的朋友,应当知道如何让自己的realplayer播放器支…

基于Servlet+JDBC+Bootstrap+MySQL+AJAX权限管理系统项目实战教程
项目简介 权限系统一直以来是我们应用系统不可缺少的一个部分,若每个应用系统都重新对系统的权限进行设计,以满足不同系统用户的需求,将会浪费我们不少宝贵时间,所以花时间来设计一个相对通用的权限系统是很有意义的。 本系…

Windows客户端C/C++编程规范“建议”——表达式和运算
4 表达式和运算 4.1 比较操作中将常量设置为左值 等级: 【推荐】说明:编写代码时,如果将常量设置为右值。可能因马虎将“”写成“”导致逻辑错误。这种场景下,编译器是不会报错的,代码检查也比较容易被忽视。例子&…
GitHub标星1.5w+,从此我只用这款全能高速下载工具
「免费学习 60 节公开课:投票页面,点击讲师头像」作者 | Rocky0429来源 | Python空间(ID:Devtogether )大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻...网上资源眼花缭乱,下载的方…

CSS text-transform 属性
定义 text-transform 对元素中的字母进行控制。 继承性:Yes 说明 这个属性会改变元素中的字母大小写,而不论源文档中文本的大小写。如果值为 capitalize,则要对某些字母大写,但是并没有明确定义如何确定哪些字母要大写,…

SeaJS基本开发原则
SeaJS基本开发原则 在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则。使用SeaJS开发JavaScript的基本原则就是:一切皆为模块。引入SeaJS后,编写JavaScript代码就变成了编写一个又一个模块,SeaJS中模块的概念有点类…

SMS主站点配置详细图解:Sms2003系列之二
SMS主站点配置在上一篇文章中,我们介绍了如何进行SMS2003+SP2的部署。本文中,我们将介绍如何进行SMS主站点的配置。在SMS中,站点(site)定义并包含了所有SMS管理的对象。当我们第一次安装SMS时,实际安装的是一个SMS站点…