本文是我在深度学习,图像视觉方面的知识点汇总,内容除了一些他人笔记的载入,还有自己的一些感悟与理解。

Conv , BN ,ReLU 三剑客

使用顺序

nn.BatchNorm2d
nn.ReLU
nn.Conv2d
nn.Conv2d
nn.BatchNorm2d
nn.ReLU

这两种方法都行,但是第一种排列方式可以加快网络训练速度,效率会高一些。
此外,Denseblock 中所用的排列顺序也是BN-ReLU-Conv。
此前纠结过很久,问题不大。

来自:https://blog.csdn.net/weixin_43930603/article/details/107080139

作用

可以使输入X更趋于非线性分布,并产生一个更稳定的激活分布,有利于提升模型性能

模型inference加速之融合Conv层与BN层

推理的时候使用,可以轻松获得约5%的提速

将BN层的运算融合到Conv层中,减少运算量,加速推理。本质上是修改了卷积核的参数,在不增加Conv层计算量的同时,略去了BN层的计算量。公式推导如下。
Conv层的参数:

BN层的参数:

假设输入为x,则x->Conv->BN的输出便是:

做个简单的公式变形:

解释来自:https://zhuanlan.zhihu.com/p/94138640

代码实现:

 import torchimport torchvisiondef fuse(conv, bn):fused = torch.nn.Conv2d(conv.in_channels,conv.out_channels,kernel_size=conv.kernel_size,stride=conv.stride,padding=conv.padding,bias=True)# setting weightsw_conv = conv.weight.clone().view(conv.out_channels, -1)w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps+bn.running_var)))fused.weight.copy_( torch.mm(w_bn, w_conv).view(fused.weight.size()) )# setting biasif conv.bias is not None:b_conv = conv.biaselse:b_conv = torch.zeros( conv.weight.size(0) )b_bn = bn.bias - bn.weight.mul(bn.running_mean).div(torch.sqrt(bn.running_var + bn.eps))fused.bias.copy_( b_conv + b_bn )return fused# Testing# we need to turn off gradient calculation because we didn't write ittorch.set_grad_enabled(False)x = torch.randn(16, 3, 256, 256)resnet18 = torchvision.models.resnet18(pretrained=True)# removing all learning variables, etcresnet18.eval()model = torch.nn.Sequential(resnet18.conv1,resnet18.bn1)f1 = model.forward(x)fused = fuse(model[0], model[1])f2 = fused.forward(x)d = (f1 - f2).mean().item()print("error:",d)


我们可以看出,误差小的几乎可以忽略.

代码来自:https://learnml.today/speeding-up-model-with-fusing-batch-normalization-and-convolution-3

激活函数

在低纬度使用非线性的函数,就会损失信息。所以要embedding到高纬度激活后再embedding到低纬度。至于bottleneck中是通过残差来维持特征。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OEjNHwbz-1629515101682)(C:\Users\BlackFriday\AppData\Roaming\Typora\typora-user-images\image-20210806115300460.png)]

ReLU

提出的原因:

sigmoid容易出现梯度消失。
梯度消失:在某些神经网络中,从后向前看,前面层梯度越来越小,后面的层比前面的层学习速率高。

原因:

sigmoid函数导数图像:

因为最大的导数为0.25<1
在计算导数的时候我们又用上了链式法则,多个小于1的数据相乘,算出来的结果可想而知——>导数小。
而且传统的sigmoid算法,计算量大,求梯度误差的时候求导涉及除法。

优点

1.很大程度的解决了BP算法在优化深层神经网络时的梯度耗散问题

  1. x>0 时,梯度恒为1,无梯度耗散问题,收敛快;
    3 增大了网络的稀疏性。当x<0 时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就约具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好
  2. 运算量很小,训练时间少。

缺点:

1.如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。
2.由优缺点可知max(0,x) 函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,需要tradeoff

当然也有人对ReLU进行各种改版…
这里提一下ReLU6

ReLU6

提出理由

主要是为了在移动端float16的低精度的时候,也能有很好的数值分辨率,如果对ReLu的输出值不加限制,那么输出范围就是0到正无穷。如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。

公式:

与ReLU对比

优点:

1)可以让模型更早地学到稀疏特征。
并没有可信的理论推导,作者试验出来的结果是这样的。注意,relu6只是比relu更早的学习到稀疏特征,而不是说relu学不到稀疏特征。
2)可以防止数值爆炸。
3)增强浮点数的小数位表达能力。
因为整数位最大是6,所以只占3个bit,其他bit全部用来表达小数位。

