读懂深度迁移学习,看这文就够了 | 赠书
百度前首席科学家、斯坦福大学副教授吴恩达(Andrew Ng)曾经说过:迁移学习将是继监督学习之后的下一个促使机器学习成功商业化的驱动力。
本文选自《深度学习500问:AI工程师面试宝典》,将重点介绍目前最热门的深度迁移学习方法的基本思路。
随着迁移学习方法的大行其道,越来越多的研究人员开始使用深度神经网络进行迁移学习。与传统的非深度迁移学习方法相比,深度迁移学习直接提升了在不同任务上的学习效果,并且由于深度迁移学习直接对原始数据进行学习,所以它与非深度迁移学习方法相比有两个优势。
(1)能够自动化地提取更具表现力的特征。
(2)满足了实际应用中的端到端(End-to-End)需求。
近年来,以生成对抗网络(Generative Adversarial Nets,GAN)为代表的对抗学习也吸引了很多研究者的目光,基于GAN的各种变体网络不断涌现。对抗学习网络与传统的深度神经网络相比,极大地提升了学习效果。因此,基于对抗网络的迁移学习也是一个热门的研究点。
上图为深度迁移学习方法与非深度迁移学习方法的结果对比,展示了近几年的一些代表性方法在相同数据集上的表现。从图中的结果可以看出,与传统的非深度迁移学习方法(TCA、GFK等)相比,深度迁移学习方法(BA、DDC、DAN)在精度上具有显著的优势。
下面我们来重点介绍深度迁移学习方法的基本思路。
首先来回答一个最基本的问题:为什么深度网络是可迁移的?然后,介绍最简单的深度网络迁移形式——微调。接着分别介绍使用深度网络和深度对抗网络进行迁移学习的基本思路和核心方法。
深度网络的可迁移性
随着AlexNet在2012年的ImageNet大赛上获得冠军,深度学习开始在机器学习的研究和应用领域大放异彩。尽管取得了很好的结果,但是神经网络本身解释性不好。神经网络具有良好的层次结构,很自然地就有人开始思考能否通过这些层次结构来很好地解释网络。于是,就有了我们熟知的例子:假设一个网络要识别一只猫,那么一开始它只能检测到一些边边角角的东西,和猫根本没有关系;然后可能会检测到一些线条和圆形;慢慢地,可以检测到猫所在的区域;接着是猫腿、猫脸等。
下图是深度神经网络进行特征提取分类的简单示例。
概括来说就是:前面几层学到的是通用特征(General Feature);随着网络层次的加深,后面的网络更偏重于与学习任务相关的特定特征(Specific Feature)。这非常好理解,我们也很容易接受。那么问题来了,如何得知哪些层能够学到通用特征,哪些层能够学到特定特征呢?更进一步来说,如果应用于迁移学习,如何决定该迁移哪些层、固定哪些层呢?
这个问题对于理解神经网络和深度迁移学习都有着非常重要的意义。来自康奈尔大学的Jason Yosinski等人率先进行了深度神经网络可迁移性的研究,该论文是一篇实验性质的文章(通篇没有一个公式)[Yosinski et al.,2014]。其目的就是要探究上面提到的几个关键性问题。因此,文章的全部贡献都来自实验及其结果。
对于ImageNet的1000个类别,作者将其分成两份(A和B),每份500个类别。然后,分别对A和B基于Caffe训练AlexNet网络。AlexNet网络共有8层,除第8层为与类别相关的网络无法进行迁移外,作者在1到7这7层上逐层进行微调实验,探索网络的可迁移性。
为了更好地说明微调的结果,作者提出了两个有趣的概念:AnB和BnB。这里简单介绍一下AnB和BnB。(所有实验都是针对数据B来说的。)
AnB:将A网络的前n层拿来并将其固定,剩下的层随机初始化,然后对B进行分类。
BnB:将B网络的前n层拿来并将其固定,剩下的随机初始化,然后对B进行分类。
深度网络迁移的实验结果1如下。
这个图说明了什么呢?我们先看BnB和BnB+(即BnB加上微调)。对于BnB而言,原训练好的B模型的前3层可以直接拿来使用,而不会对模型精度有什么损失。到了第4层和第5层,精度略有下降,不过还可以接受。然而到了第6层、第7层,精度居然奇迹般地回升了,这是为什么?
原因如下:对于一开始精度下降的第4层、第5层来说,到了这两层,特征变得越来越具体,所以下降了。而对于第6层、第7层来说,由于整个网络就8层,我们固定了第6层、第7层,那这个网络还能学什么呢?所以很自然地,精度和原来的B模型几乎一致。
对BnB+来说,结果基本上保持不变。说明微调对模型精度有着很好的促进作用。
我们重点关注AnB和AnB+。对于AnB来说,直接将A网络的前3层迁移到B,貌似不会有什么影响,再次说明,网络的前3层学到的几乎都是通用特征。往后,到了第4层、第5层时,精度开始下降,原因是这两层的特征不通用了。然而,到了第6层、第7层,精度出现了小小的提升后又下降,这又是为什么?作者在这里提出两点:互相适应(Co-Adaptation)和特征表示(Feature Representation)。也就是说,在第4层、第5层,主要是由于A和B两个数据集的差异比较大,精度才会下降的;到了第6层、第7层,由于网络几乎不再迭代,学习能力太差,此时特征学不到,所以精度下降得更厉害。
对于AnB+,加入了微调以后,AnB+的表现对于所有的n几乎都非常好,甚至比baseB(最初的B)还要好一些。这说明,微调对深度迁移有着非常好的促进作用。
综合分析上述结果就得到了下图的深度网络迁移实验结果2。
作者进一步设想,是不是在分A、B数据时,里面存在一些比较相似的类使结果变好了?例如,A里有猫,B里有狮子,所以结果会好。为了排除这些影响,作者又重新划分数据集,这次让A和B几乎没有相似的类别。在这个条件下再做AnB,与原来精度进行比较,得到如下深度网络迁移实验结果3。
上图说明,随着可迁移层数的增加,模型性能会下降。但是,前3层仍然是可以迁移的。同时,与随机初始化所有权重相比,迁移学习获得的精度更高。
结论:
虽然论文[Yosinski et al.,2014]并没有提出创新的方法,但通过实验得到了以下几个结论,这对深度学习和深度迁移学习的研究都有着非常好的指导意义。
(1)神经网络的前3层基本都是通用特征,进行迁移的效果比较好。
(2)在深度迁移网络中加入微调,效果提升会比较大,可能会比原网络效果还好。
(3)微调可以比较好地克服数据之间的差异性。
微调
深度网络的微调(Fine-Tune)也许是最简单的深度网络迁移方法。简而言之,微调是利用别人已经训练好的网络,针对自己的任务再进行调整。从这个意义上看,不难理解微调是迁移学习的一部分。对于微调,有以下几个常见问题。
(1)为什么需要已经训练好的网络。
在实际应用中,我们通常不会针对一个新任务,从头开始训练一个神经网络。这样的操作显然是非常耗时的。尤其是,我们的训练数据不可能像ImageNet那么大,可以训练出泛化能力足够强的深度神经网络。即使我们有如此之多的训练数据,从头开始训练,其代价也是不可承受的。
那怎么办呢?迁移学习告诉我们,利用之前已经训练好的模型,将它很好地迁移到自己的任务上即可。
(2)为什么需要微调。
因为别人训练好的模型,可能并不完全适用于我们自己的任务。别人的训练数据和我们的数据可能不服从同一个分布;也可能别人的网络能做比我们的任务更多的事情;可能别人的网络比较复杂,而我们的任务比较简单。
举例子来说,假如我们想训练一个猫狗图像二分类的神经网络,那么在CIFAR-100上训练好的神经网络就很有参考价值。但是CIFAR-100有100个类别,我们只需要2个类别。此时,就需要针对我们自己的任务,固定原始网络的相关层,修改网络的输出层,以使结果更符合我们的需要,这样,会极大地加快网络训练速度,对提高我们任务上的精度表现也有很大的促进作用。
(3)微调的优势。
微调有以下几个优势。
● 针对新任务,不需要从头开始训练网络,可以节省时间。
● 预训练好的模型通常是在大数据集上进行训练的,这无形中扩充了我们的训练数据,使模型更鲁棒、泛化能力更好。
● 微调实现简单,我们只需关注自己的任务即可。
深度网络自适应
▊ 基本思路
深度网络的微调可以帮助我们节省训练时间,提高学习精度。但是微调有它的先天不足:它无法处理训练数据,无法测试不同数据的分布情况。因为微调的基本假设也是训练数据和测试数据服从相同的数据分布。这在迁移学习中是不成立的。因此,我们需要更进一步,针对深度网络开发出更好的方法使之更好地完成迁移学习任务。
以前面介绍过的数据分布自适应方法为参考,许多深度学习方法都设计了自适应层(Adaptation Layer)来完成源域和目标域数据的自适应。自适应能够使源域和目标域的数据分布更加接近,从而使网络的精度、稳定性更好。
从上述分析可以得出,深度网络的自适应主要完成两部分工作。
(1)决定哪些层可以自适应,这决定了网络的学习程度。
(2)决定采用什么样的自适应方法(度量准则),这决定了网络的泛化能力。
早期的研究者在2014年环太平洋人工智能大会(Pacific Rim International Conference on Artificial Intelligence,PRICAI)上提出了名为DANN(Domain Adaptive Neural Networks)的神经网络[Ghifary et al.,2014]。DANN的结构异常简单,它只由两层神经元——特征层神经元和分类器层神经元组成。作者的创新之处在于,在特征层后加入MMD适配层,用来计算源域和目标域的距离,并将其加入网络的损失中进行训练。但是,由于网络太浅,表征能力有限,故无法很有效地解决领域自适应问题。因此,后续的研究者大多都基于其思想进行改进,如将浅层网络改为更深层的AlexNet、ResNet、VGG等,将MMD换为多核MMD等。
下面将介绍几种常见的深度网络自适应方法。
▊ 基本方法
(1)DDC方法。
加州大学伯克利分校的Tzeng等人首先提出了DDC(Deep Domain Confusion)方法来解决深度网络的自适应问题[Tzeng et al.,2014]。DDC方法遵循了上面讨论过的基本思路,采用了在ImageNet数据集上训练好的AlexNet网络进行自适应学习[Krizhevsky et al.,2012]。
下图是DDC方法示意图。
DDC方法固定了AlexNet的前7层,在第8层(分类器前一层)上加入了自适应的度量。自适应度量方法采用了被广泛使用的MMD准则。
为什么选择倒数第2层?DDC方法的作者在文章中提到,他们经过多次实验,在不同的层进行了尝试,最终发现在分类器前一层加入自适应可以达到最好的效果。这与我们的认知也是相符合的。通常来说,分类器前一层即特征,在特征上加入自适应,也正是迁移学习要完成的工作。
(2)DAN方法。
清华大学的龙明盛等人于2015年发表在ICML(Internation Conference on Machine Learning)上的DAN(Deep Adaptation Networks)方法对DDC方法进行了几个方面的扩展[Long et al.,2015a]。首先,有别于DDC方法只加入一个自适应层,DAN方法同时加入了3个自适应层(分类器前3层)。其次,DAN方法采用表征能力更好的多核MMD(MK-MMD)度量来代替DDC方法中的单核MMD[Gretton et al.,2012]。最后,DAN方法将多核MMD的参数学习融入深度网络的训练中,并且未额外增加网络的训练时间。DAN方法在多个任务上都取得了比DDC方法更好的分类效果。
为什么适配3层?原来的DDC方法只适配了1层,现在DAN方法基于AlexNet网络,适配最后3层(第6、7、8层)。因为Jason在文献[Yosinski et al.,2014]中已经提出,网络的迁移能力从这3层开始就会有特定的任务倾向,所以要着重适配这3层。至于别的网络(如GoogLeNet、VGG等)是不是适配这3层就需要通过自己的实验来验证,要注意的是DAN方法只关注AlexNet。DAN方法示意图如下。
(3)同时迁移领域和任务的方法。
DDC方法的作者Tzeng在2015年扩展了DDC方法,提出了领域和任务同时迁移的方法[Tzeng et al.,2015]。他提出网络要进行两部分迁移。
一是域迁移(Domain Transfer),尤其指适配边缘分布,但没有考虑类别信息。域迁移就是在传统深度网络的损失函数上,再加一个混淆损失(Confusion Loss)函数,两个损失函数一起计算。
二是任务迁移(Task Transfer),就是利用类别之间的相似度进行不同任务间的学习。举个类别之间相似度的例子:杯子与瓶子更相似,而它们与键盘不相似。
现有的深度迁移学习方法通常都只考虑域迁移,而没有考虑类别之间的信息。如何把域迁移和任务迁移结合起来,是一个需要研究的问题。
Tzeng针对目标任务的部分类别有少量标签,剩下的类别无标签的情况,提出名为域迁移和任务迁移的联合CNN体系结构(Joint CNN Architecture For Domain and Task Transfer)。其最大的创新之处在于,提出现有的方法都忽略了类别之间的联系,并提出在现有损失函数的基础上还要再加一个软标签损失(Soft Label Loss)函数。意思就是在源域和目标域进行适配时,也要根据源域的类别分布情况来调整目标域。相应地,他提出的方法就是把这两个损失函数结合到一个新的CNN网络上,这个CNN是基于AlexNet修改而来的。总的损失函数由3部分组成,第1部分是普通训练的损失函数,第2部分是域自适应的损失函数,第3部分是目标域上的软标签损失函数。
下图为同时迁移领域和任务的方法示意图。
该网络由AlexNet修改而来,前面几层无变化,区别是在fc7层后面加入了一个域分类器,在该层实现域自适应,在fc8层后计算网络的损失函数和软标签损失函数。
那么什么是软标签损失?
软标签损失就是不仅要适配源域和目标域的边缘分布,还要把类别信息考虑进去。具体做法如下,在网络对源域进行训练时,把源域中的每一个样本处于每一个类的概率都记下来,然后,对于所有样本,属于每一个类的概率就可以通过先求和再求平均数得到。下为软标签损失示意图。这样做的目的是,根据源域中的类别分布关系,来对目标域做相应的约束。
(4)JAN方法。
DAN方法的作者龙明盛2017年在ICML上提出了JAN(Joint Adaptation Networks)方法[Long et al.,2017],在深度网络中同时进行联合分布的自适应和对抗学习。JAN方法将只对数据进行自适应的方式推广到了对类别的自适应上,提出了JMMD度量(Joint MMD)。下为JAN方法示意图。
(5)AdaBN方法。
与上述研究选择在已有网络层中增加适配层不同,北京大学的H Li和图森科技的N Wang等人提出了AdaBN(Adaptive Batch Normalization)方法[Li et al.,2018],其通过在归一化层加入统计特征的适配来完成迁移。下图是AdaBN方法示意图。
AdaBN方法与其他方法相比,实现起来相当简单,不带有任何额外的参数,在许多公开数据集上都取得了很好的效果。
深度对抗网络迁移
生成对抗网络GAN(Generative Adversarial Nets)是目前人工智能领域的研究热点之一[Goodfellow et al.,2014],它被深度学习领军人物Yann LeCun评为近年来最令人欣喜的成就。由此发展而来的对抗网络,也成为提升网络性能的利器。本节介绍深度对抗网络用于解决迁移学习的基本思路及其代表性研究成果。
▊ 基本思路
GAN受博弈论中的二人零和博弈(Two-Player Game)思想的启发而提出。它包括两部分:生成网络(Generative Network),负责生成尽可能逼真的样本,被称为生成器(Generator);判别网络(Discriminative Network),负责判断样本是否真实,被称为判别器(Discriminator)。生成器和判别器互相博弈,就完成了对抗训练。
GAN的目标很明确,就是生成训练样本,这似乎与迁移学习的大目标有些许出入。然而,由于在迁移学习中天然存在一个源域和一个目标域,因此,我们可以免去生成样本的过程,而直接将其中一个领域的数据(通常是目标域)当作生成的样本。此时,生成器的职能发生变化,不再生成新样本,而去扮演特征提取的功能——不断学习领域数据的特征,使判别器无法对两个领域进行分辨。这样,原来的生成器也可以称为特征提取器(Feature Extractor)。
通常用 来表示特征提取器,用 来表示判别器。
正是基于这样的领域对抗思想,深度对抗网络可以被很好地应用到迁移学习问题中。
与深度网络自适应迁移方法类似,深度对抗网络的损失函数也由两部分构成:网络训练损失函数 和领域判别损失函数 ,如下所示。
▊ 核心方法
(1)DANN方法。
Yaroslav Ganin等人首先在迁移学习中加入了对抗机制,并将他们的网络称为DANN(Domain-Adversarial Neural Networks)方法[Ganin et al.,2016]。在此研究中,网络的学习目标是,生成的特征尽可能帮助区分两个领域的特征,同时使判别器无法对两个领域的差异进行判别。该方法的领域对抗损失函数表示为:
其中
(2)DSN方法。
来自Google Brain的Bousmalis等人提出DSN(Domain Separation Networks)方法对DANN进行了扩展[Bousmalis et al.,2016]。DSN方法认为,源域和目标域都由两部分构成:公共部分和私有部分。公共部分可以学习公共的特征,私有部分用来保持各个领域独立的特性。DSN方法进一步对损失函数进行了定义。
其具体含义如下。
为网络常规训练的损失函数。
为重构损失函数,确保私有部分仍然对学习目标有作用。
公共部分与私有部分的差异损失函数。
源域和目标域公共部分的相似性损失函数。
如下是DSN方法示意图。
(3)SAN方法。
清华大学龙明盛等人2018年发表在CVPR(Computer Vision and Pattern Recognition)上的文章提出了部分迁移学习(Partial Transfer Learning)。作者认为,在大数据时代,通常我们会有大量的源域数据。这些源域数据与目标域数据相比,在类别上通常更为丰富。例如,基于ImageNet训练的图像分类器,必然是针对几千个类别进行的分类。在实际应用时,目标域往往只是其中的一部分类别。这样就会带来一个问题:那些只存在于源域中的类别在迁移时,会对迁移结果产生负迁移影响。这种情况是非常普遍的,因此,就要求相应的迁移学习方法能够对目标域选择相似的源域样本(类别),同时也要避免负迁移。但是目标域通常是没有标签的,因此我们并不知道它和源域中哪个类别更相似。作者称这个问题为部分迁移学习(Partial Transfer Learning)。Partial即只迁移源域中和目标域相关的那部分样本。
下图展示了部分迁移学习示意图。
作者提出了名为选择性对抗网络(Selective Adversarial Networks,SAN)的方法来处理选择性迁移问题[Cao et al.,2017]。在该问题中,传统的对抗网络不再适用。所以需要对其进行一些修改,使它能够适用于选择性迁移问题。
#欢迎来留言#
你在工作中有使用深度迁移学习技术吗?
你对深度学习有什么看法?
我们会挑选出10名优质留言
AI科技大本营携手【电子工业出版社-博文视点】送出
《深度学习500问:AI工程师面试宝典》一本
截至1月26日14:00点
▊《深度学习500问:AI工程师面试宝典》
谈继勇 主编,郭子钊、李剑、佃松宜 副主编
Github 标星4.2万的火爆之作
历时3年,融合产学研的精心制作
集百家所长,凝聚了众多一线科研人员及工程师的经验
让你不再因为缺乏基础知识而对深度学习望而却步
细化问题,助你面试查漏补缺,重点突破
兼具广度与深度,深度学习知识框架的全景图呈现
本书凝聚了众多一线科研人员及工程师的经验,旨在培养读者发现问题、解决问题、扩展问题的能力。本书内容取材于编者在日常学习过程中总结的知识点及各大公司常见的笔试、面试题。是一本兼具广度与深度的著作。(点击阅读原文可购买本书哦~)
更多精彩推荐
☞猖狂!微软、思科源码惨遭黑客 100 万美元打包出售
☞『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码
☞龙泉寺贤超法师:用 AI 为古籍经书识别、断句、翻译
☞微信十周年,腾讯晒成绩单了!
点分享点收藏点点赞点在看
相关文章:

