Bayesian Compression for Deep Learning 阅读笔记
Bayesian Compression for Deep Learning 阅读笔记
- 一、论文摘要
- 二、模型介绍
- 2.1 概述
- 2.2 变分贝叶斯和最小描述长度
- 2.2.1 变分推断
- 2.2.2 最小描述长度准则
- 2.2.3 Reparametrization Trick
- 2.3 通过高斯分布的比例混合实现贝叶斯压缩
- 2.3.1 scale-mixtures of normals分布族
- 2.3.2 Reparametrizing variational dropout for group sparsity
- 什么是 variational dropout ?
- Additive Noise Reparameterization
- Approximation of KL Divergence
- 为什么 variational dropout 可以引入稀疏性?
- 如何利用variational dropout搭建全连接层和卷积层
- 损失函数
- 2.4 通过半柯西先验实现贝叶斯压缩
- 三、实验结果
论文: https://papers.nips.cc/paper/6921-bayesian-compression-for-deep-learning.pdf
代码: https://github.com/KarenUllrich/Tutorial_BayesianCompressionForDL
一、论文摘要
深度学习中的压缩和计算效率已经成为一个非常重要的问题。在这项工作中,我们认为解决这个问题最有原则和最有效的方法是采用贝叶斯观点,通过先验分布引入稀疏性,进而对网络进行剪枝。
本文介绍了两个创新点:
- 使用的层次先验最后剪枝的是节点(结构),而非单个权重(参数);
- 使用后验不确定性确定最优的固定点准确率来编码权重。
Key Points:为网络权重参数设置0均值的高斯先验,讨论了高斯先验的scale的两种先验分布;使用变分贝叶斯估计,全贝叶斯学习,目的是让网络的各层的有效权重减小。
二、模型介绍
2.1 概述
深度学习的复杂的网络在实际应用中意味着计算、带宽的巨大消耗,以及延时。
Alexnet的卷积层占4%的参数,91%的计算量。
现有方法大多数是减少网络结构和有效权重,在控制精度的同时减少无效节点的个数,减掉不必要的连接,再用一个大网络来训练一个小网络。
从贝叶斯的角度看,减少网络结构和权重个数与实现高进度本身是可以同时存在的。因为贝叶斯方法本身就探索最佳模型结构(先验分布引入稀疏性,进而对网络进行剪枝),并通过奖励参数后验分布中的不确定性(即信息量,可以通过bits back argument的方法)移除无关紧要的信息。
本文使用变分贝叶斯近似来进行贝叶斯推理,这也已经在模型压缩方面得到了明确的解释。通过对隐变量(而不是单个权重)采用先验引入稀疏性,我们可以修剪神经元,包括它们所有的输入和输出权重。这避免了修剪或矢量量化单个权重所需的更复杂和低效的编码方案。作为贝叶斯的额外奖励,可以使用变分后验不确定性来评估哪些比特是重要的,并去除那些在近似后验采样下波动太大的比特,由此推导出每层的最佳定点精度。
2.2 变分贝叶斯和最小描述长度
- 变分贝叶斯:
变分推断(Variational Inference) - 最小描述长度(MDL):
最小描述长度准则
2.2.1 变分推断
问题描述
变分推断就是近似不可观测变量的后验概率,以便通过这些变量作出统计推断,即近似求P(Z∣D)P(Z|D)P(Z∣D),D为数据,Z为隐变量。
以上可以总结为这个问题:有一组观测数据D,并且已知模型的形式,求参数与潜变量(或不可观测变量)Z={Z1,...,Zn}Z=\{Z1,...,Zn\}Z={Z1,...,Zn} 的后验分布: P(Z∣D)P(Z|D)P(Z∣D)。
正如上文所描述的后验概率的形式通常是很复杂(Intractable)的,对于一种算法如果不能在多项式时间内求解,往往不是我们所考虑的。因而我们想能不能在误差允许的范围内,用更简单、容易理解(tractable)的数学形式Q(Z)Q(Z)Q(Z)来近似P(Z∣D)P(Z|D)P(Z∣D),即 P(Z∣D)≈Q(Z)P(Z|D)≈Q(Z)P(Z∣D)≈Q(Z),而这里的Q(Z)Q(Z)Q(Z)就是变分。
现在等式两边同时对q(z)做期望,即,
∫q(z)logP(x)dz=∫q(z)logP(x,z)dz−∫q(z)logq(z)dz+∫q(z)logq(z)P(z∣x)dz\int q(z)\log P(x)dz=\int q(z)\log P(x,z)dz - \int q(z)\log q(z)dz + \int q(z)\log\frac{q(z)}{P(z|x)}dz∫q(z)logP(x)dz=∫q(z)logP(x,z)dz−∫q(z)logq(z)dz+∫q(z)logP(z∣x)q(z)dz
由于q(z)q(z)q(z)与P(x)P(x)P(x)无关,所以∫q(z)logP(x)dz=logP(x)\int q(z)\log P(x)dz=\log P(x)∫q(z)logP(x)dz=logP(x),原式最终变为:
logP(x)=∫q(z)logP(x,z)dz−∫q(z)logq(z)dz⎵L(q(z)),ELOB(EvidenceLowerBound)+∫q(z)logq(z)P(z∣x)dz⎵KL(q(z)∣∣P(z∣x))\log P(x) = \underbrace{\int q(z)\log P(x,z)dz - \int q(z)\log q(z)dz}_{L(q(z)), ELOB(Evidence\ Lower\ Bound)} + \underbrace{\int q(z)\log\frac{q(z)}{P(z|x)}dz}_{KL(q(z)||P(z|x))} logP(x)=L(q(z)),ELOB(Evidence Lower Bound)∫q(z)logP(x,z)dz−∫q(z)logq(z)dz+KL(q(z)∣∣P(z∣x))∫q(z)logP(z∣x)q(z)dz
我们可以通过如上的式子分解得到以下的结论,KL散度是用来衡量两个分布之间的距离,当距离为0时,表示这两个分布完全一致。P(x)P(x)P(x)不变,那么想让KL(q(z)∣∣P(z∣x))KL(q(z)||P(z|x))KL(q(z)∣∣P(z∣x))越小,即让ELOB越大(因为KL≥0KL≥0KL≥0,所以logP(x)≥ELOBlogP(x)≥ELOBlogP(x)≥ELOB)。所以我们想让P(Z∣D)≈Q(Z)P(Z|D)≈Q(Z)P(Z∣D)≈Q(Z)即让KL≈0KL≈0KL≈0,即最大化ELOB即可。logP(D)=DKL(Q∣∣P)−∑ZQ(Z)logQ(Z)P(Z,D)=DKL(Q∣∣P)+L(Q).\log P(D) = {D_{KL}}(Q \vert \vert P) - \sum\limits_Z {Q(Z)\log \frac{Q(Z)}{P(Z,D)}} ={D_{KL}}(Q \vert \vert P) + L(Q).logP(D)=DKL(Q∣∣P)−Z∑Q(Z)logP(Z,D)Q(Z)=DKL(Q∣∣P)+L(Q).求解过程(极大化L(q))
根据平均长理论,变分分布Q(Z)可以通过参数和潜在变量的划分(partition)因式分解,比如将ZZZ划分为Z1…ZMZ_1…Z_MZ1…ZM。根据以上假设,我们来最大化下界L(q)L(q)L(q),因为假设qi(Zi)q_i(Z_i)qi(Zi)分布之间都是独立的,所以我们依次轮流来优化,以qj(Zj)q_j(Z_j)qj(Zj)为例(为了简单起见,缩写为qjq_jqj)。
L(qj)=∫∏iqj{lnp(X,Z)−∑ilnqi}dZ=∫qj{∫lnp(X,Z)∏i≠jqidZi}dZj−∫qjlnqjdZj+const=∫qjlnp~(X,Zj)dZj−∫qjlnqjdZj+const\begin{aligned} L(q_j) & =\int \prod_{i}q_j\{\ln p(\mathbf{X},\mathbf{Z})-\sum_i \ln q_i\} d\mathbf{Z} \\ &= \int q_j\{\int \ln p(\mathbf{X},\mathbf{Z})\prod_{i\neq j}q_i d\mathbf{Z}_i\}d\mathbf{Z}_j-\int q_j\ln q_j d\mathbf{Z}_j+const \\ &=\int q_j \ln \tilde{p}(\mathbf{X},\mathbf{Z}_j)d\mathbf{Z}_j-\int q_j\ln q_j d\mathbf{Z}_j +const \\ \end{aligned} L(qj)=∫i∏qj{lnp(X,Z)−i∑lnqi}dZ=∫qj{∫lnp(X,Z)i̸=j∏qidZi}dZj−∫qjlnqjdZj+const=∫qjlnp~(X,Zj)dZj−∫qjlnqjdZj+const
这里我们定义一个新分布lnp^(X,Zj)ln p\hat{~}(X,Z_j)lnp ^(X,Zj)为
lnp~(X,Zj)=∫lnp(X,Z)∏i≠jqidZi\ln \tilde{p}(\mathbf{X},\mathbf{Z}_j)=\int \ln p(\mathbf{X},\mathbf{Z})\prod_{i\neq j}q_i d\mathbf{Z}_ilnp~(X,Zj)=∫lnp(X,Z)i̸=j∏qidZi我们发现它刚好是除去与qjq_jqj分布相关的zjz_jzj之后原似然的期望值,有lnp~(X,Zj)=Ei≠j[lnp(X,Z)]+const\ln \tilde{p}(\mathbf{X},\mathbf{Z}_j)=\mathbb{E}_{i\neq j}[\ln p(\mathbf{X},\mathbf{Z})]+constlnp~(X,Zj)=Ei̸=j[lnp(X,Z)]+const我们观察L(qj)L(q_j)L(qj)的最后一行推导,会发现就是qj(Zj)q_j(Z_j)qj(Zj)和p^(X,Zj)p\hat~(X,Z_j)p ^(X,Zj)的KL散度的负值,这里我们固定qi≠jqi≠jqi̸=j不变,那么最大化L(q)L(q)L(q)就变成了最小化这个KL散度,而KL散度的最小值在qj(Zj)=lnp^(X,Zj)qj(Zj)=lnp\hat~(X,Z_j)qj(Zj)=lnp ^(X,Zj)时取到。所以,最优解qj∗(Zj)q^∗_j(Z_j)qj∗(Zj)为lnqj∗(Zj)=Ei≠j[lnp(X,Z)]+C\ln q^*_j(\mathbf{Z}_j)=\mathbb{E}_{i\neq j}[\ln p(\mathbf{X},\mathbf{Z})]+Clnqj∗(Zj)=Ei̸=j[lnp(X,Z)]+C另加的这个C是为了归一化整个分布,有C=∫exp(Ei≠j[lnp(X,Z)])dZjC=\int exp(\mathbb{E}_{i\neq j}[\ln p(\mathbf{X},\mathbf{Z})])d\mathbf{Z}_jC=∫exp(Ei̸=j[lnp(X,Z)])dZj ,然后依次更新其他Zj,最终相互迭代达到稳定。
2.2.2 最小描述长度准则
提出最小描述长度(MDL)的目的是为了根据信息论中的基本概念来解释极大后验假设(MAP)。
信息论中的一个基本定理是最小描述长度原则。它与压缩直接相关,因为它将最佳假设定义为用最小位数传递模型(复杂性成本LCL_CLC)和数据失配(错误成本LEL_ELE)的总和的假设。即ELOB可以分解为:
其中H()H()H()为信息熵。
数据拟合误差Error Cost: LE=Eqϕ(w)[logp(D∣w)]L^E=E_{q_\phi(w)}\left[ \log p(D|w)\right]LE=Eqϕ(w)[logp(D∣w)]模型复杂度Complexity Cost: LC=Eqϕ(w)[logp(w)]+H(qϕ(w))L^C=E_{q_\phi(w)}\left[ \log p(w)\right]+H(q_\phi(w))LC=Eqϕ(w)[logp(w)]+H(qϕ(w))Evidence下界ELBO L(ϕ)=LE+LCL(\phi)=L^E+L^CL(ϕ)=LE+LC 表示出了通讯的最小代价。
为权重引入先验得到稀疏性往往可以压缩模型,也可以通过qϕ(w)q_{\phi}(w)qϕ(w)噪声权重编码,利用熵的bits−back argument,使得熵项无限接近负无限H(δ(w))=−infH(\delta (w))=-\infH(δ(w))=−inf。
实践中 噪声权重编码的神经网络的数据拟合误差项是非常复杂的,常采用蒙特卡洛积分。 连续的qϕ(w)q_{\phi}(w)qϕ(w)可以使用reparametrization技巧,不是从qϕ(w)q_{\phi}(w)qϕ(w)中采样,而是通过噪声变量ϵ\epsilonϵ和变分参数ϕϕϕ的确定函数采样。
LE=Ep(ϵ)[logp(D∣f(ϕ,ϵ))]L^E=E_{p(\epsilon)}\left[ \log p(D| f(\phi,\epsilon) )\right]LE=Ep(ϵ)[logp(D∣f(ϕ,ϵ))]
2.2.3 Reparametrization Trick
说到reparametrization trick,其实挺简单的,但是对于变分推断的可解性上面却有很大的作用。
对于reparameter trick的理解就是,上对于上面求出的ELOB:
很多时候我们很难精确地计算其的值,但我们可以通过随机采样zzz来实现优化目标,但这会导致每次优化都要重新采样,进而得到的解方差很大。所以有人提出了使用reparameter trick的方法:z=g~(x,ϵ)withϵ∼p(ϵ)z = \tilde{g}(x,\epsilon) \quad with\quad\epsilon\sim p(\epsilon)z=g~(x,ϵ)withϵ∼p(ϵ) 类似这样的一个固定函数进行表示zzz,通过采样ϵ\epsilonϵ来得到zzz,将zzz的随机部分和确定性部分分开,可以有效减少解的方差。
后面又有人提出了local reparameter trick的方法进一步减少这个方差,其思想是为在mini-batch中的每个数据的权重单独采样。
qϕ(wi,j)=N(µi,j,σi,j2)对于任意wi,j∈Wq _\phi (w_{i,j}) = N(µ_{i,j} ,\sigma^2_{i,j} ) 对于任意 w_{i,j} \in Wqϕ(wi,j)=N(µi,j,σi,j2)对于任意wi,j∈W这样就可以确定权重参数之间的协方差为0。
2.3 通过高斯分布的比例混合实现贝叶斯压缩
2.3.1 scale-mixtures of normals分布族
将zzz看做随机变量,得到www的边界先验分布(积分掉zzz后得www的相对于数据D的先验分布)有长尾,且更聚集在0点。随后w的后验分布就会偏向稀疏。
z∼p(z);w∼N(w;0,z2)z\sim p(z); w\sim N(w; 0,z^2)z∼p(z);w∼N(w;0,z2)zzz 是参数www的先验分布的scale。
这是一种比较通用的分布族,许多能导致稀疏性的分布都是它的特例,例如:
- spike&slab分布p(w)是伯努利分布。神经网络的dropout正来源于这个分布
- Laplace分布 p(z2)=exp(λ)p(z^2)=exp(λ)p(z2)=exp(λ)。laplace先验的后验分布是Lasso估计。有被用到稀疏化神经网络。但是容易压榨大信号,且只提供点估计,没有保留不确定性,容易过拟合且压缩性不够好。
- 不含超参数的log-uniform先验,half-cauchy先验得到horseshoe分布,spike$slab先验的连续松弛。
2.3.2 Reparametrizing variational dropout for group sparsity
什么是 variational dropout ?
首先先说一下什么是 variational dropout,对于神经网络中任意一层的dropout实际上可以写成如下形式:
其中AAA和BBB分别是输入和输出, ΞΞΞ是一个噪声矩阵,而WWW是权重参数。我们最常见的dropout其实就是 ξij∼Bernoulli(1−p)ξ_{ij} ∼ Bernoulli(1 − p)ξij∼Bernoulli(1−p),使得输入矩阵的权重参数以ppp的概率为0,其可以称为binary dropout。
后面又有人提出了高斯dropout,这里 ξij∼N(1,α=p1−p)ξ_{ij}∼ N(1,α =\frac{p}{1−p })ξij∼N(1,α=1−pp),即均值为1,方差为α\alphaα的高斯分布,引入连续噪声而不是离散噪声很重要,因为向输入中添加高斯噪声相当于将高斯噪声引入到权重中,该过程可用于获得模型权重的后验分布。因此,将高斯噪声加入到权重中,实际上相当于在 q(wij)=N(θij,αθij2)q(w_{ij} ) = N(θ_{ij} ,αθ^2_{ij} )q(wij)=N(θij,αθij2) 的分布上采样权重wijw_{ij}wij,即
这里同样也可以用到上面提过的reparameter trick的方法。
而 variational dropout 实际上就是用q(w∣θ,α)q(w|θ,α)q(w∣θ,α)分布作为参数的后验近似。当ααα是固定值的时候,其就是高斯dropout,只不过这里将ααα作为了一个学习的参数而不是超参数。同样这里ααα可以是任意值而不是像高斯dropout一样α≤1α ≤ 1α≤1。
Additive Noise Reparameterization
但是在加入了这样的噪声以后,当ααα特别大的时候梯度也会很大,因为
所以论文中的方法是增加了一个额外的噪声项Additive Noise σij⋅ϵijσ_{ij} · \epsilon_{ij}σij⋅ϵij其中σij2=αijθij2σ^2_{ij}= α_{ij} θ^2_{ij}σij2=αijθij2,梯度就变为了
Approximation of KL Divergence
为了方便计算损失,可以将KL散度写成了一个具体的ααα的函数,其中σ是sigmoid函数。
这样做的好处是当ααα趋近于无穷的时候KL散度会趋近于0,同时还利于比较不同尺度网络的损失。
为什么 variational dropout 可以引入稀疏性?
当αij→+∞α_{ij} → +∞αij→+∞的时候其实相当于binary dropout中p=1p=1p=1的情况。可以试想如果我们给予网络的每个权重都非常大的扰动,网络不管怎么改变都不能减少loss,所以其最好的办法就是所有的权重都为0。
可以从另一个角度来看待这种情况。大的αijα_{ij}αij对应于wijw_{ij}wij中无限大的乘性噪声。这意味着该权重的值将是完全随机的,其大小将是无界的,这将破坏模型预测并降低预期的对数可能性。因此,以将αijθij2α_{i}jθ^2_{ij}αijθij2变为零的方式将相应的权重θijθ_{ij}θij置零是有益的,从中引入了稀疏性。这意味着后面这个重量的边缘分布实际上是一个δδδ函数,以零为中心。
其中δ(wij)δ(w_{ij})δ(wij)为Dirac delta function,以0为中心。即δ(x)={∞if x=00if x≠0\delta\left(x\right)=\left\{\begin{matrix} \infty \quad &\text{if } x=0\\ 0\quad &\text{if } x\neq 0 \end{matrix}\right. δ(x)={∞0if x=0if x̸=0
如何利用variational dropout搭建全连接层和卷积层
为了通过变分差训练稀疏化模型,我们用KL散度的近似值优化变分差目标,KL散度对于dropout rate ααα的所有值都是精确的。
在代码实现的时候为了减少损失函数的方差,同时使用 Local Reparameterization trick 和 Additive Noise Reparameterization。
对于一个全连接层,其输出bijb_{ij}bij的计算方式如下:
bij∼N(μij,δij)b_{ij} \sim N(\mu_{ij},\delta_{ij})bij∼N(μij,δij)其中μij\mu_{ij}μij和δij\delta_{ij}δij的由dropout rate α\alphaα得到,μij=∑k=1Kαikθkj,δij=αik∑k=1Kαik2θkj2\mu_{ij} = \sum^K_{k=1}\alpha_{ik}\theta_{kj}, \delta_{ij} = \alpha_{ik}\sum^K_{k=1}\alpha^2_{ik}\theta^2_{kj}μij=k=1∑Kαikθkj,δij=αikk=1∑Kαik2θkj2而dropout rate ααα由变分参数θkh×w×Cθ^{h×w×C}_kθkh×w×C和σkh×w×Cσ^{h×w×C}_kσkh×w×C得到αik=exp(logσij2−logθij2)\alpha_{ik} = exp(log σ^2_{ij} - log θ^2_{ij})αik=exp(logσij2−logθij2)用代码实现起来其实很简单,由于μij\mu_{ij}μij和δij\delta_{ij}δij是由α\alphaα得到,而α\alphaα又是由两个参数矩阵的计算得到的,所以μij\mu_{ij}μij和δij\delta_{ij}δij可以直接如下定义:
def reparametrize(mu, logvar, sampling=True):if sampling: # 训练的时候使用std = logvar.mul(0.5).exp_() # exp(0.5*logvar)eps = torch.FloatTensor(std.size()).normal_()eps = Variable(eps)return mu + eps * stdelse: # 测试的时候使用return mu# dropout params
z_mu = Parameter(torch.Tensor(in_features))
z_logvar = Parameter(torch.Tensor(in_features)) # = z_mu^2 * alpha
# weight params
weight_mu = Parameter(torch.Tensor(out_features, in_features))
weight_logvar = Parameter(torch.Tensor(out_features, in_features))
bias_mu = Parameter(torch.Tensor(out_features))
bias_logvar = Parameter(torch.Tensor(out_features))z = reparametrize(z_mu.repeat(batch_size, 1), z_logvar.repeat(batch_size, 1))
# apply local reparametrisation trick (这一步完成了上面mu和delta的计算)
xz = x * z # x is input
mu_activations = F.linear(xz, weight_mu, bias_mu) # input / weight / bias
var_activations = F.linear(xz.pow(2), weight_logvar.exp(), bias_logvar.exp())output = reparametrize(mu_activations, var_activations.log())
卷积层的计算方式类似,直接贴图:
其中所有的()2()^2()2、log()log()log()和exp()exp()exp()都是element-wise的,⨀\bigodot⨀代表点乘,∗*∗代表卷积操作,vec()vec()vec()代表将矩阵或者张量reshape成向量。
损失函数
至于损失函数即ELOB,等于分类误差加上归一化后的KL散度,具体代码如下:
d_error = cross_entropy(output, target)
N = len(train_loader.dataset)
variational_bound = d_error + kl_divergence / N
2.4 通过半柯西先验实现贝叶斯压缩
(这块内容未来有空再补,代码方面实现较为简单,和2.3类似)
三、实验结果
在不同的网络和不同的数据集上都在不损失精度的前提下达到了不错的压缩效果。
并且随着训练,每一层的参数矩阵会有越来越多的权重置零。
Bayesian Compression for Deep Learning 阅读笔记相关推荐
- Alpa: Automating Inter- and Intra-Operator Parallelism for Distributed Deep Learning阅读笔记
Alpa: Automating Inter- and Intra-Operator Parallelism for Distributed Deep Learning Alpa阅读笔记 一.论文的研 ...
- Modularity Based Community Detection with Deep Learning 阅读笔记
一.创新点 1.提出DNR模型 2.对DNR模型改进,加入节点约束,提出semi-DNR模型 3.第一次将深度学习应用到社区检测 二.研究背景 模块或群落结构的识别对于描述和理解复杂系 ...
- Ranked List Loss for Deep Metric Learning | 阅读笔记
Ranked List Loss for Deep Metric Learning | 阅读笔记 这是CVPR2019上一篇度量学习的论文. 摘要 深度度量学习(DML)的目的是学习可以捕获数据点之间 ...
- Deep Learning论文笔记之(五)CNN卷积神经网络代码理解
Deep Learning论文笔记之(五)CNN卷积神经网络代码理解 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但 ...
- 笔记 | 吴恩达Coursera Deep Learning学习笔记
向AI转型的程序员都关注了这个号☝☝☝ 作者:Lisa Song 微软总部云智能高级数据科学家,现居西雅图.具有多年机器学习和深度学习的应用经验,熟悉各种业务场景下机器学习和人工智能产品的需求分析.架 ...
- Deep Learning论文笔记之(八)Deep Learning最新综述
Deep Learning论文笔记之(八)Deep Learning最新综述 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但老感觉看完 ...
- Deep Learning论文笔记之(七)深度网络高层特征可视化
Deep Learning论文笔记之(七)深度网络高层特征可视化 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但老感 ...
- Deep Learning论文笔记之(六)Multi-Stage多级架构分析
Deep Learning论文笔记之(六)Multi-Stage多级架构分析 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些 ...
- Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文, ...
最新文章
- 卷积有多少种?一文读懂深度学习中的各种卷积
- windows开启ssh当跳板机
- 作为一个测试人员,在你提出问题之前请先想想如下问题
- Linux 查看CPU信息、机器型号等硬件信息
- hadoop2.0以后不需要借助cywin运行在Windows上
- mycat mysql ha 方案_7、基于 HA 机制的 Mycat 高可用--mycat
- 史上最容易理解的暴力递归和动态规划~~
- Java基础入门笔记-数组对象
- form表单重复提交
- 罗永浩承认陷危机;AI 应届博士 80 万年薪也难招;扎克伯格将解雇泄密员工 | 极客头条...
- Python基础-Pygame游戏框架之飞机大战
- 计算机组成原理 王道考研2021 第一章:计算机组成原理概述 -- 计算机的性能指标、机器字长
- 工程量清单软件测试,输变电工程量清单投标标准化应用软件BQB2017基本操作方法...
- IText与pdfObject.js在线展示后台生成pdf文件流
- Proteus仿真:使用8255输出连续方波
- php 判断浏览器和设备
- linux 切换gnome kde桌面,科学网—openSUSE15.1切换桌面环境(从Gnome至KDE Plasma) - 潘林的博文...
- canvas将两张图片合并成一张图片并下载
- OpenNURBS 3DM Viewer
- python入门之字符串处理_python基础教程之python字符串处理方法|python基础教程|python入门|python教程...
热门文章
- iOS 解决CADisplayLink造成循环引用方案
- java捕获sybase主键重复异常_sybase错误码
- Mythical Games宣布与韩国领先游戏发行商Kakao Games合作,推动亚太区业务扩张
- 微信小程序实战 -- map:根据百度地图的api来获取地址信息
- 2022年危险化学品生产单位安全生产管理人员考试模拟100题及答案
- zookeeper源码解析--请求处理--FinalRequestProcessor
- 2020年PMP考证时间又推迟了,今年还有考的必要吗?
- java中阿里短信服务(附带随机短信验证码生成类) --菜鸟小回
- 使用低价的ST103MCU+通达的串口屏加速芯片来实现串口屏显示
- flutter dialog中软键盘遮挡解决冲突