Leaky-Relu / R-Relu

Leaky ReLU和ReLU不同的是,ReLU是将所有的负值设为零,而Leaky ReLU是给所有负值赋予一个非零斜率,即用一个负值部分除以大于1的数。(公式中a是大于1的一个常数)

P-Relu(参数化修正线性单元)

可以看作是Leaky ReLU的一个变体,不同的是,P-ReLU中的负值部分的斜率是根据数据来定的,即a的值并不是一个常数。

R-Relu(随机纠正线性单元)

R-ReLU也是Leaky ReLU的一个变体,只不过在这里负值部分的斜率在训练的时候是随机的,即在一个范围内随机抽取a的值,不过这个值在测试环节会固定下来。

池化总结

池化的作用

  1. 抑制噪声,降低信息冗余。
  2. 提升模型的尺度不变性、旋转不变性。
  3. 降低模型计算量。
  4. 防止过拟合。

最大池化作用:保留主要特征,突出前景,提取特征的纹理信息。
平均池化作用: 保留背景信息,突出背景。(分类网络中,放在全连接层前,以保留全局全局信息。)

缺陷

削弱了位置信息(而语义分割需要丰富的位置信息),对此提出了使用空洞卷积改进(空洞卷积见后文)。

使用场景

最大池化

一般而言,前景的亮度会高于背景,因此,正如前面提到最大池化具有提取主要特征、 突出前景的作用。但在个别场合,前景暗于背景时,最大池化就不具备突出前景的作用了。
因此,当特征中只有部分信息比较有用时,使用最大池化。如网络前面的层,图像存在 噪声和很多无用的背景信息,常使用最大池化。

平均池化

平均池化取每个块的平均值,提取特征图中所有特征的信息进入下一层。因此当 特征中所有信息都比较有用时,使用平均池化。如网络最后几层,最常见的是进入分类部分 的全连接层前,常常都使用平均池化。这是因为最后几层都包含了比较丰富的语义信息,使 用最大池化会丢失很多重要信息。

空洞卷积

What is 空洞卷积?

顾名思义,空洞卷积就是有孔的卷积。。。。

我们平时用的卷积可以理解为空洞卷积的一般化,就像正方形是特殊的长方形一样。

优点

  1. 在不引入额外参数的情况下,可以通过改变空洞率(dilation rate)从而得到更大的感受野
  2. 补获上下文信息,设置不同的空洞率,感受野不同,也即获得多尺度信息。

不足

在实际中较难优化,速度折扣。

代替“池化”去下采样

一方面它可以保持空间分辨率,另外一方面它由于可以扩大感受野因而可以很好地整合上下文信息。

ResNet

残差块

Resnet提出shortcut connection, 右边直接连接的部分称为 identity mapping。该方法灵感来源于 Highway Networks。

残差块的提出是为了防止网络过深而导致网络的能力下降。
使用残差块可以进一步加深网络,在提取跟高维的信息下而不会对网络能力造成损失。

注:刚开始认为残差连接可以缓解梯度消失问题,但在后续的论文中经过实验证明它似乎并 不能。
改进:见下面的WRN(2017)

瓶颈模块( bottleneck block )

将原来两个3×3的卷积部分改成 1×1 3×3 1×1 的三个卷积部分,降低了参数量
使用瓶颈模块构建出了 ResNet34, ResNet50, ResNet101, ResNet152 等深层神经网络。

WRN(2017)

使用 identity mapping 的残差块使我们可以训练一个非常深的网络,但与此同时,残差 块也是残差网络的一个缺点。当梯度流通过整个网络时,网络不会强迫梯度流过权重层(这 会导致训练中学习不到什么)。所以很有可能少量的块能够学习有用的表达,或者很多的块分享非常少的信息,对最终结果影响很小。

加宽长差块

提出加宽残差块的方式,这种方式可以更加高效地提高残差网络性能,而不是增加 网络深度,使用这种方式构建了 wider residual networks (WRN)。

in particular, we present wider deep residual networks that significantly improved, having 50 times less layers and being more than 2 times faster.
层数减少50倍,速度快了两倍

x = Convolution2D(16* k, (3, 3), padding='same', kernel_initializer='he_normal',use_bias=False)(x)

残差块+Dropout