Visual Studio 2005 IDE 技巧和窍门
发布日期: 2007-02-26 | 更新日期: 2007-02-26James Lau Microsoft 项目经理 适用于: Microsoft Visual Studio 2005 摘要:Visual Studio 2005 是目前业内一流的开发工具,我想在此与大家分享一些使用技巧和窍门&#x…

ZOJ 1025 Wooden Sticks(快排+贪心)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId25 题目大意:机器运送n个木条,每个木条有一个长度和重量。运送第一根木条需要1分钟的准备时间,接下来如果后一根木条的长度和重量都大于等于前一根木条&…
Swift:UIKit中Demo(一)
关于Swift的基本概念及语法知识。我在前面的章节中已经介绍了非常多。这一节和下一节主要有针对性的解说Swift在实际UIKit开发中的使用场景及注意点。先来看看Demo的终于效果图。Demo分析: 1. 界面上面有三个button,他们的宽度不一致。 2. 点击每一个but…

jdbc封装与多并发的共鸣
欢迎来到:http://observer.blog.51cto.com代码的封装是一门艺术,封装得好,不但给自己便利,还可以给自己的维护提供帮助;同时,封装得好,还可以给看自己代码的人以赏心悦目的感觉,团队…

计算机视觉怎样实现自我超越?更大规模更精准的数据
最新发布的《2021中国人工智能应用趋势报告》强调,数据、算力和算法是支撑人工智能发展的"三驾马车",为模型训练提供基本资料的「数据」,是人工智能的根基。 随着互联网、社交媒体、移动设备和传感器的大量普及,其产生…

