本文提出了二进制架构搜索(BATS),这是一个通过神经架构搜索(NAS)大幅缩小二进制神经网络与其实值对应的精度差距的框架。实验表明,直接将NAS 应用于二进制领域的结果非常糟糕。为了缓解这种情况,本文描述了将 NAS 成功应用于二进制领域的 3 个关键要素:
实验重新结果证明了所提出的方法的有效性和直接在二进制空间中搜索的必要性。并且,在CIFAR10、CIFAR100 和 ImageNet 数据集上设计了 SOTA 的二元神经网络架构。
标准 DARTS 搜索空间下搜索得到的网络结构二值化训练是无法收敛的 ,原因如下:
二值神经网络搜索空间与标准 DARTS 搜索空间对比如下图所示:
主要存在以下几方面的修改:
尽管 DARTS 取得了成功,但根据随机种子的不同,DARTS 的精度在运行之间可能会有很大的差异。事实上,在有些情况下,随机搜索获得的架构甚至比搜索得到的架构通过表现的更好。此外,特别是当训练时间较长或在较大的数据集上进行搜索时,DARTS可能会出现 Skip-Connect 富集的问题。常用的解决方法包括:
但是,这种机制仍然会导致大量的随机性,而且并不总是有效的:例如,它可能会用池化层(没有学习能力)取代跳过连接,或者搜索的架构跳连包含的太少。当搜索是在二进制域中直截了当地进行时,这样的问题就更加明显了。鉴于在搜索过程中,节点 j 的输入是通过对所有输入边的加权和来获得的,为了最大限度地提高信息流,架构参数 α 倾向于收敛到相同的值,使得最终架构的选择存在问题,并且容易受到噪声的影响,导致拓扑结构的性能可能比随机选择更差。此外,搜索高度偏向于实值 *** 作(池化和跳连),使得搜索在早期阶段可以提供更大的收益。
为了缓解上述问题,并使得搜索程序更具辨别力,迫使其做出 "harder" 的决策,本文借鉴知识蒸馏的思路,建议使用温度因子 T<1 的正则策略,定义从节点i到j的流程如下公式所示:
采用温度正则方法可以 使架构参数的分布不那么均匀,更加尖锐(即更有辨别力) 。在搜索过程中,由于信息流是使用加权进行聚合的,所以网络不能从所有信息流中提取信息,来平等地(或接近平等地)依赖所有可能的 *** 作。相反,为了确保收敛到一个满意的解决方案,它必须将最高的概率分配给一个非0 *** 作的路径,由一个次元温度(T <1)强制执行。这种行为也更接近评估过程,从而减少搜索(网络从所有路径中提取信息)和评估之间的性能差异。
上图中,图1描述了给定单元在不同温度下的架构参数分布。对于低温(T=02),网络被迫做出更多的判别性决策,这反过来又使它减少了对 Skip-Connect 的依赖。图2 进一步证实了这一点,它描述了在不同温度下搜索过程结束时,在 Normal Cell 中各 *** 作被选择的概率。
尽管二值网络具有加速和节省空间的特点,但与实值网络相比,二值网络的训练仍然比较困难,其方法通常需要一个预训练阶段或仔细调整超参数和优化器。对于搜索二值网络的情况,直接实现二值权重和激活的架构搜索,在大多数尝试中,要么导致退化的拓扑结构,要么训练简单地收敛到极低的精度值。此外,直接在实域中执行搜索,然后对网络进行二值化是次优的。
为了缓解这个问题,本文提出了一个两阶段的优化过程, 在搜索过程中,激活是二值化的,而权重是实值化的,一旦发现了最佳架构,我们在评估阶段也要对权重进行二值化 。更具体地说,在评估过程中,首先从头开始训练一个具有二值激活和实值权重的新网络,然后对权重进行二值化。最后,在测试集上对完全二值化的网络进行评估。这是因为实值网络的权重通常可以被二值化,而不会显著降低精度,但激活的二值化就不一样了,由于可能的状态数量有限,网络内部的信息流急剧下降。因此,本文提出将问题有效地分成两个子问题:权重和特征二值化,在搜索过程中,尝试解决最难的一个问题,即激活的二值化。一旦完成了这一点,权重的二值化以下总是会导致精度的小幅下降(~1%)。
机器学习在有一件事上一直做得不好,那就是学习新任务的时候会忘记之前完成过的任务。
在监督学习任务中,监督学习的目标是构建模型fx,用于预测与看不见的特征向量关联的目标向量x,为此,监督学习方法通常采用ERM原则。但是ERM的直接应用会导致“灾难性的遗忘”,也就是说,机器的学习在接触新任务后会忘记如何解决过去的任务。作者们提出了一种新的学习度量,用于评估模型如何在一系列学习任务中迁移知识。最终,作者们提出了一个新的顶级表现的算法—— 梯度片段记忆(GEM) ,它使得学习机器在学习新任务的时候也可以不忘记以往学到的技能,同时能够使有益的知识转移到先前的任务。
机器在学习当前任务时,可以访问之前所有任务的部分数据,它们被收集在一个称为“episodic memory”的地方。作者提出了“Gradient Episodic Memory”的方法来利用“episodic memory”解决机器遗忘的问题。
以往机器有关序列学习的任务都有若干特点:
1任务数量少,但每个任务所要学习的例子很多
2学习机器对每个任务的例子进行了几次复习
3报告的平均绩效是唯一的指标
但本文的作者采用一种“ 更像人类 ”(“more human-like”)的学习任务来测试GEM模型,该种任务的特点:
1任务数量大,但每个任务的训练示例数量少,
2学习只观察每个任务的示例一次
3增加报告测量迁移的绩效和遗忘的指标 ,作者认为除了观察其跨任务的绩效外,评估转移知识的能力也很重要
在学习任务的框架中, 作者定义了3个任务指标——ACC/BWT/FWT 。
这些指标越大代表了模型建立越完美,如果两个模型的ACC相同,BWT和FWT的值越大的模型越好(文章并没有比较BWT和FWT,是不是说明ACC是下位的指标)。对于学习的精细度(fine-grained evaluation)评估,可以通过更构建一个行数多于任务数的矩阵R中的元素Ri,j(为观察连续体中第i个样本后对任务tj的测试精度)来进行评估。
EGM算法 :
作者在任务k的工作记忆上定义如下损失函数:
其中Mk 表示任务k的memory。但这种方式容易在Mk中的样本上过拟合。作者尝试一种方法,通过构建一个不等式约束,让其只减不增。作者新定义了一个学习函数模型:
其中 是学习前一个任务后的模型。作者进一步观察到,其实并不需要保存之前的模型,只需要在模型参数更新后,之前任务的损失不增加就可以了。这可以通过计算梯度的夹角来确定:
如果夹角为锐角,则学习当前任务时,任务k的性能就不会增加。如果夹角不是锐角,通过投影的方法,将梯度g投影到最近的梯度 上,并且建立优化函数求解
文章还通过实验来评估GEM在连续学习中的表现。
实验采用3个数据集(datasets)——MNIST Permutations;MNIST Rotations;CIFAR 100。对于所有数据集,实验给出了T = 20个任务。在MNIST数据集上,每个任务都有来自10个不同类别的1000个示例。在CIFAR100数据集上,每个任务都有来自5个不同类别的2500个示例。该模型按顺序观察任务,每个示例观察一次。在每个数据集的测试分区上执行每个任务的评估,记录ACC,BWT,FWT的值。
不仅如此,作者还将GEM和其他算法(single,independent, iCaRL和EWC)一起比较,观察和记录各项指标来观察GEM的绩效。
实验结果:
图左为所有数据集和方法的指标数据分析图,图右显示的是不同方法在整个连续性数据中第一个任务的测试准确性的演变。可以观察到,总的来说,GEM的性能与多模态模型(the multimodal model)相似,甚至更好,并且这些模型非常适用于MNIST任务;不仅如此,GEM在CIFAR100中表现出最小的遗忘和正向后移(backward transfer)。GEM的性能明显优于其他的持续学习方法,并且计算量更少。综合后续的CPU训练时间、工作记忆容量的实验测量后,可以观察到GEM优质的性能。
实验虽然展示出了GEM的高性能,作者表明但仍然有3点不足:
1首先,GEM没有利用结构化的任务描述符,而描述符可以被用来获得零镜头学习(zero-shot learning)。
2其次,实验没有研究高级记忆管理(例如构建任务的核心集)。
3第三,每个GEM迭代要求每个任务向后通过一次,这增加了计算时间。当然,如何解决计算时间也是作者自身准备研究的方面。
datapy:
#coding:utf-8"""
Author:wepon
Source:
由于Keras系统升级,cnnpy代码调整如下:
#coding:utf-8'''
GPU run command:
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python cnnpy
CPU run command:
python cnnpy
'''
#导入各种用到的模块组件
from __future__ import absolute_import
from __future__ import print_function
from keraspreprocessingimage import ImageDataGenerator
from kerasmodels import Sequential
from keraslayerscore import Dense, Dropout, Activation, Flatten
from keraslayersadvanced_activations import PReLU
from keraslayersconvolutional import Convolution2D, MaxPooling2D
from kerasoptimizers import SGD, Adadelta, Adagrad
from kerasutils import np_utils, generic_utils
from sixmoves import range
from data import load_data
import random
#加载数据
data, label = load_data()
#打乱数据
index = [i for i in range(len(data))]
randomshuffle(index)
data = data[index]
label = label[index]
print(datashape[0], ' samples')
#label为0~9共10个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数
label = np_utilsto_categorical(label, 10)
###############
#开始建立CNN模型
###############
#生成一个model
model = Sequential()
#第一个卷积层,4个卷积核,每个卷积核大小55。1表示输入的的通道,灰度图为1通道。
#border_mode可以是valid或者full,具体看这里说明:>
本文重点介绍贝叶斯卷积神经网络,这是由Backprop在贝叶斯基础上构建的卷积神经网络的变体。本文演示了这种新颖的可靠的变分推理方法如何可以用作各种网络体系机构的基础构造。在监督学习中设置多个数据集(MNIST、CIFAR-10、CIFAR-100、STL-10)上,我们提出的变分推理方法在相同的体系结构中具有与频繁推理相同的性能,同时自然地结合了不确定性和正则化的度量。目前,已经实现了前馈和递归神经网络中成功实现。但在卷积神经网络中却没有成功实现。这项工作象征着贝叶斯神经网络的扩展,该网络已涵盖上述所有三种类型的网络体系结构。
卷积神经网络擅长图像分类领域的任务,但是从概率论的角度来看,使用以权重为基础进行任何分类的点估计是不合理的。但是CNN需要大量的数据集进行训练,并且非常容易在较小的数据集上过度拟合。
在本文中,我们研究了如何通过贝叶斯方法应用于其训练来增加CNN的不确定性和正则化。这种方法允许网络通过其参数来表达不确定性(图1)。同时,通过使用先验的概率分布来整合参数,我们可以在训练过程中对许多模型进行平均,从而为网络提供正则化效果,从而避免过度拟合。
我们通过Backup在贝叶斯上建立贝叶斯CNN,并用变分分布 估计难以处理的真实后验概率分布 ,该分布包括高斯分布 R 和 R的性质,表示为 。变异推理的后验形式表示不确定性估计的质量,从而表示模型的整体性能。换句话说,CNN越小,其CNN分类的不确定性就越小。本文的主要贡献如下:
1介绍了如何将Backprop的贝叶斯算法有效的应用于CNN;
2根据经验表明,我们针对CNN提出的通用且可靠地变分推理方法可以应用于各种CNN体系结构,而对其性能没有任何限制;
3研究了如何通过将贝叶斯方法应用于CNN的训练来增加CNN的不确定性和正则化。
这项工作代表了贝叶斯神经网络的发展,该网络在包括前馈,递归和卷积神经网络。本文结构如下:首先介绍了该领域的相关工作;其次,解释了基于贝叶斯的Backprop方法;第三,详细解释了我们提出的BayesCNN体系结构。最后,我们通过对各种体系结构和数据集上的拟议模型进行实验评估,并总结。
过去已经研究了将贝叶斯方法应用于神经网络,并针对顽固的真实后验概率采用了各种近似方法。 Buntine和Weigend(1991)为神经网络提出了各种最大后验(MAP)方案,包括以模式为中心的近似后验。 Buntine和Weigend(1991)还建议在使用二阶导数之前,以鼓励所得网络的平滑性。在Hinton和Van Camp(1993)的后续工作中,提出了变分方法来压缩神经网络的权重作为正则化器。 Hochreiter和Schmidhuber(1995)建议考虑信息理论的观点,并为单层网络使用最小描述长度(MDL)损失,该损失会通过基于输出权重扰动的近似惩罚来惩罚非鲁棒权重。Denker Lecun(1991)和MacKay(1995)使用拉普拉斯逼近法研究了神经网络的后验。作为对拉普拉斯逼近法的局限性的回应,尼尔(2012)研究了混合蒙特卡罗算法在训练神经网络中的用途,尽管迄今为止很难将其应用于现代应用中构建的大型网络。最近,Graves(2011)为神经网络和Blundell等人推导了一种变分推理方案。 (2015年)对此进行了扩展,增加了方差的更新,该方差是无偏的且易于计算。 Graves(2016)在混合后验的情况下推导了类似的算法,一些作者声称辍学(Srivastava等人2014)和高斯辍学(Wang and Manning 2013)可以看作是近似变分推理方案(Gal和Ghahramani) 2015,Kingma,Salimans和Welling 2015)。特别是Gal Ghahramani(2015年,由于他们还提出了贝叶斯CNN,因此在本文的结论中进行了进一步的研究。
Bayes by Backprop是一种变分推理方法,用于学习神经网络的权重 d的后验分布,从中可以在反向传播中对权重w进行采样。由于真实后验通常是难解的,因此定义了一个近似分布 ,旨在于真实后验 尽可能相似,我们见最优参数 opt定义为:
这种推导形成了一个优化问题,其结果成本函数被广泛称为变分自由能,该函数建立在两个术语上:前者, ,取决于先验p(w)的定义,因此称为复杂度成本;而后者, 取决于p(D|w),称为似然成本。由于这是一个常数,因此可以在优化中省略残差 logp(D)。由于KL散度也难以精确计算,因此我们采用随机变分方法。我们从变分分布 进行采样,因为从变数后验 提取样本比从真实后验 提取样本的可能性大的多,后者对于数值方法很方便。因此,我们得出了易于处理的成本函数:
我们从 采样 。贝叶斯由Backprop训练的神经网络提供的不确定性已成功用于在监督和强化学习环境中训练前馈神经网络(Blundell等人2015,Lipton等人2016,Houthooft等人2016),用于训练递归神经元网络,但未应用于卷积神经网络。
在本节中,我们详细说明了构建CNN的算法,该算法在每个过滤器中权重分布上具有概率分布,如图1所示,并应用贝叶斯推断来计算后验,如上一节所述。 对于大多数CNN架构而言,CNN并不是仅仅通过在卷积层中的权重上放置概率分布来实现的。 它还要求将权重上的概率分布放置在完全连接的层中(参见图2)。
为了减少随机梯度的方差,我们应用了局部重新参数化技巧。继Kingma、Salimans和Welling和Neklyudov等人之后。我们不对权重w进行采样,而是由于层激活b的计算加速而对层激活b进行采样。后验变化
允许在卷积层中实现局部重聚化技巧:
其中, ~ ,Ai是接收场,表示卷积运算和逐分量相乘。
图1具有示例性像素值,过滤器的输入图像,以及带有权重的点估计(左)和概率分布(右)的相应输出。
为CNN分配权重分布而不是点估计的关键在于应用两个卷积运算,而带点估计的滤波器则应用一个卷积运算。由于我们部署了前面描述的局部重新参数化技巧,并从输出中进行采样,因此我们有资格分别计算确定分布的两个变量,即均值和方差。我们在两个卷积运算中进行了解此 *** 作:首先了解权重概率分布的均值,其次了解方差。
图2中,卷积层的滤波器中的权重和完全连接层中的权重具有概率分布的形式。
中, 是唯一可学习的参数(Molchanov,Ashukha和Vetrov 2017)。换种说法,当我们在第一个卷积运算中学习MAP时,我们在第二个卷积运算中观察了权重值与该MAP的偏离量。该过程等效地在完全连接的层中完成。为了加速计算,我们确保方差永远不会为0,并且为了提高准确性,我们学习 并使用Softplus激活函数,其原因将在下一部分中进行阐述。
对于所有进行的实验,我们在LeNet-5、3Conv3FC和AlexNet中实现了贝叶斯CNN的描述。确切的体系结构规范可以在附录中找到。我们分别使用MNIST手写数字数据集,CIFAR-10和CIFAR-100数据集以及STL-10训练网络,因为这些数据集广泛用作CNN的基准。在所有体系结构中,最初选择的激活函数都是ReLU函数,但是由于我们要应用两个卷积或完全连接的运算方法,因此必须引入另一个称为Softplus的函数。其中,一种是确定均值,另一种是确定方差。精确地,我们应用Softplus函数是因为我们旨在确保方差永远不会为0,因为这等同于仅计算MAP,这可以解释为等效于最大似然估计,而该值进一步等于Softplus激活函数是ReLU的平滑近似,具有微妙的影响,但实际上并没有,也需分析。
默认情况下: 。图3显示了分别在所有四个数据集上训练的3Conv3FC架构(具有统一的先验分布和对参数的点估计)的验证准确性。图4显示了3Conv3FC,LeNet-5和AlexNet架构(具有统一的先验分布和点估计、超参数 )仅适用于CIFAR-10数据集。
我们在多个数据集上进行上述架构的网络,这些数据集是MNIST、CIFAR-10和CIFAR-100、STL-10等。MNIST数据集是由60000个训练图像和10000个验证像素图组成,大小为2828。每个图像都用其相应的数字标记[0,9]。
验证集中正确预测的准确性在图3中以粉红色显示。CIFAR-10上的分类:CIFAR-10数据集由10个类别的60000个3232彩色图像组成,每个类6000张,5000个训练和1000个验证。结果在图3中以红色显示。在CIFAR-100上分类:该数据集类似于CIFAR-10,不同之处在于它有100个类别,每个类别包含600张图像,每个包含500张训练图像和100张验证图像,图像的分辨率为3232像素,结果在图3中以蓝色显示。STL-10上的分类,STL-10 是一个图像识别的数据集,受到CIFAR-10数据集的启发,除了每累500个训练图像外,还包含100000个无标签图像用于无监督学习。图像是彩色的,尺寸为9696像素。值得注意的是,此处仅标记了训练集。结果在图3中以绿色给出。
表1比较了上一节中提到的所有4个数据集的贝叶斯架构和点估计架构的验证准确性(百分比)。图3和图4中值得注意的两个非常有趣的方面是:首先,BayesCNN取得了更好的结果,或者当使用较大的数据集(CIFAR-100)时,此趋势相反。其次,与初始评估精度相当高的权重为店估计的架构相比,在初始时期,BayesCNN的初始认证非常低。前一个发现必须从以下现象得出:贝叶斯方法通常在小型数据集上表现良好,这是因为在合理定义先验概率分布时存在领域知识或信念。
验证准确性超过100个,在参数 上具有均匀先验分布的实践。以点估计 为参数的虚线。显示的实验选择的体系结构是3Conv3FC。
在3Conv3FC,LeNet和AlexNet架构上的验证准确性超过100个。在参数 上具有均匀先验分布的实践。以点估计 为参数的虚线。为显示的实验选择的数据集为CIFAR-10
后一个发现解决了以下问题:BayesCNN用均匀分布初始化,而点估计模型使用Xavier初始化进行初始化。后一种方法相当直观,并且可以确保初始化的权重既不会太小也不会太大。换句话讲,Xavier初始化的动机是以神经元激活功能不再饱和或死区开始的方式初始化网络的权重。如果均匀分布,则情况并非如此,因此,BayesCNN的初始验证准确性可能会相对较低。但是,如果将所有零权重的惯常主义体系进行初始化,我们希望网络精度与BayesCNN的验证精度曲线共享相同的曲线。
我们通过利用Backprop的Bayes作为可靠的,可变的CNN推论方法,提出了CNN,BayesCNN的贝叶斯解释,该方法迄今为止尚未研究。Gal和Ghahramani进行了探索性工作,他们利用辍学函数的各种输出来定义分布,并得出结论,我们可以说是贝叶斯CNN。但是,我们强烈反对这种方法,并声称存在严重缺陷,因此不能将其解释为贝叶斯神经网络。具体来说,不会在CNN的参数上放置任何先前的分布。但是,这些只是贝叶斯定理包含贝叶斯定理的一个简单原因,因此象征了贝叶斯解释的很大一部分。因此,先验分布的放置体现了整个思想流派的基础。相比之下,我们对网络的参数采取了完全贝叶斯的观点,即将先验分布放在其上,并根据贝叶斯定理用变分推断对其进行更新,正好是Backprop的Bayes。此外,我们证明了该网络达到了最新的结果,这是由具有相同网络架构的网络以点估计权重而不是分布的网络架构实现的。
作为进一步增强优化稳定性的一种附加方法,后锐化(Fortunato,Blundell和Vinyals 2017)可在以后的工作中应用于贝叶斯CNN。
Scikit-learn
Scikit-learn是基于Scipy为机器学习建造的的一个Python模块,他的特色就是多样化的分类,回归和聚类的算法包括支持向量机,逻辑回归,朴素贝叶斯分类器,随机森林,GradientBoosting,聚类算法和DBSCAN。而且也设计出了Pythonnumerical和scientificlibrariesNumpyandScipy
2Pylearn2
Pylearn是一个让机器学习研究简单化的基于Theano的库程序。
3NuPIC
NuPIC是一个以HTM学习算法为工具的机器智能。HTM是皮层的精确计算方法。HTM的核心是基于时间的持续学习算法和储存和撤销的时空模式。NuPIC适合于各种各样的问题,尤其是检测异常和预测的流数据来源。
4Nilearn
Nilearn是一个能够快速统计学习神经影像数据的Python模块。它利用Python语言中的scikit-learn工具箱和一些进行预测建模,分类,解码,连通性分析的应用程序来进行多元的统计。
5PyBrain
Pybrain是基于Python语言强化学习,人工智能,神经网络库的简称。它的目标是提供灵活、容易使用并且强大的机器学习算法和进行各种各样的预定义的环境中测试来比较你的算法。
6Pattern
Pattern是Python语言下的一个网络挖掘模块。它为数据挖掘,自然语言处理,网络分析和机器学习提供工具。它支持向量空间模型、聚类、支持向量机和感知机并且用KNN分类法进行分类。
7Fuel
Fuel为你的机器学习模型提供数据。他有一个共享如MNIST,CIFAR-10(数据集),Google’sOneBillionWords(文字)这类数据集的接口。你使用他来通过很多种的方式来替代自己的数据。
8Bob
Bob是一个的信号处理和机器学习的工具。它的工具箱是用Python和C语言共同编写的,它的设计目的是变得更加高效并且减少开发时间,它是由处理图像工具,音频和处理、机器学习和模式识别的大量包构成的。
9Skdata
Skdata是机器学习和统计的数据集的库程序。这个模块对于玩具问题,流行的计算机视觉和自然语言的数据集提供标准的Python语言的使用。
10MILK
MILK是Python语言下的机器学习工具包。它主要是在很多可得到的分类比如SVMS,K-NN,随机森林,决策树中使用监督分类法。它还执行特征选择。这些分类器在许多方面相结合,可以形成不同的例如无监督学习、密切关系金传播和由MILK支持的K-means聚类等分类系统。
11IEPY
IEPY是一个专注于关系抽取的开源性信息抽取工具。它主要针对的是需要对大型数据集进行信息提取的用户和想要尝试新的算法的科学家。
12Quepy
Quepy是通过改变自然语言问题从而在数据库查询语言中进行查询的一个Python框架。他可以简单的被定义为在自然语言和数据库查询中不同类型的问题。所以,你不用编码就可以建立你自己的一个用自然语言进入你的数据库的系统。
现在Quepy提供对于Sparql和MQL查询语言的支持。并且计划将它延伸到其他的数据库查询语言。
13Hebel
Hebel是在Python语言中对于神经网络的深度学习的一个库程序,它使用的是通过PyCUDA来进行GPU和CUDA的加速。它是最重要的神经网络模型的类型的工具而且能提供一些不同的活动函数的激活功能,例如动力,涅斯捷罗夫动力,信号丢失和停止法。
14mlxtend
它是一个由有用的工具和日常数据科学任务的扩展组成的一个库程序。
15nolearn
这个程序包容纳了大量能对你完成机器学习任务有帮助的实用程序模块。其中大量的模块和scikit-learn一起工作,其它的通常更有用。
16Ramp
Ramp是一个在Python语言下制定机器学习中加快原型设计的解决方案的库程序。他是一个轻型的pandas-based机器学习中可插入的框架,它现存的Python语言下的机器学习和统计工具(比如scikit-learn,rpy2等)Ramp提供了一个简单的声明性语法探索功能从而能够快速有效地实施算法和转换。
17FeatureForge
这一系列工具通过与scikit-learn兼容的API,来创建和测试机器学习功能。
这个库程序提供了一组工具,它会让你在许多机器学习程序使用中很受用。当你使用scikit-learn这个工具时,你会感觉到受到了很大的帮助。(虽然这只能在你有不同的算法时起作用。)
18REP
REP是以一种和谐、可再生的方式为指挥数据移动驱动所提供的一种环境。
它有一个统一的分类器包装来提供各种各样的 *** 作,例如TMVA,Sklearn,XGBoost,uBoost等等。并且它可以在一个群体以平行的方式训练分类器。同时它也提供了一个交互式的情节。
19Python学习机器样品
用的机器学习建造的简单收集。
20Python-ELM
这是一个在Python语言下基于scikit-learn的极端学习机器的实现。
MNIST 数据集
混合的国家标准和技术 (简称 MNIST) 由红外研究员,作为基准来比较不同的红外算法创建数据集。 其基本思想是如果你有你想要测试红外的算法或软件的系统,可以运行您的算法或系统针对 MNIST 的数据集和比较您的结果与其他系统以前发布成果。
数据集包含的共 70,000 图像 ; 60,000 训练图像 (用于创建红外模型) 和 10,000 测试图像 (用于评估模型的精度)。 每个 MNIST 图像是一个单一的手写的数字字符的数字化的。 每个图像是 28 x 28 像素大小。 每个像素值是 0,表示白色,至 255,表示黑。 中间像素值表示的灰度级。 图 2 显示了训练集的前八位的图像。 对应于每个图像的实际数字是显然对人,但确定数字是非常困难的挑战的计算机。
图 2 首八 MNIST 训练图像
奇怪的是,训练数据和测试数据均存储在两个文件中,而不是在单个文件中。 其中一个文件包含图像的像素值和,另一个包含图像的标签信息 (0 到 9)。 每个的四个文件还包含标头信息,和所有的四个文件都存储在已经使用 gzip 格式压缩的二进制格式。
注意在图 1,该演示程序使用仅 60,000 项目训练集。 测试集的格式是相同的训练集。 MNIST 文件的主存储库是目前位于 yannlecuncom/exdb/mnist。 培训的像素数据存储在文件火车-图像-idx3-ubytegz 和培训标签数据存储在文件火车-标签-idx1-ubytegz。 若要运行该演示程序,您需要转到 MNIST 的存储库站点,下载并解压的两个培训数据文件。 将文件解压缩,我用的免费的开源 7-Zip 实用程序。
创建 MNIST 查看器
若要创建 MNIST 演示程序,我发起了 Visual Studio,创建一个名为 MnistViewer 的新 C# Windows 窗体项目。 演示有没有重大的NET 版本依赖关系,因此,任何版本的 Visual Studio 应该工作。
模板代码加载到 Visual Studio 编辑器后,我设置的 UI 控件。 我添加了两个 TextBox 控件 (textBox1,textBox2) 要坚持两个解压后的培训文件的路径。 我添加一个按钮控件 (button1),并给了它一个标签加载图像。 我添加了两个多个 TextBox 控件 (textBox3,textBox4) 以保存当前图像索引和下一个图像索引的值。 我使用 Visual Studio 设计器,分别设置"NA"和"0,"这些控件的初始值。
我添加了一个 ComboBox 控件 (comboBox1) 的图像放大倍数值。 使用设计器,我去到该控件的项集合,添加字符串"1"到"10"。我添加了第二个按钮控件 (button2),并给了它一个标签的显示下一次。 我添加了 PictureBox 控件 (pictureBox1),将其背景色属性设置为 ControlDark,以便看到控件的轮廓。 我将框大小设置为 280 x 280 允许最多 10 倍的放大倍率 (回顾 MNIST 图像是 28 x 28 像素为单位)。 我添加了第五个 (textBox5) 文本框以显示十六进制值的图像,然后将其多行属性设置为 True 和其字体属性设置为 825 磅 Courier New 和扩大其大小到 606 x 412。 而且,最后,我添加了一个列表框控件 (listBox1) 的日志记录消息。
后放置 UI 控件拖到 Windows 窗体,添加三个类范围字段:
public partial class Form1 : Form
{
private string pixelFile =
@"C:\MnistViewer\train-imagesidx3-ubyte";
private string labelFile =
@"C:\MnistViewer\train-labelsidx1-ubyte";
private DigitImage[] trainImages = null;
第一次两个字符串指向解压后的培训数据文件的位置。 你会需要编辑这些要运行演示的两个字符串。 第三个字段是一个程序定义 DigitImage 对象的数组。
我编辑窗体的构造函数略成 textBox1 和 textBox2 地点的文件路径,并给予放大倍数初始值 6:
public Form1()
{
InitializeComponent();
textBox1Text = pixelFile;
textBox2Text = labelFile;
comboBox1SelectedItem = "6";
thisActiveControl = button1;
}
我用的 ActiveControl 属性来设置初始焦点到 button1 控件,只是为了方便。
We propose a new learning paradigm, Local to Global Learning (LGL), for Deep Neural Networks (DNNs) to improve the performance of classification problems The core of LGL is to learn a DNN model from fewer categories (local) to more categories (global) gradually within the entire training set LGL is most related to the Self-Paced Learning (SPL) algorithm but its formulation is different from SPLSPL trains its data from simple to complex, while LGL from local to global In this paper, we incorporate the idea of LGL into the learning objective of DNNs and explain why LGL works better from an information-theoretic perspective Experiments on the toy data, CIFAR-10, CIFAR-100,and ImageNet dataset show that LGL outperforms the baseline and SPL-based algorithms
我们为深度神经网络(DNN)提出了一种新的学习范式,即从局部到全局学习(LGL),以提高分类问题的性能。LGL的核心是在整个培训集中逐步从更少的类别(本地)学习更多的类别(全局)DNN模型。LGL与自定进度学习(SPL)算法最相关,但其形式与SPL不同。SPL将数据从简单训练到复杂,而将LGL从本地训练到全局。在本文中,我们将LGL的思想纳入了DNN的学习目标,并从信息论的角度解释了LGL为什么表现更好。对玩具数据,CIFAR-10,CIFAR-100和ImageNet数据集的实验表明,LGL优于基线和基于SPL的算法。
Researchers have spent decades to develop the theory and techniques of Deep Neural Networks (DNNs) Now DNNs are very popular in many areas including speech recognition [9], computer vision [16, 20], natural language processing [30] etc Some techniques have been proved to be effective, such as data augmentation [32, 29] and identity mapping between layers [10, 11] Recently, some researchers have focused on how to improve the performance of DNNs by selecting training data in a certain order, such as curriculum learning [3] and self-paced learning [17]
Curriculum learning (CL) was first introduced in 2009 by Bengio et al [3] CL is inspired by human and animal learning which suggests that a model should learn samples gradually from a simple level to a complex level However, the curriculum often involves prior man-made knowledge that is independent of the subsequent learning process To alleviate the issues of CL, Self-Paced Learning (SPL) [17] was proposed to automatically generate the curriculum during the training process SPL assigns a binary weight to each training sample Whether or not to choose a sample is decided based on the sample’s loss at each iteration of training Since [17], many modifications of the basic SPL algorithm have emerged Moreover, [13] introduces a new regularization term incorporating both easiness and diversity in learning [12] designs soft weighting (instead of binary weight) methods such as linear soft weighting and logarithmic soft weighting [14] proposes a framework called self-paced curriculum learning (SPCL) which can exploit both prior knowledge before the training and information extracted dynamically during the training
研究人员花费了数十年的时间来开发深度神经网络(DNN)的理论和技术。现在,DNN在很多领域都非常流行,包括语音识别[9],计算机视觉[16、20],自然语言处理[30]等。一些技术已被证明是有效的,例如数据增强[32、29]和层之间的身份映射[10,11]。近来,一些研究人员致力于通过按特定顺序选择训练数据来提高DNN的性能,例如课程学习[3]和自定进度学习[17]。课程学习(CL)由Bengio等人于2009年首次提出[3]。CL受人类和动物学习的启发,这表明模型应该从简单的层次逐步学习到复杂的层次。但是,课程通常涉及先前的人造知识,而这些知识与后续的学习过程无关,为了缓解CL的问题,提出了自定进度学习(SPL)[17]在培训过程中自动生成课程表。SPL将二进制权重分配给每个训练样本。是否选择样本取决于每次训练迭代时样本的损失。自[17]以来,已经出现了对基本SPL算法的许多修改。此外,[13]引入了一个新的正规化术语,在学习中兼顾了易用性和多样性。[12]设计了软加权(而不是二进制加权)方法,例如线性软加权和对数软加权。[14]提出了一种称为自定进度课程学习(SPCL)的框架,该框架可以利用训练之前的先验知识和训练期间动态提取的信息。
However, some SPL-based challenges still remain: 1) It is hard to define simple and complex levels CL defines these levels according to prior knowledge, which needs to be annotated by human This process is extremely complicated and time consuming, especially when the number of categories is large Another solution is to choose simple samples according to the loss like SPL However, the samples’ losses are related to the choice of different models and hyper-parameters, since it is likely that the loss of a sample is large for one model but small for another; 2) SPL4748 based algorithms always bring additional hyper-parameters One must tune hyper-parameters very carefully to generate a good curriculum, which increases the difficulty of training the model
但是,仍然存在一些基于SPL的挑战:1)很难定义简单和复杂的级别。CL根据需要由人类注释的先验知识定义这些级别。此过程极其复杂且耗时,尤其是类别数量很大时。另一种解决方案是根据损耗(如SPL)选择简单样本。但是,样本损失与选择不同的模型和超参数有关,因为一个模型的样本损失可能很大,而另一模型的损失却很小。2)基于SPL4748的算法总是带来附加的超参数。必须非常仔细地调整超参数以生成好的课程表,这增加了训练模型的难度。
To address the above two problems, we propose a new
learning paradigm called Local to Global Learning (LGL)
LGL learns the neural network model from fewer categories
(local) to more categories (global) gradually within the entire training set, which brings only one hyper-parameter (
inverse proportional to how many classes to add at each
time) to DNN This new hyper-parameter is also easy to be
tuned Generally, we can improve the performance of DNN
by increasing the value of the new hyper-parameter
The intuition behind LGL is that the network is usually
better to memorize fewer categories1
and then gradually
learns from more categories, which is consistent with the
way people learn The formulation of LGL can be better
understood by comparing it with transfer learning shown in
Figure 1 In transfer learning, the initial weights of DNNs
are transferred from another dataset But in LGL, the initial weights of DNNs are transferred from the self-domain
without knowledge of other datasets The traditional methods randomly initialize the weights, which do not consider
the distributions of the training data and may end up with
a bad local minimum; whereas LGL initializes the weights
which capture the distributions of the trained data So LGL
can be also seen as an initialization strategy of DNNs In
this paper, we explain the methodology of LGL from the
mathematical formulation in detail Instead of concentrating on sample loss (as in SPL), we pay attention to training
DNN effectively by continually adding a new class to DNN
There are three main contributions from this paper:
为了解决上述两个问题,我们提出了一种新的学习范式,称为本地到全球学习(LGL)。LGL在整个训练集中逐渐从较少的类别(局部)到更多的类别(全局)学习神经网络模型,这仅给DNN带来一个超参数(与每次添加多少个类成反比)。这个新的超参数也很容易调整。通常,我们可以通过增加新的超参数的值来提高DNN的性能。LGL的直觉是,网络通常可以更好地记住较少的类别1,然后逐渐从更多的类别中学习,这与人们的学习方式是一致的。通过将LGL的公式与图1所示的转移学习进行比较,可以更好地理解LGL的公式。在转移学习中,DNN的初始权重是从另一个数据集中转移的。但是在LGL中,DNN的初始权重是在不了解其他数据集的情况下从自域传递的。传统方法是随机初始化权重,这些权重不考虑训练数据的分布,最终可能会导致不良的局部最小值。而LGL会初始化权重,以捕获训练数据的分布。因此,LGL也可以视为DNN的初始化策略。在本文中,我们将从数学公式详细解释LGL的方法。我们不专注于样本丢失(如SPL),而是通过不断向DNN添加新类来关注有效地训练DNN。本文主要有三点贡献:
We propose a new learning paradigm called Local to
Global Learning (LGL) and incorporate the idea of
LGL into the learning objective of DNN Unlike SPL,
LGL guides DNN to learn from fewer categories (local) to more categories (global) gradually within the
entire training set
• From an information-theoretic perspective (conditional entropy), we confirm that LGL can make DNN
more stable to train from the beginning
• We perform the LGL algorithm on the toy data,
CIFAR-10, CIFAR-100, and ImageNet dataset The
experiments on toy data show that the loss curve of
LGL is more stable and the algorithm converges faster
than the SPL algorithm when the model or data distributions vary The experiments on CIFAR-10, CIFAR100 and ImageNet show that the classification accuracy of LGL outperforms the baseline and SPL-based
algorithms
我们提出了一种新的学习范式,称为本地到全球学习(LGL),并将LGL的思想纳入DNN的学习目标。与SPL不同,LGL指导DNN在整个培训集中逐步从较少的类别(本地)学习到更多的类别(全局)。•从信息理论的角度(条件熵),我们确认LGL可以使DNN从一开始就更稳定地进行训练。•我们对玩具数据,CIFAR-10,CIFAR-100和ImageNet数据集执行LGL算法。对玩具数据的实验表明,当模型或数据分布变化时,LGL的损失曲线更稳定,并且收敛速度比SPL算法快。在CIFAR-10,CIFAR100和ImageNet上进行的实验表明,LGL的分类精度优于基线和基于SPL的算法。
SPL has been applied to many research fields [24] uses SPL for long-term tracking problems to automatically select right frames for the model to learn [28] integrates the SPL method into multiple instances learning framework for selecting efficient training samples [27] proposes multi-view SPL for clustering which overcomes the drawback of stuck in bad local minima during the optimization [31] introduces a new matrix factorization framework by incorporating SPL methodology with traditional factorization methods [8] proposes a framework named self-paced sparse coding by incorporating self-paced learning methodology with sparse coding as well as manifold regularization The proposed method can effectively relieve the effect of nonconvexity [21] designs a new co-training algorithm called self-paced co-training The proposed algorithm differs from the standard co-training algorithm that does not remove false labelled instances from training [18] brings the ideaof SPL into multi-task learning and proposes a frameworkthat learns the tasks by simultaneously taking into consideration the complexity of both tasks and instances per task
Recently, some researchers have combined SPL withmodern DNNs [19] proposes self-paced convolutional network (SPCN) which improves CNNs with SPL for enhancing the learning robustness In SPCN, each sample is assigned a weight to reflect the easiness of the sample A dynamic self-paced function is incorporated into the learning objective of CNNs to jointly learn the parameters ofCNNs and latent weight variable However, SPCN seemsto only work well on simple dataset like MNIST [2] showsthat CNNs with the SPL strategy do not show actual improvement on the CIFAR dataset [15] shows that whenthere are fewer layers in the CNN, an SPL-based algorithmmay work better on CIFAR But when the number of layers increases, like for VGG [23], the SPL algorithm performs almost equal to that of traditional CNN training [25]proposes a variant form of self-paced learning to improvethe performance of neural networks However, the methodis complicated and can not be applied to large dataset likeImageNet Based on the above analysis of SPL’s limitations, we develop a new data selection method for CNNscalled Local to Global Learning (LGL) LGL brings onlyone hyper-parameter (easy to be tuned) to the CNN and performs better than the SPL-based algorithms
SPL已应用于许多研究领域。[24]使用SPL解决长期跟踪问题,以自动选择合适的框架供模型学习。[28]将SPL方法集成到多个实例学习框架中,以选择有效的训练样本。[27]提出了一种用于聚类的多视图SPL,它克服了优化过程中卡在不良局部极小值中的缺点。[31]通过将SPL方法与传统因式分解方法相结合,引入了新的矩阵因式分解框架。文献[8]提出了一种框架,该框架通过将自定进度的学习方法与稀疏编码以及流形正则化相结合,提出了自定进度的稀疏编码。所提出的方法可以有效地缓解不凸性的影响。[21]设计了一种新的协同训练算法,称为自定步距协同训练。提出的算法与标准的协同训练算法不同,后者不会从训练中删除错误标记的实例。[18]将SPL的思想带入了多任务学习,并提出了一个通过同时考虑任务和每个任务实例的复杂性来学习任务的框架。
最近,一些研究人员将SPL与现代DNN相结合。文献[19]提出了一种自定速度的卷积网络(SPCN),它利用SPL改进了CNN,从而增强了学习的鲁棒性。在SPCN中,为每个样本分配了权重以反映样本的难易程度。动态自定步函数被纳入CNN的学习目标,以共同学习CNN的参数和潜在权重变量。但是,SPCN似乎只能在像MNIST这样的简单数据集上很好地工作。[2]显示,采用SPL策略的CNN在CIFAR数据集上并未显示出实际的改进。[15]表明,当CNN中的层数较少时,基于SPL的算法在CIFAR上可能会更好地工作。但是,当层数增加时,例如对于VGG [23],SPL算法的性能几乎与传统CNN训练的性能相同。[25]提出了一种自定进度学习的变体形式,以提高神经网络的性能。但是,该方法很复杂,不能应用于像ImageNet这样的大型数据集。基于以上对SPL局限性的分析,我们为CNN开发了一种新的数据选择方法,称为本地到全球学习(LGL)。LGL仅给CNN带来一个超参数(易于调整),并且比基于SPL的算法性能更好。
There are still two learning regimes similar to our workcalled Active Learning [6] and Co-training [4] which also select the data according to some strategies But in active learning, the labels of all the samples are not known when the samples are chosen Co-training deals with semisupervised learning in which some labels are missing Thus,these two learning regimes differ in our setting where the labels of all the training data are known
仍然有两种与我们的工作类似的学习方式称为主动学习[6]和联合训练[4],它们也根据某些策略选择数据。但是在主动学习中,选择样本时不知道所有样本的标签。联合培训涉及缺少某些标签的半监督学习。因此,这两种学习方式在我们设置所有训练数据的标签的环境中是不同的。
3self-Paces Learning
Let us first briefly review SPL before introducing LGL
Let L(yi, g(xi, w)) denote the loss of the ground truth label yi and estimated label g(xi, w), where w represents theparameters of the model The goal of SPL is to jointlylearn the model parameters w and latent variable v =[vi, , vn]T by minimizing:
在介绍LGL之前,让我们首先简要回顾一下SPL。令L(yi,g(xi,w))表示地面真值标签yi和估计标签g(xi,w)的损失,其中w表示模型的参数。SPL的目标是共同学习模型参数w和潜在变量v = [vi,,vn] T通过最小化:
In the above, v denotes the weight variables reflecting the samples’ importance; λ is a parameter for controlling the learning pace; f is called the self-paced function which controls the learning scheme SPL-based algorithms are about to modify f to automatically generate a good curriculum during the learning processIn the original SPL algorithm [17], v ∈ {0, 1}^n, and fis chosen as:
Another popular algorithm is called SPLD (self-paced
learning with diversity) [13] which considers both ||v||1 and
the sum of group-wise ||v||2 In SPLD, f is chosen as:
In general, iterative methods like Alternate Convex Search (ACS) are used to solve (1), where w and v are optimized alternately When v is fixed, we can use existing supervised learning methods to minimize the first term in (1) to obtain the optimal w∗ Then when w is fixed,and suppose f is adopted from (2), the global optimum v∗= [vi∗, , vn]T can be explicitly calculated as:
通常,使用迭代方法(如交替凸搜索(ACS))求解(1),其中w和v交替优化。当v固定时,我们可以使用现有的有监督学习方法来最小化(1)中的第一项,以获得最佳w ∗。然后,当w固定时,假设从(2)中采用f,则全局最优v ∗ = [v ∗ i,。。。,v ∗ n] T可以明确地计算为:
From (4), λ is a parameter that determines the difficulty of sampling the training data: When λ is small, ‘easy’ samples with small losses are sent into the model to train; When we gradually increase λ, the ‘complex’ samples will be provided to the model until the entire training set is processedFrom the above analysis, the key step in an SPL algorithm is to adjust the hyper-parameter λ at each iteration of training In reality, however, we do not know the loss of each sample before training Therefore sometimes one needs to run a baseline (a training algorithm without SPL)
first to observe the average loss at each iteration and then set an empirical value for λ to increase For more complex algorithms like SPLD from (3), researchers must control two parameters λ and γ, which makes the training difficult To avoid the difficulty of tuning parameters in the SPL-based algorithms, we introduce our easy-to-train LGL algorithm
从(4)中,λ是一个参数,它确定对训练数据进行采样的难度:当λ较小时,将损失较小的“简单”样本发送到模型中进行训练;当我们逐渐增加λ时,将向模型提供“复杂”样本,直到处理完整个训练集为止。根据以上分析,SPL算法中的关键步骤是在每次训练迭代时调整超参数λ。但是,实际上,我们不知道训练前每个样本的损失。因此,有时需要先运行基线(无SPL的训练算法)以观察每次迭代的平均损耗,然后为λ设置一个经验值以增加。对于(3)中的SPLD等更复杂的算法,研究人员必须控制两个参数λ和γ,这使训练变得困难。为了避免在基于SPL的算法中调整参数的困难,我们引入了易于训练的LGL算法。
MNIST 数据集
混合的国家标准和技术 (简称 MNIST) 由红外研究员,作为基准来比较不同的红外算法创建数据集。 其基本思想是如果你有你想要测试红外的算法或软件的系统,可以运行您的算法或系统针对 MNIST 的数据集和比较您的结果与其他系统以前发布成果。
数据集包含的共 70,000 图像 ; 60,000 训练图像 (用于创建红外模型) 和 10,000 测试图像 (用于评估模型的精度)。 每个 MNIST 图像是一个单一的手写的数字字符的数字化的。 每个图像是 28 x 28 像素大小。 每个像素值是 0,表示白色,至 255,表示黑。 中间像素值表示的灰度级。 图 2 显示了训练集的前八位的图像。 对应于每个图像的实际数字是显然对人,但确定数字是非常困难的挑战的计算机。
图 2 首八 MNIST 训练图像
奇怪的是,训练数据和测试数据均存储在两个文件中,而不是在单个文件中。 其中一个文件包含图像的像素值和,另一个包含图像的标签信息 (0 到 9)。 每个的四个文件还包含标头信息,和所有的四个文件都存储在已经使用 gzip 格式压缩的二进制格式。
注意在图 1,该演示程序使用仅 60,000 项目训练集。 测试集的格式是相同的训练集。 MNIST 文件的主存储库是目前位于 yannlecuncom/exdb/mnist。 培训的像素数据存储在文件火车-图像-idx3-ubytegz 和培训标签数据存储在文件火车-标签-idx1-ubytegz。 若要运行该演示程序,您需要转到 MNIST 的存储库站点,下载并解压的两个培训数据文件。 将文件解压缩,我用的免费的开源 7-Zip 实用程序。
创建 MNIST 查看器
若要创建 MNIST 演示程序,我发起了 Visual Studio,创建一个名为 MnistViewer 的新 C# Windows 窗体项目。 演示有没有重大的NET 版本依赖关系,因此,任何版本的 Visual Studio 应该工作。
模板代码加载到 Visual Studio 编辑器后,我设置的 UI 控件。 我添加了两个 TextBox 控件 (textBox1,textBox2) 要坚持两个解压后的培训文件的路径。 我添加一个按钮控件 (button1),并给了它一个标签加载图像。 我添加了两个多个 TextBox 控件 (textBox3,textBox4) 以保存当前图像索引和下一个图像索引的值。 我使用 Visual Studio 设计器,分别设置"NA"和"0,"这些控件的初始值。
我添加了一个 ComboBox 控件 (comboBox1) 的图像放大倍数值。 使用设计器,我去到该控件的项集合,添加字符串"1"到"10"。我添加了第二个按钮控件 (button2),并给了它一个标签的显示下一次。 我添加了 PictureBox 控件 (pictureBox1),将其背景色属性设置为 ControlDark,以便看到控件的轮廓。 我将框大小设置为 280 x 280 允许最多 10 倍的放大倍率 (回顾 MNIST 图像是 28 x 28 像素为单位)。 我添加了第五个 (textBox5) 文本框以显示十六进制值的图像,然后将其多行属性设置为 True 和其字体属性设置为 825 磅 Courier New 和扩大其大小到 606 x 412。 而且,最后,我添加了一个列表框控件 (listBox1) 的日志记录消息。
以上就是关于神经网络架构搜索——可微分二值搜索(BATS)全部的内容,包括:神经网络架构搜索——可微分二值搜索(BATS)、Gradient Episodic Memory for Continual Learning、Python keras构建CNN等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)