提出在残差块中使用 Dropout。前人的研究中,dropout 被插入到了残差网络中的 identity 连接上,这导致性能下降。而 WRN 提出 dropout 插入到卷积层之间的方式使性能有 所提升。

选网络

不知道去哪里找网络,不知道什么网络最好,不知道哪里有网络网络的推荐
那就来https://paperswithcode.com/各种网络打榜对比。

学习率

寻找合适的学习率(learning rate)

学习率是一个非常非常重要的超参数,这个参数呢,面对不同规模、不同batch-size、不同优化方式、不同数据集,其最合适的值都是不确定的,我们无法光凭经验来准确地确定lr的值,我们唯一可以做的,就是在训练中不断寻找最合适当前状态的学习率。比如下图利用fastai中的lr_find()函数寻找合适的学习率,根据下方的学习率-损失曲线得到此时合适的学习率为1e-2

推荐一篇fast.ai首席设计师 「Sylvain Gugger」 的一篇博客:How Do You Find A Good Learning Rate[1] 以及相关的论文Cyclical Learning Rates for Training Neural Networks[2]。

learning-rate与batch-size的关系

一般来说,越大的batch-size使用越大的学习率。
原理很简单,越大的batch-size意味着我们学习的时候,收敛方向的confidence越大,我们前进的方向更加坚定,而小的batch-size则显得比较杂乱,毫无规律性,因为相比批次大的时候,批次小的情况下无法照顾到更多的情况,所以需要小的学习率来保证不至于出错。可以看下图损失Loss与学习率Lr的关系:

关于图像高频,低频等名词的理解

壹、高低频

任意一张图片都有低频高频
两类区域有如下不同:

1.对于图片中低频区域(low-frequency、smooth-area),里面的点,大概率属于同一个物体,直觉上,没必要使用太多的采样点。如果使用的点太多,相当于过采样(oversample);
2.对于图片中高频区域(high-frequency),里面的点,大概率靠近物体边界。直觉上,如果这些区域的采样点太稀疏,最终会导致分割出来的物体边界过于平滑,不太真实,相当于欠采样(undersample);相反,如果采样点越多,分割出来的物体边界应该会更精细(sharp boundery)、真实。

过采样:将样本少的数据多采样几次。
欠采样:将样本多的数据少采样几次。

贰、高低特征

低特征(经过的卷积少):低级特征具有丰富的空间细节而缺乏语义信息,细节信息少
高特征(经过的卷积多):高级特征具有丰富的语义信息而缺乏空间细节,细节信息多
(可以用一个模块对这两个部分进行互补)

因为低特征图细节少,空间多,所以为了节省参数,我们可以把低特图的w,h搞小一点。
而高特征图的细节多,为了得到更好的效果,所以要尽量保持其大小。
所以我们可以把这两种feature map 结合起来,达到优势互补(许多网络都有这么干)。

叁、空间特征

图片中的H,W 维度

图片中的前景及背景
example:一张旅游的自拍照
前景:帅帅的你
背景:湖,落日,远方的孤舟

肆、语义特征

图像的语义分为视觉层、对象层和概念层。

视觉层即通常所理解的底层,即颜色、纹理和形状等等,这些特征都被称为底层特征语义;
对象层即中间层,通常包含了属性特征等,就是某一对象在某一时刻的状态;
概念层是高层,是图像表达出的最接近人类理解的东西。

通俗点说,比如一张图上有沙子,蓝天,海水等,视觉层是一块块的区分,对象层是沙子、蓝天和海水这些,概念层就是海滩,这是这张图表现出的语义。
来自:https://blog.csdn.net/qq2252852775/article/details/108903625
我们常常说浅层特征语义信息少,深层特征语义信息丰富。

神经网络学习什么东西

神经网络提取特征,即提取那些可以激活神经元的部分。

卷积的特性

普通convolution的kernel享有空间不变性(spatial-agnostic)和通道特异性(channel-specific)两大基本特性,而involution则恰恰相反,具有通道不变性(channel-agnostic)和空间特异性(spatial-specific)。

convolution kernel的大小写作 1 × 1 × C 0 × C i × K × K 1×1×C_0×C_i×K×K 1×1×C0×Ci×K×K ,其中 C 0 C_0 C0C i C_i Ci 分别是输出和输入的通道数目,而 K K K是kernel size, 1×1 一般不写,代表在 H × W H×W H×W个pixel上共享相同的kernel,即空间不变性,而每个通道C独享对应的kernel则称为通道特异性。