Visual Studio 2005 Web Deployment Projects版本不同引发的问题
为了方便Visual Studio 2005发布为单一dll,微软发布了一个Visual Studio 2005 插件,Visual Studio 2005 Web Deployment Projects,在微软的不同文档里,这个插件提供了两个下载地址,分别是: 下载地址一&…

【书籍下载链接】_2_第二轮_计算机专业书籍
各位朋友,下面是我收集的书籍,介绍给大家,有需要可以分享给大家,如果看的还可以,请购买纸质版的图书。 驱动器 J 中的卷是 Elements 卷的序列号是 8AAF-3206 j:\ 的目录 2014/01/20 20:00 1,533,385 WinCE.pdf2010/09/…

VS2005发布、生成网站时如何设置固定的dll文件名?
在用VS2005发布网站项目时,默认生成bin目录下的.dll文件名是随机命名的; 如果要固定生成文件名如何固定呢?有以下两种方案: 一、每个页面的程序集分别生成对应的dll; 方法:在“发布网站”的选项中,勾选“使用固定命名和单页程…

android 广播机制
1:首先说andoid 广播分为系统的和 自定义的 2:注册方式呢,也是两种,1:静态注册,在manifest.xml 文件中注册的 2:动态注册,用filter 区分 不说了 占代码 首先是动态注册:…
2021第一融!第四范式完成D轮7亿美元融资
来源丨第四范式头图丨来源于第四范式近日,第四范式宣布完成D轮融资,融资金额7亿美元。本轮融资由春华资本、博裕资本、厚朴投资领投,并引入国家制造业转型基金、国开、国新、中国建投、中信建投、海通证券等战略股东,红杉中国、中…

