EEC: LEARNING TO ENCODE AND REGENERATE IMAGES FOR CONTINUAL LEARNING
EEC: LEARNING TO ENCODE AND REGENERATE IMAGES FOR CONTINUAL LEARNING
文章目录
- EEC: LEARNING TO ENCODE AND REGENERATE IMAGES FOR CONTINUAL LEARNING
- 一、总结
- 二、翻译
- 0. 摘要
- 1. 引言
- 2. 相关工作
- 3. ENCODING EPISODES AS CONCEPTS
- 3.1 具有神经风格迁移(neural style transfer)的自动编码器训练
- 3.2 MEMORY INTEGRATION
- 3.3 REHEARSAL, PSEUDOREHEARSAL AND CLASSIFIER TRAINING
- 4. 实验
- 4.1 数据集
- 4.2 实现细节
- 4.3 和SOTA的对比
- 4.4 消融实验
- 三、纸质版材料
一、总结
二、翻译
0. 摘要
abstract:
持续学习的两个主要障碍是灾难性的遗忘和数据存储的内存限制。为了应对这些挑战,我们提出了一种新颖的、受认知启发的方法,该方法可以训练具有神经样式传递功能(Neural Style Transfer)的自动编码器来编码和存储图像。在进行新任务的训练期间,将重播编码事件中的重建图像,以避免灾难性的遗忘。对重建图像的损失函数进行加权,以降低其在分类器训练期间的效果,以应对图像质量下降的情况。当系统内存不足时,已编码的情节将转换为质心(centroids)和协方差矩阵(covariance matrices),这些质心和协方差矩阵用于在分类器训练期间生成伪图像,从而在使用较少内存的情况下保持分类器性能稳定。与基准数据集上的最新方法相比,我们的方法将分类准确性提高了13-17%,同时所需的存储空间减少了78%。
1. 引言
Introduction:
人们一生中都在不断学习新概念,而无需重新学习大多数以前的概念。但是,现代机器学习系统要求一次提供完整的训练数据(批处理学习)。在本文中,我们从类增量的角度考虑持续学习的问题。 类增量系统需要从属于不同类的数据流中学习,并在单头评估(single-headed evalution)中进行评估。在单头评估中,对到目前为止观察到的所有类别进行模型评估,而没有任何信息表明正在观察哪个类别。
创建高度准确的类增量学习系统是一个具有挑战性的问题。创建类增量学习的一种简单方法是通过在新类的数据上训练模型而无需重新访问旧类。但是,这导致模型忘记先前学习的类别,并且整体分类准确性降低,这种现象称为灾难性遗忘。大多数现有的基于类增量学习的方法通过存储来自较早学习类的一部分训练样本并在存储的数据和包含新类的混合数据上重新训练模型(通常是神经网络)来避免此问题。但是,存储先前类的真实样本会导致多个问题。首先,正如Wu等人指出的,存储实际样本会耗尽存储容量并限制实际应用的性能。其次,存储真实样本会引入隐私和安全问题。第三,存储真实样本并不是从生物学的角度出发的,即人类不需要重新学习以前已知的类别。
本文探讨了“严格”的类增量学习问题,其中不允许模型存储以前学习的类的任何实际样本。严格的类增量学习问题更类似于现实的学习场景,例如家庭服务机器人必须在有限的内存下连续学习。以前已经使用生成模型或生成对抗网络(GANs)解决了此问题。大多数严格的类增量学习方法都使用GAN来生成反映旧班级数据的样本,因为GAN会生成清晰,细粒度的图像。但是,GAN的缺点是它们倾向于生成不属于任何已学习类别的图像,从而损害了分类性能。另一方面,自动编码器总是生成与学习到的类别相关的图像,但往往会产生模糊的图像,这些图像也不适合分类。
为了解决这些问题,我们提出了一种新颖的,受认知启发的方法,称为**Encoding
Episodes as Concepts(EEC)**以进行持续学习,该方法利用卷积自动编码器生成以前学习的类数据。 受海马模型启发,我们使用自动编码器创建真实图像的压缩嵌入(编码情节)并将其存储在内存中。 为了避免产生模糊图像,我们借鉴了Gatys等人提出的神经样式转换(NST)算法的思想训练自动编码器。为了进行有效的记忆管理,我们使用了海马和新皮质概念学习的记忆整合概念,将类似的情节合并为质心和协方差矩阵,从而无需存储真实数据。
本文的贡献是:1)一种基于自动编码器的严格类增量学习方法,该方法使用神经样式转换产生反映旧类数据的高质量样本; 2)一种受认知启发的内存管理技术,将相似的样本组合成一个质心/协方差表示形式,从而大大减少了所需的内存; 3)一种数据过滤和损失加权技术,用于在分类器训练期间管理旧类的图像降级。我们进一步表明,EEC在基准数据集上的表现优于SOTA,而且使用的内存也少得多。
2. 相关工作
related work:
3. ENCODING EPISODES AS CONCEPTS
EEC:
我们认为St={(xit,yit)}i=1ntS_t=\{(x_i^t,y_i^t)\}_{i=1}^{n^t}St={(xit,yit)}i=1nt样本xi∈Xx_i\in Xxi∈X及其属于任务t的ground truth的yity_i^tyit集合。在类增量设置中,StS_tSt可以包含一个或多个类,并且不同任务的数据以不同的增量可用于模型。在每次增量中,都会对到目前为止看到的所有类进行模型评估。
我们对持续学习的正式介绍遵循Ostapenko等(2019),其中任务求解器模型(用于类增量学习的分类器)DDD必须在任务ttt的数据上增量更新其参数θD\theta_DθD,以使其在迄今为止看到的所有t−1t-1t−1个先前任务上均表现良好 。 当模型正在学习任务ttt时,t−1t-1t−1任务的数据不可用。 以下小节介绍了我们的方法。
3.1 具有神经风格迁移(neural style transfer)的自动编码器训练
AUTOENCODER TRAINING WITH NEURAL STYLE TRANSFER:
自动编码器是经过训练以压缩然后重构输入的神经网络,形式为fr:X→Xf_r:X\rightarrow Xfr:X→X。 该网络由将输入压缩到低维特征空间(在本文中称为编码情节)的编码器genc:X→Fg_{enc}:X→Fgenc:X→F和由特征嵌入重构输入的解码器组成gdec:F→Xg_{dec}:F→Xgdec:F→X。 形式上,对于给定的输入x∈Xx\in Xx∈X,重构管线frf_rfr定义为:fr(x)=(gdec◦genc)(x)f_r(x)=(g_{dec}◦g_{enc})(x)fr(x)=(gdec◦genc)(x)。 通常使用输入和重建之间的l2l_2l2损失优化网络的参数θr\theta_rθr:Lr=∥x−fr(x)∥2L_r=\|x-f_r(x)\|_2Lr=∥x−fr(x)∥2尽管自动编码器适合于降低RGB图像等复杂的高维数据的维数,但重建的图像会丢失正确分类所需的高频分量。 为了解决这个问题,我们使用强调神经样式转换(NST)的一些思想来训练自动编码器。 NST使用预先训练的CNN将一幅图片的样式转换为另一幅图片。 该过程将获取三个图片,即输入图片,内容图片和样式图片,并更改输入图片,使其具有内容图片的内容和样式图片的艺术风格。 这三张图片经过预训练的CNN生成卷积特征图(通常从最后一个卷积层开始),并计算输入图片与内容图片(内容损失)和样式图片(样式损失)之间的l2l_2l2距离 。 这些损失然后用于更新输入图像。
直观地,我们的目的是创建与真实图像(在像素和卷积空间中)相似的重建图像,从而提高分类精度。 因此,我们仅利用NST算法传输内容的想法,其中输入图像是由自动编码器重构的图像,内容图像是与重构图像相对应的真实图像。 分类器模型D用于生成NST的卷积特征图,因为已经在增量t的类的真实数据上对其进行训练。与传统的NST算法相比,我们使用内容损失LcontL_{cont}Lcont来训练自动编码器,而不是直接更新输入图像。 形式上,令fc:X→Fcf_c:X\rightarrow F_cfc:X→Fc为将输入图像转换为卷积特征的分类器管道。 对于输入图像,任务t的xitx_i^txit,内容损失为:Lcont=∥fc(xit)−fc(fr(xit))∥L_{cont}=\|f_c(x_i^t)-f_c(f_r(x_i^t))\|Lcont=∥fc(xit)−fc(fr(xit))∥自动编码器参数是结合重建和内容损失进行优化的:L=(1−λ)Lr+λLcontL=(1-\lambda)L_r+\lambda L_{cont}L=(1−λ)Lr+λLcont其中,λ是一个超参数,它控制每个损失项对所有损失的贡献。 在自动编码器训练期间,分类器D充当固定特征提取器,并且其参数不会更新。 完整过程的这一部分在图1(a)中进行了描述。
为了说明我们的方法,我们使用ImageNet-50数据集进行了实验。 我们在使用NST的ImageNet-50上针对10个类训练了一种自动编码器,其中一种使用了NST,另一种则没有使用NST。 图2描绘了两个自动编码器重建的图像。 请注意,未经NST训练的自动编码器生成的图像模糊。 相反,使用NST训练的自动编码器可创建具有细粒度细节的图像,从而提高了分类精度。
3.2 MEMORY INTEGRATION
内存整合:
如引言所述,持续学习还提出了与内存中数据存储相关的问题。 对于EEC,对于每个新任务t,数据都经过编码并存储在内存中。 即使编码的情节比实际图像需要更少的内存,但是当管理连续的传入任务流时,系统仍然会用尽内存。 为了解决这个问题,我们提出了一个受海马和新皮质记忆整合启发的过程。内存集成将新的情节与先前学习的情节相结合,以单个表示形式总结了两个情节中的信息。 原始情节本身被遗忘了。
考虑一个可以基于其可用内存存储总共K个编码情节的系统。 假设在增量t−1t-1t−1处,系统总共存储了Kt−1K_{t-1}Kt−1个编码的情节。 现在需要以增量t存储Kt更多的情节。 由于Kt+Kt−1>KK_t+K_{t-1}>KKt+Kt−1>K,系统内存不足。因此,必须将情节数减少为Kr=Kt+Kt−1−KK_r=K_t+K_{t-1}-KKr=Kt+Kt−1−K。由于每个任务在每次增量时都由一组类组成,因此我们减少了根据其先前的编码情节数,属于不同类别的总编码情节。 形式上,类y的编码情节数量NyN_yNy的减少量计算为(整数):Ny(new)=Ny(1−KrKt−1)N_y(new)=N_y(1-\frac{K_r}{K_{t-1}})Ny(new)=Ny(1−Kt−1Kr)为了将y类的编码事件减少到Ny(new)N_y(new)Ny(new),受内存集成过程的启发,我们使用增量聚类过程,该过程将最接近的编码事件组合在一起以生成质心和协方差矩阵。这种聚类技术类似于我们早期工作中提出的Agg-Var聚类。使用欧几里得距离计算编码的情节之间的距离,并使用编码的情节的加权平均值计算质心。 重复此过程,直到质心/协方差矩阵的总数与y类的编码事件的总和等于Ny(new)。原始编码事件被删除,仅保留质心和协方差(有关更多信息,请参见附录A) 细节)。
3.3 REHEARSAL, PSEUDOREHEARSAL AND CLASSIFIER TRAINING
训练分类器:
图1(b)描绘了当属于任务t的新数据可用时训练分类器D的过程。 分类器接受了来自以下三个来源的数据的训练:1)任务t的真实数据,2)从自动编码器的解码器生成的重构图像,以及3)从质心和协方差矩阵为先前任务生成的伪图像。 来源(2)使用先前任务中的编码,将其通过自动编码器的解码器,以生成一组重建的图像。 此过程称为演练rehearsal。
pseudorehearsal: 如果系统还将旧数据存储为质心/协方差矩阵对,则使用伪演练。 对于一类的每个质心/协方差矩阵对,我们采样均值作为质心和协方差矩阵的多元高斯分布,以生成大量伪编码的情节。然后,这些情节将通过自动编码器的解码器传递,以生成前一类的伪图像。 许多伪图像都有噪声。 为了过滤嘈杂的伪图像,我们将它们传递给分类器D(已在先前的类别中进行过训练),以获取每个伪图像的预测标签。 我们仅保留那些具有与其所源自的质心的标签相同的预测标签的伪图像。 在滤波后的伪图像中,我们选择与由质心表示的编码情节总数相同数量的伪图像,并丢弃其余的伪图像(有关算法,请参见附录A)。
为了说明内存集成和伪演练的效果,我们对MNIST数据集进行了一项实验。我们对MNIST数据集的2个类别(11379个图像)的自动编码器进行了训练,嵌入尺寸为2。训练后,我们将这两个类别的所有训练图像都通过了编码器,以获得11379个编码的情节(请参见图3(a)) )。接下来,我们对编码的情节应用了内存整合技术,以将编码的情节减少到4000、2000、1000和200个质心(和协方差)。没有保留原始的编码情节。然后将伪演练应用于质心以生成伪编码的情节。图3(b-e)中显示了针对不同数量的质心的伪编码情节。注意,由不同数量的质心生成的伪编码情节的特征空间与原始编码情节非常相似。对于大量质心,特征空间看起来几乎与原始特征空间相同。对于最小数量的质心(图3(e)),特征空间变得不那么均匀,而更多地分成较小的密集区域。这是因为使用较少数量的质心来表示跨不同区域的特征空间的整体概念,从而导致质心之间的间隙较大。因此,使用质心生成的伪编码情节在质心周围更加密集,从而降低了均匀性。尽管如此,在使用质心和伪演练后,仍保留了特征空间的整体形状。因此,我们的方法即使在内存较少的情况下也可以保存有关先前类的信息,从而有助于分类器的性能,同时还避免了灾难性的遗忘。 ImageNet-50上第4.3节中给出的结果证实了内存集成和伪演练的有效性。
sample decay weight: 重建的图像和伪图像仍可能与原始图像有很大不同,从而损害了分类器的性能。 因此,我们在训练D时权衡了重建图像和伪图像的损失项。为此,我们估计了重建图像和伪图像的退化。 为了估计重建图像中的退化,我们找到在先前任务训练的网络D上重建图像的分类精度(crc^rcr)与原始图像精度(coc^oco)的比率。 该比率用于控制重建图像损失项的权重。 对于先前的任务t−1t -1t−1,将重建图像的损失项Lt−1rL_{t-1}^rLt−1r的权重Γt−1r\Gamma_{t-1}^rΓt−1r(样本衰减权重)定义为:Γt−1r=e−γt−1rαt−1\Gamma_{t-1}^r=e^{-\gamma_{t-1}^r\alpha_{t-1}}Γt−1r=e−γt−1rαt−1其中(样本衰减系数)γt−1r=1−ct−1rct−1o\gamma_{t-1}^r=1-\frac{c_{t-1}^r}{c_{t-1}^o}γt−1r=1−ct−1oct−1r表示任务t-1的重建图像中的退化,而αt−1\alpha_{t-1}αt−1表示自动编码器在任务t − 1伪图像或重建图像上的训练次数。样本衰减系数的值在0到1的范围内,具体取决于重建图像ct−1rc_{t-1}^rct−1r的分类精度。 如果ct−1r=ct−1oc_{t-1}^r=c_{t-1}^oct−1r=ct−1o,则γt−1r=0\gamma_{t-1}^r=0γt−1r=0(无降级)并且Γt−1r=1\Gamma_{t-1}^r=1Γt−1r=1。类似地,伪图像的的损失项也这样定义。因此,对于新的增量,在旧任务的重建图像和伪图像以及新任务t的真实图像上训练D的总损失LD为 定义为:LD=Lt+∑i=1t−1(ΓirLir+ΓipLip)L_D=L_t+\sum_{i=1}^{t-1}(\Gamma_i^rL_i^r+\Gamma_i^pL_i^p)LD=Lt+i=1∑t−1(ΓirLir+ΓipLip)
4. 实验
experiment:
我们在四个基准数据集(MNIST,SVHN,CIFAR-10和ImageNet-50)上对EEC和几种SOTA方法进行了测试和比较。我们还报告了我们的方法使用的内存及其在受限内存条件下的性能。最后,我们提出了一项消融研究,以评估EEC不同组成部分的贡献。 附录D中提供了有关CIFAR-100的实验以及与其他方法的比较。
4.1 数据集
dataset:
MNIST数据集由介于0到9之间的手写数字的灰度图像,50,000个训练图像,10,000个验证图像和10,000个测试图像组成。SVHN由带有不同照明和视点的街道房屋编号的彩色裁剪图像组成。它包含73,257个训练和26,032个属于10个类别的测试图像。CIFAR-10由50,000个RGB训练图像和10,000个属于10个对象类别的测试图像组成,每个类包含5000个训练和1000个测试图像。ImageNet-50是iLSVRC-2012数据集的较小子集,包含50个类,每个类具有1300个训练图像和50个验证图像。所有数据集图像均调整为32×32。
4.2 实现细节
implementation details:
我们使用Pytorch和Nvidia Titan RTX GPU来实现和训练所有神经网络模型。3层浅层卷积自动编码器用于所有数据集(请参阅附录B),这需要大约0.2MB的磁盘空间来存储。 为了进行分类,在MNIST和SVHN数据集上,使用了与DCGAN discriminator相同的分类器,对于CIFAR-10,使用了Gulrajani等人提出的ResNet架构,对于ImageNet-50,使用ResNet-18。
与Ostapenko等人一致(DGMw),我们报告了连续训练的MNIST,SVHN和CIFAR-10数据集的5类和10类(A5和A10A_5和A_{10}A5和A10)的平均增量精度,每次增量一个类。 对于ImageNet-50,报告的增量准确率为每3和5(A30和A50A_{30}和A_{50}A30和A50)的平均精度,每个增量含10个类别。 为了进行公平的比较,我们通常将其与不使用预训练特征提取器且以单头方式进行评估的具有生成内存重放组件的方法进行比较。在这些方法中,就我们所知,DGMw代表了这些数据集的最新基准,随后是MeRGAN,DGR和EWC -M。 联合训练(JT)用于产生所有四个数据集的上限。我们将这些方法与我们的方法的两种变体进行了比较:EEC和EECS。EEC使用单独的自动编码器在新的类增量上,而EECS使用单个自动编码器,在学习新类时会在旧类的重构图像上对其进行重新训练。对于EEC和EECS,当存储先前类别的所有编码情节时,都会报告结果。还介绍了受限内存条件下的EEC结果。
附录C中报告了超参数值和训练详细信息。我们使用不同的随机种子进行了10次实验,并报告了所有运行的平均准确性。
4.3 和SOTA的对比
表1比较了MNIST,SVHN,CIFAR-10和ImageNet-50数据集上的EEC和EECS与SOTA方法。 我们将两种不同类型的方法进行比较,一种是使用旧类的真实图像(事件记忆),另一种是在学习新类时生成先前类图像的方法。 在A5A_5A5和A10A_{10}A10的MNIST上,EEC和EECS的性能均优于EWC-M和DGR。 MeRGAN和DGMw在A5A_5A5和A10A_{10}A10实验中的表现与我们的方法相似。 请注意,MeRGAN和EEC接近A5A_5A5上的JT上限。 此外,MeRGAN,DGMw和EEC的准确性在A5A_5A5和A10A_{10}A10之间仅略有变化,这表明MNIST数据集来说太简单了。
考虑到SVHN,这是一个由街道房屋编号的彩色图像组成的更复杂的数据集,即使其他方法的性能显着下降,我们的方法的性能仍然合理地接近JT上限。同分析CIFAR10和image50。
我们的方法在所有四个数据集上都执行一致,尤其是在MNIST,SVHN和CIFAR-10的A5上。 相反,DGMw(目前最好的方法)在四个数据集中显示出明显不同的结果。 结果表明,当前基于生成内存的SOTA方法无法减轻更复杂RGB数据集上的灾难性遗忘。 这可能是因为GAN倾向于生成不属于任何学习类的图像,这可能会大大降低分类器的性能。 我们的方法通过训练自动编码器借鉴NST算法的思想并使用样本衰减权重对分类器进行训练来解决这些问题。 图4显示了EEC为10次任务后的MNIST和CIFAR-10和为5次任务后的ImageNet-50重建的图像。
内存使用情况分析:与DGMw相似,我们分析了ImageNet-50数据集模型所需的磁盘空间。 对于EEC,自动编码器使用的磁盘总空间为1 MB,ResNet-18使用的磁盘空间约为44 MB,而编码的情节的磁盘空间总计为66.56 MB。 因此,EEC所需的总磁盘空间约为111.56 MB。DGMw的生成器(带有相应的权重蒙版)使用228MB的磁盘空间,并且存储ImageNet-50的预处理后的真实图像需要315MB的磁盘空间。 因此,对于ImageNet-50数据集,我们的模型需要比DGMw少51.07%((228-111.56)/ 228 = 0.5107)的空间,比真实图像少64.58%的空间。
在ImageNet-50数据集上使用不同的内存预算对EEC进行了测试,以评估我们的内存管理技术的影响。 内存预算(K)定义为系统存储的编码情节,质心和协方差矩阵(对角项)总数的总和。图5显示了针对各种内存预算的A30A_{30}A30和A50A_{50}A50的结果。 (与DGMw对比)在不同的内存预算下,EEC的准确性只会略有变化。这些结果清楚地表明,即使在内存极为有限的情况下,我们的方法也能产生最佳结果,而其他SOTA方法却无法共享这一特征。 此外,结果还表明,我们的方法能够应对前面提到的持续学习的两个主要挑战:灾难性遗忘和记忆管理。
4.4 消融实验
ablation study:
我们进行了消融研究,以检查使用以下内容的贡献:1)训练自动编码器时内容损失,2)伪演练,3)样本权重衰减。这些实验是在ImageNet-50数据集上进行的。消融1和消融3使用了先前任务的完整编码集,消融2使用了内存预算K = 5000。我们创建了EEC的混合版本来测试每个组件的贡献。混合1:称为EEC-noNST,在训练自动编码器时不会使用内容丢失。混合2:称为EEC-CGAN,它使用条件GAN而不是基于NST的自动编码器。混合3:称为EEC-VAE使用变体自动编码器,而混合4:称为EEC-DNA使用降噪自动编码器,而不是我们提出的基于NST的自动编码器。混合5:称为EEC-noPseudo,仅在系统内存不足且不使用伪演练时,才删除多余的编码片段。
三、纸质版材料
EEC: LEARNING TO ENCODE AND REGENERATE IMAGES FOR CONTINUAL LEARNING相关推荐
- AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛——09:55-10:40刘兵教授《Open-World AI and Continual Learning》
AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛--09:55-10:40刘兵教授<Open-World AI and Continual Learning> 导 ...
- PRN(20210421):Task-Free Continual Learning
写这篇博客前,我又重新阅读了之前的博客( 利用突触智能实现连续学习|从原理到代码解析(人生好难呀!))的内容,以及文后的那段笔(tu)记(cao).一直没有放弃关注增量式学习的近况,比如:最近ICLR ...
- 连续学习入门(一):Continual Learning / Incremental Learning / Life Long Learning 问题背景及研究挑战
说明:本系列文章若无特别说明,则在技术上将 Continual Learning(连续学习)等同于 Incremental Learning(增量学习).Lifelong Learning(终身学习) ...
- Deep Learning论文笔记之(八)Deep Learning最新综述
Deep Learning论文笔记之(八)Deep Learning最新综述 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但老感觉看完 ...
- Machine Learning week 6 quiz: Advice for Applying Machine Learning
Advice for Applying Machine Learning 5 试题 1. You train a learning algorithm, and find that it has un ...
- 通过 Continual Learning 提高 ML.NET 模型准确性并增强性能
从事机器学习的学者大多认为持续学习(Continual Learning)是迈向人工智能的根本一步.持续学习是模型模仿人类在整个生命周期中不断从数据流中学习.微调.转移知识和技能的能力.实际上,这意味 ...
- CVPR 2020 Workshop on Continual learning in Computer Vision 征稿
点击我爱计算机视觉标星,更快获取CVML新技术 为了进一步推广Lifelong Robotic Vision项目,吸引更多的学术工业界的研究开发人员,英特尔中国研究院作为主办方之一 在IEEE Con ...
- 台大李宏毅Machine Learning 2017Fall学习笔记 (10)Tips for Deep Learning
台大李宏毅Machine Learning 2017Fall学习笔记 (10)Tips for Deep Learning 注:本博客主要参照 http://blog.csdn.net/xzy_thu ...
- 台大李宏毅Machine Learning 2017Fall学习笔记 (7)Introduction of Deep Learning
台大李宏毅Machine Learning 2017Fall学习笔记 (7)Introduction of Deep Learning 最近几年,deep learning发展的越来越快,其应用也越来 ...
最新文章
- 1行Python代码制作动态二维码
- JAVA好书之《深入理解Java虚拟机》
- 取石头游戏 c语言,[HNOI2010]取石头游戏(博弈论+贪心)
- Lesson 6.动态计算图与梯度下降入门
- Buck降压电路仿真与解析
- 前端学习(3066):vue+element今日头条管理-频道筛选
- 设计模式_第二篇_策略模式
- mysql 建库字段_MySQL 的字段类型以及建库策略
- 正则表达式及grep
- 计生专干招聘计算机,请求解决招聘计生专干待遇
- 不知道如何实现服务的动态发现?快来看看 Dubbo 是如何做到的
- 教你一键如何更换证件照底色?
- 【机器学习】树及其组合算法(一)(Bagging,Boosting,GBDT,XGboost,Adaboost,随机森林)
- wps一直显示正在备份怎么办_wps怎么解除自动备份
- Java成员变量初始化顺序
- 信安冬令营实训报告(信息收集,主机渗透,内网渗透)
- 德艺双馨艺术家——刘文军
- 计算机安装msvcr110.dll,安装WampServer报错 计算机中丢失MSVCR110.dll 的解决方法 | 睿客网...
- 什么蓝牙耳机好用?2022蓝牙耳机排行榜
- 腾讯 Code Review 规范出炉,你还敢乱写代码?