来自Involution作者之一李铎

卷积提取

以一个五层的卷积网络为例

第一层

我们的隐藏层要找到最大激活他的部分,一般是图像中的边缘区域,阴影区域,因此,第一层中通常会提取图像的边缘或阴影。可以是纵向、横向、甚至是不同方向的边缘,阴影可以是各种颜色的阴影。

image-20210605115204889

第二层

在第二层中提取的特征是基于第一层的,在第二层中,就要寻找这些边缘,什么部分能够最大激活我们的隐藏层,从而使我们提取的特征变得不断的详细起来。一般第二层会提取出边缘的组合,最后提取出图片更复杂的形状和模式,比如垂直图案,细线图案,原形图案等等。

image-20210605115445331

第三层

接着第三层,在基于第二层的基础上继续抽取。如果我们说前两层抽取的只是抽象图案,那么后面抽取的就是图像中的具体部分。从这里开始,我们通过对第二层图案的抽取,渐渐会构成图案中的一部分。如果图片是人,可能会提取出人的手,眼睛,鼻子

image-20210605115552327

到了第四,第五层我们抽取的特征会逐渐拥有更复杂的形状和模式逐渐构造成一个个体,最后我们抽取出的关键有用的特征数据,将成为我们对其进行分类的依据。

第四层在这里插入图片描述

第五层在这里插入图片描述

来自:工具箱的深度学习记事簿)

全连接层

全连接中的每个神经元会代表图片物体的某个特征部分,最典型的案例就是,下图中,与神经元 一 一对应的特征,猫头,猫尾…… 然后网络通过判断这张图片是否具备这些类似于猫的部位来得到预测结果。

image-20210821110553058

在有些网络我们会看到两层全连接

第一层的全连接就是上面所述的作用,第二层的全连接就是在上一层的特征上继续划分特征。例如这个猫头中

在下一层的全连接就会被细分为猫的五官等等(就是把猫头当成一整只猫,然后对其进行特征划分)

不同类型网络的特点

从网络结构本身的角度出发,可以从以下四个维度来提升卷积神经网络的性能,分别是:深度(ResNet)、宽度(WideResNet)、基数(ResNeXt)和注意力(SENet)。一般来说,网络越深,所提取到的特征就越抽象;网络越宽,其特征就越丰富;基数越大,越能发挥每个卷积核独特的作用;而注意力则是一种能够强化重要信息抑制非重要信息的方法,也是本文重点阐述的对象。

https://zhuanlan.zhihu.com/p/339215696导读部分

add与concat的区别

函数作用

add添加,就是简单的两个size相同的feature map进行数据上的一一相加。

F1.size()=[2,3]

F2.size()=[2,3]

add(F1,F2).size()=[2,3]

concat串联,就是将两个feature map进行拼接,连成一个feature。

F1.size()=[1,2,3]

F2.size()=[1,2,3]

concat(F1,F2).size()=[2,2,3]

现实意义

add是信息之间的垒加,是描述特征图像的特征下的信息量变多了,而描述图像的信息维度不变,只是每一维度下的信息量在增加,这显然是对图像分类有益的(个人理解:不同像素间的数据差异更大了,所以更容易区分)。

而concat只是描述图像的特征维度增加了,而每一特征的信息量不变。

add相比于concat的优势是参数量的缩减。concat的参数量是add的两倍。

来自:https://blog.csdn.net/qq_32256033/article/details/89516738

但是add添加虽然会增加信息,但是可能会导致信息冗余,产生一些无用的信息。

The concatenation operator is more effective than the summation due to it can integrally maintain the feature representation without destroying the information of the orginal feature map.

concat比add更有效,因为它可以在不破坏原始特征图信息的情况下整体地保持特征表示。

来自:CVPR 2021 || EPSANet: An Efficient Pyramid Split Attention Block
on Convolutional Neural Network

个人理解

从游戏技能加点上进行解释

你有3个技能点,你可以选择在已有的体力,智立,耐力上加点,或者选择开辟一个新的技能树法力。是打算练好百兵之王的枪还是十八般武艺样样精通?

注意力机制

注意力,很明显就是一个与人的视觉及神经有关的东西。

我们看电脑的时候,总是全身心的投入其中,即是妹妹从旁边走过,你也不会注意,因为电脑屏幕里是更好看的jk妹妹。

而注意力机制,就是模仿我们对图片的重点进行加权处理。

注意力分为空间注意力与通道注意力