springboot-26-springboot 集成rabbitmq
rabbitmq是基于AMQP规范的一个消息代理, 它可以兼容jms, 支持其他语言, 并且可以跨平台 1, 安装 1) 普通安装 度娘: 2) docker 安装 sudo docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:3-management 安装成功后: 使用 guest/guest 用户登录 2 使用: 1) 添加 rabbi…

asp.net中的联动菜单
目标达到的效果:两个下拉框,第二个跟随第一个变化而变化,使用客户端脚本JavaScript在ASP.NET环境下实现。 第一步:建立JavaScript脚本: 在Page_Load中建立并注册这个js脚本: string scriptKey "Menu…
2020长沙“科技之星”榜单重磅揭晓,近百家企业凭实力“出道”!
今天,「INFLUENCE长沙 2020年度“科技之星”企业评选」(下文统称「长沙科技之星」)圆满收官,评选结果正式揭晓!作为专业的 IT 社区,CSDN 多年来与千万技术人员、技术企业共同见证了产业的发展和时代的变更…

CENTOS6.4 IBUS输入法不显示候选词解决办法
IBUS输入法 不显示候选词原因分析:输入im-chooser时候,显示找不到gtk模块;原因为升级python后的版本,不能导入gtk。找到能够导入gtk版本的python,然后默认python设置为此版本。故障解决:删除或更改默认python版本# whi…

sql server 表索引碎片处理
DBCC SHOWCONTIG (Transact-SQL) SQL Server 2005 其他版本更新日期: 2007 年 9 月 15 日 显示指定的表或视图的数据和索引的碎片信息。 重要提示:后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修…

ASP.NET2.0 GridView小技巧汇粹
1)GridView绑定数据源控件,需要有编辑和删除选项按钮时,数据源控件必须提供SQL操作语句或存储过程调用,一般,我的推荐做法是,使用无意义的SQL语句或存储过程来使GridView的编辑和删除按钮可以生成,具体的编辑更新和删除操作在代码运行时而不是在控件设计时指定,虽然多写了一点代…
树莓派出微控制器了!Raspberry Pi Pico 只需 4 美元
整理 | 郑丽媛来源 | CSDN(ID:CSDNnews)昨天,树莓派搞了个大动作:推出了首款微控制器开发板 Raspberry Pi Pico!该开发板基于树莓派开发的全新芯片——RP2040,并且作为双核 Arm Cortex-M0 的它…

“chaos”的算法--之链表面试题
【 声明:版权所有,欢迎转载。 联系信箱:yiluohuanghungmail.com】前两天倩仔仔给我了一套试题让我看,整体来说感觉题都还算不错,从中随便找了两道。先看题吧!1、怎样判断一个单链表中是都存在环路ÿ…