空间注意力是获得H,W维度上的权值(输出是B×1×W×H),然后与feature map相乘。

通道注意力则是获得C 维度上的权值(输出为B×C×1×1),再与feature map 相乘。最常见的且广为人知的就是SE注意力。

然后就有一堆空间注意力+通道注意力的注意力??(感觉各种融合才是大势所趋,比如阴阳互补。。。)

啥CBAM,CA,[SAM(超越SE、CBAM的无参Attention!)](ICML2021|超越SE、CBAM,中山大学开源SAM:无参Attention! (qq.com))

还有就是添加注意力的地方

下面都是我的个人问题,看法见解。

  • SAM参数量很少,我想知道要是把它放在网络的每个地方会咋样。。。

  • 有些是把注意力放在残差块中,不懂为啥要这样。

  • 小的图片(一般是指16或32倍的下采样,一般在U-net这类比较深的结构中)会损失空间信息;对于上采样,应该会增加空间的信息,但是会导致空间信息模糊。

  • 在STDEnet与BiSenet中,我发现都有一部分是专注于空间的路径。而在STDEnet改进BiSenet的对比中,我发现两者的空间路径都是都是紧连着Input,而就算改了BiSenet的空间路径,将BiSenet(双流网络)的双流合并了,专注于空间的那条路径变成了context path 的上面一部分。

    image-20210821110416471

    (我认为可以把这一小部分看做一个空间的注意力机制)。说明啥,说明空间注意力要在网络的前端。由于低特征的图片具有更高的空间信息,所以应该把空间注意力放在前面进行指导。

    而在这两个网络中都有ARM模块,这是一个通道注意力模块,并且我们发现ARM都被放置在网络的后半部分,输入的都是中后部分的特征图。

    至于原因,emmm,学术尚浅,欢迎路过大佬指导。

只言片语

前言

这里存一些对我有感觉的句子,他们多是从论文中摘录,或者从大佬的笔记中摘录。

亦或者是我对自己一些知识碎片的整理。

在语义分割中,空间分辨率与感受野两难全。尤其是在实时语义分割下,现有的方法多是采用轻量的骨干网络或小的输入图像来加速。但是轻量的骨干网络会由于裁剪了通道而损失了空间信息,小图像相较于原图像损失了很多空间信息。

来自:Visualdust

对于图像进行特征提取

按特征提取的深度,一开始提取的feature map 是低特征,后面提取的是高特征。

而低级特征具有丰富的空间细节而缺乏语义信息,反之亦然

所以我们经常会看到将低级特征与高级特征融合,进行优势互补。。。

对于低级特征图与高级特征图的可视化,既可以在上面的卷积提取中看到。

对于第一层,也就是低级特征,我们的隐藏层要找到最大激活他的部分,一般是图像中的边缘区域,阴影区域,因此,第一层中通常会提取图像的边缘或阴影。可以是纵向、横向、甚至是不同方向的边缘,阴影可以是各种颜色的阴影。

image-20210605115204889

个人解读:

  • 找到物体的边缘区域(确定物与物之间的位置关系,好像确实跟空间沾的上边)
  • 看这可视化特征图,确实看不出啥语义性。。

下图是高级特征,确实语义性强一点。。

在这里插入图片描述

读CVPR2021 || 深度敏感注意力Deep RGB-D Saliency Detection with Depth-Sensitive Attention后回顾有感总结

有实验证明,人类的视觉是分层的,低级视觉中枢对边缘信息敏感,中级视觉中枢对纹理信息敏感,高级视觉中枢对结构信息敏感,这点和人工神经网络异曲同工之妙。

来自知乎:王晗

猜测:feature map的add与空间注意力有关,而concat与通道注意力有联系。

大多数注意力机制都是add的

读RGB-D的深度敏感注意力后,我开始发现一些网络都是多模态多融合,对于RGB-D来说

RGB与D是一种,高低特征的融合又是一种总而概之就是高低互补。

对于优势互补,我又想到了注意力机制以及注意力机制放置的地方。

持续更新ing…