ABP官方文档翻译 6.1.2 MVC视图
ASP.NET MVC 视图 介绍AbpWebViewPage基类介绍 ABP通过Abp.Web.Mvc nuget包集成到MVC视图。你可以如往常一样创建正常的MVC视图。 AbpWebViewPage基类 ABP提供了AbpWebViewPage,它定义了一些有用的属性和方法。如果你使用启动模板创建的工程,那么你所有的…

ASP.NET 打开新窗口几种方法
ASP.NET打开新窗口方法一:Response.Write("<script language/"javascript/">window.open(aaa.aspx,新窗口,/"toolbaryes,locationno,directoriesyes,statusyes,menubaryes,resizableyes,scrollbarsyes/");</script>");这种方式代码每…

Hibernate的使用梳理
Hibernate创建步骤 (五大核心接口:Configuration/SessionFactory/Session/Transaction/Query) 1.新建java工程,导入需要的jar包。 2.创建hibernate.cfg.xml配置文件和Test.java工具类。配置好相应的实体对象User.java User.hbm.x…
驭势科技引入国家队战略注资,完成超10亿元人民币融资
2021年1月25日,驭势科技(UISEE)宣布完成累计金额超10亿元人民币的新一轮融资,并获得国开制造业转型升级基金的战略注资。这是国开制造业转型升级基金在自动驾驶领域的首笔投资。2019年11月,国家制造业转型升级基金股份…