神经网络综合知识小杂烩汇总相关推荐

  1. 电脑知识 小技巧汇总

    小技巧汇总 我综合了网上的有关软件应用的小巧和自己的几个,希望对大家有用,如果你有更好的请跟帖子大家共分享!有关注册表修改的,请先备份注册表! 1. 影音文件在xp中无法删除 很多情况下是因为预览功能 ...

  2. A Comprehensive Survey on Graph Neural Networks(图神经网络综合研究)

    A Comprehensive Survey on Graph Neural Networks 图神经网络综合研究 Zonghan Wu, Shirui Pan, Member, IEEE, Feng ...

  3. Java多线程知识小抄集(二)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  4. PMP49个过程组知识领域ITTO汇总 -- 项目范围管理

    项目范围管理 PMP49个过程组知识领域ITTO汇总 – 项目整合管理 PMP49个过程组知识领域ITTO汇总 – 项目范围管理 PMP49个过程组知识领域ITTO汇总 – 项目进度管理 PMP49个 ...

  5. php的知识体系结构图,高中英语全部知识体系结构图汇总

    一.简单句的五个基本句型 1.主语+不及物动词 2.主语+及物动词+宾语 3.主语+系动词+主语补语 4.主语+双宾动词+间接宾语+直接宾语 5.主语+宾补动词+宾语+宾语补语 更多英语学习办法:ht ...

  6. linux高可用小知识点汇总-行云管家

    不少运维小伙伴对于linux高可用相关知识不是很了解,今天我们小编就给大家汇总了一些,希望可以加深大家的了解.仅供参考哦! linux高可用小知识点汇总-行云管家 一.Linux是什么系统? [回答] ...

  7. 阿里深资架构师整理的Java 基础知识小抄 赶紧收藏

    本篇算是 Java 的基础知识小抄吧,之所以说小抄是因为觉得涵盖不是很细很全,但是基本的内容都有,当然后头还会继续完善,只是不会再用笔记录了!按照现在的习惯,先附上一张思维导图: 1. 安装与环境配置 ...

  8. Web前端知识技能大汇总

    Web前端知识技能大汇总 来源:github 发布时间:2015-07-08 阅读次数:3432 28 项目起源 还记得@jayli 的这幅前端知识结构图么. 图片的形式具有诸多的不便.缺失源图的我们 ...

  9. 计算机小组作品,计算机兴趣小组小作品汇总.doc

    计算机兴趣小组小作品汇总 计算机兴趣小组小作品汇总 在经过一学年春雨般的孕育下,计算机兴趣小组恰似一颗蓓蕾慢慢张开了花瓣,开始迎接朝阳的洗礼.在计科院团总支学生会的领导和大力支持下,计算机兴趣小组终于 ...

最新文章

  1. java获取真实ip工具类
  2. android studio turn off hyperv,Android Studio 无法运行模拟器
  3. 人为什么会出轨?麻省理工学院告诉你:男女配对的真相
  4. android edittext 不滚动,EditText 设置可以垂直滑动但是不可输入
  5. 华为交换机恢复出厂设置
  6. 机试指南第二章-经典入门-查找例题自解
  7. python sklearn svm 权重_sklearn svm基本使用
  8. Windows下使用Git配置SSH免密登录
  9. leetcode力扣刷题系列python——2、两数相加
  10. 超图软件 linux gis软件,超图(GIS)软件详细功能介绍.doc
  11. 做软件项目经理需要具备的品质和素质
  12. 2018校招笔试真题汇总 精
  13. 资源变现微信小程序安装教程
  14. EOS Utility无法安装的问题解决
  15. 快速学习四步法:如何用20小时,快速学习?
  16. java neon_Eclipse Neon安装指导
  17. 程序员的520,送给女友的几行漂亮的代码(python版)
  18. QSS 自定义QMessageBox
  19. Gurobi运筹学开发教程03:python+gurobi实现bender decomposition 算法示例代码
  20. 23种设计模式UML表示形式

热门文章

  1. 高性价游戏蓝牙耳机推荐,圣诞节送男朋友高颜值蓝牙耳机分享
  2. java 统计文章中每个单词出现的次数
  3. 三七女生节,看程序媛们选好口红色号,踩上高跟鞋,特别美丽,特别凶狠,特别温柔~...
  4. 桌面linux的gnu开发链包括,粤嵌科技毕业实习Day3
  5. WIN10系统禁用shift键更换输入法
  6. Python爬虫学习——开始一个小爬虫(一)
  7. Excel创建组一样可以完成隐藏和取消隐藏的功能
  8. Vue Demi是如何让你的库同时支持Vue2和Vue3的
  9. 郭为:从ModelB@nk1.0到5.0——中国金融科技的创新之路
  10. 两台不同服务器上的mysql跨库查询(FEDERATED)