[Python爬虫] 之二十二:Selenium +phantomjs 利用 pyquery抓取界面网站数据
一、介绍 本例子用Selenium phantomjs爬取界面(https://a.jiemian.com/index.php?msearch&aindex&typenews&msg电视)的资讯信息,输入给定关键字抓取资讯信息。 给定关键字:数字;融合;电视 抓取…

android高级编程-android高级应用
android高级应用>>>第一阶段程序员基本素质养成程序员所需要具备的12条职业素质让学员初步了解和审视自己所应该具备的职业素质。并且我们会在授课中随时训练和贯彻这样的素质,最终把大家捏成专业的职业的程序员。迭发各个环节及工具初步介绍总概性的讲解一…

asp.net三种重定向方法的总结
(1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页面转向到m2.aspx, 并将转向前数据加上m2.aspx页结果返回给浏览器. (2)Server.Execute方法: Server.Execute("m2.aspx"…
区区几行Python代码,一分钟搞定一天工作量
作者 | 陈熹、刘早起来源 | 早起Python大家好,我是早起。前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下。由于涉及文件私密所以具体内容已做脱敏处理…

bc计算命令的知识及企业计算案例
bc命令的用法:bc是unix下的计算器,它也可以用在命令行下面:例:给自变量i加1i2iecho $i1|bc -----效率低#因为bc支持科学计算,所以这种方法功能非常强大[rootXCN ~]# echo 11|bc 2 [rootXCN ~]# echo 1*1|bc 1 […

ExecutorService与Executors例子的简单剖析(转)
对于多线程有了一点了解之后,那么来看看java.lang.concurrent包下面的一些东西。在此之前,我们运行一个线程都是显式调用了 Thread的start()方法。我们用concurrent下面的类来实现一下线程的运行,而且这将成为以后常用的方法或者实现思路。 …

GridView隐藏列取值解决方案
【摘要】 在Asp.net 2.0中增加了一个新的数据绑定控件:GridView,其目的用来取代Asp.net1.x中的DataGrid控件,但有一点很不爽的是,如果把某列设置为visiblefalse,则不会进行数据绑定,也就是说无法直接从Grid…

百度飞桨成为北京市首个AI产业方向创新应用平台
1月20日,北京市经济和信息化局正式授予百度公司"北京市人工智能产业创新应用平台(百度飞桨)"。当前,北京市正在创建国家人工智能创新应用先导区,人工智能作为新科技革命和产业变革前沿领域,是北京…