论文解读二代GCN《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
Paper Information
Title:Convolutional Neural Networks on Graphs with Fast Localized Spectral FilteringAuthors:Michaël DefferrardXavier BressonPierre VandergheynstPaper:Download Source:NeurIPS 2016
Abstract
基于 spectral graph theory ,为设计 localized convolutional filters on graphs 提供了必要的数学背景和有效的数值方案。
Our method’s advantages:
- The proposed technique offers linear computational complexity.
- Constant learning complexity.
Review
At the begining ,we just do a review about the first generation GCN.
xk+1,j=h(V∑i=1fk−1Fk,i,jVTxk,i)(j=1…fk)xk+1,j=h(V∑i=1fk−1Fk,i,jVTxk,i)(j=1…fk)x_{k+1, j}=h\left(V \sum \limits _{i=1}^{f_{k-1}} F_{k, i, j} V^{T} x_{k, i}\right) \quad\left(j=1 \ldots f_{k}\right)
其中,F(k,i,j)F(k,i,j)F(k,i,j) 是图卷积神经网络在第 kkk 层的 filter ,可学习,具有任意性。由图卷积公式可以看出,卷积核不具备局部性,并且依赖于图的 Laplacian 的谱分解。
1 Introduction
CNN的优势:
- Offer an efficient architecture to extract highly meaningful statistical patterns in large-scale and high-dimensional datasets.
- Can learn local stationary structures.
- Can compose the local stationary structures to form multi-scale hierarchical patterns in many domain.
What CNN do?
- CNNs extract the local stationarity property of the input data or signals by revealing local features that are shared across the data domain.
- Similar features are identifified with localized convolutional fifilters or kernels,which are learned from the data.
Why CNN can recognize identical features independently of their spatial locations?
- Due to Convolutional filters are shift or translation-invariant filters.
Then,explain the common of non-Euclidean data ,such as social networks, gene data on biological regulatory networks, log data on telecommunication networks, or text documents on word embeddings
Why CNN can’t apply in graph directly?
- The convolution and pooling operators are only defined for regular grids.
- Major bottleneck : how to define a localized graph filters which are efficient to evaluate and learn.
Main contributions as the following:
- Spectral formulation. If you have the ability ,you can read this paper at first.——《 The Emerging Field of Signal Processing on Graphs: Extending High-Dimensional Data Analysis to Networks and other Irregular Domains》
- Strictly localized fifilters. 本文提出的 spectral filters 在以中心节点的为半径的最短路径内是严格局部化的。
- Low computational complexity. 本文提出的卷积核的复杂度是和卷积核的尺寸以及边的数量成线性关系的,另外由于大多数图稀疏的,我们可以估计地认为 |ε|≪n2|ε|≪n2|\varepsilon| \ll n^{2} 并且 |ε|=kn|ε|=kn|\varepsilon|=k n ,也就是每个节点只和 kkk 个近邻有边,这样复杂度就和节点数量成线性关系。另外本方法避免了使用 Fourier basis,因此不再需要进行昂贵的 EVD (特征值分解) 以及存储 Fourier basis(使用一个大小的矩阵)。除了数据,本方法只需要存储 Laplacian matrix 这个包含 |E||E||\mathcal{E}| non-zero values 的 sparse 矩阵。
- Efficient pooling. 将顶点重新排列为一个二叉树结构。
- Experimental results. 通过实验证明了方法的有效性,并与其他方法进行了对比。
2 Proposed Technique
Generalizing CNNs to graphs requires three fundamental steps:
- the design of localized convolutional filters on graphs(局部卷积核设置);
- a graph coarsening procedure that groups together similar vertices (图的粗化);
- a graph pooling operation that trades spatial resolution for higher filter resolution(图的池化).
2.1 Learning Fast Localized Spectral Filters
Two strategies to define convolutional filters:
- from a spatial approach.
- from a spectral approach.
Why not choose spatial approach?
- Although graph convolution in the spatial domain is conceivable, it faces the challenge of matching local neighborhoods .
- No unique mathematical definition of translation on graphs from a spatial perspective.
Spectral filter’s challenge:
- 频域卷积核需要借助 convolutions with a Kronecker delta implemented ;
- 由于要与 Graph Fourier basis 相乘,会产生 O(n2)O(n2)O\left(n^{2}\right) 的复杂度,转换成本高。
2.1.1 Graph Fourier Transform
x:V→Rx:V→R x: \mathcal{V} \rightarrow \mathbb{R} defined on the nodes of the graph may be regarded as a vector x∈Rnx∈Rnx \in \mathbb{R}^{n} where xixix_{i} is the value of xxx at the ithithi^{t h} node.
graph Laplacian :L=UΛUTL=UΛUTL=U \Lambda U^{T} (L=D−W∈Rn×nL=D−W∈Rn×nL=D-W \in \mathbb{R}^{n \times n} or L=In−D−1/2WD−1/2L=In−D−1/2WD−1/2L=I_{n}-D^{-1 / 2} W D^{-1 / 2})
where
- LLL is a real symmetric positive semidefinite matrix.
- Fourier basis U=[u0,…,un−1]∈Rn×nU=[u0,…,un−1]∈Rn×nU=\left[u_{0}, \ldots, u_{n-1}\right] \in \mathbb{R}^{n \times n}.
- orthonormal eigenvectors {ul}n−1l=0∈Rn{ul}l=0n−1∈Rn\left{u_{l}\right}_{l=0}^{n-1} \in \mathbb{R}^{n} and nonnegative eigenvalues {λl}n−1l=0{λl}l=0n−1\left{\lambda_{l}\right}_{l=0}^{n-1} .
- Λ=diag([λ0,…,λn−1])∈Rn×nΛ=diag([λ0,…,λn−1])∈Rn×n\Lambda=\operatorname{diag}\left(\left[\lambda_{0}, \ldots, \lambda_{n-1}\right]\right) \in \mathbb{R}^{n \times n} .
A signal x∈Rnx∈Rnx \in \mathbb{R}^{n} is then defined as x=UTx∈Rnx=UTx∈Rn\hat{x}=U^{T} x \in \mathbb{R}^{n} , and its inverse as x=Uxx=Uxx=U \hat{x} .
2.1.2 Spectral filtering of graph signals
由于很难在 vertex domain (理解为空域) 定义一个 translation operator,所以考虑在 graph 上借由 Fourier domain (理解为频域)去定义一个 convolution operator 。这里将两个图信号的卷积操作记作:
x∗Gy=U((UTx)⊙(UTy))x∗Gy=U((UTx)⊙(UTy))x *_{G} y=U\left(\left(U^{T} x\right) \odot\left(U^{T} y\right)\right)
将图信号 xxx 的经过 gθgθg_{\theta} 卷积,写成:
y=gθ(L)x=gθ(UΛUT)x=Ugθ(Λ)UTxy=gθ(L)x=gθ(UΛUT)x=Ugθ(Λ)UTxy=g_{\theta}(L) x=g_{\theta}\left(U \Lambda U^{T}\right) x=U g_{\theta}(\Lambda) U^{T} x
其中
gθ(Λ)=diag(θ)gθ(Λ)=diag(θ)g_{\theta}(\Lambda)=\operatorname{diag}(\theta)
是特征值的对角矩阵。一个非参数化(non-parametric)的卷积核,也就是说它的参数全部都是自由参数。
这里 θ∈Rnθ∈Rn\theta \in \mathbb{R}^{n} ,是一个傅里叶系数向量,其实可以理解为卷积核与相乘后的结果,这个结果的每一维相当于这一维对应的特征向量的系数。
其他解释:
图上的傅里叶变换与逆变换为:
f=UTff=Uff=UTff=Uf\begin{array}{l}\hat{f}=U^{T} f \f=U \hat{f}\end{array}
根据傅里叶变换与卷积的关系,为了导出图卷积公式,我们先计算图与卷积核的傅里叶变换,再将其相乘,最后求其逆变换:
f∗g=F−1(F(f)F(g))f∗g=F−1(F(f)F(g))f * g=\mathscr{F}^{-1}(\mathscr{F}(f) \mathscr{F}(g))
带入可得:
f∗g=U((UTf)⊙(UTg))f∗g=U((UTf)⊙(UTg))f * g=U\left(\left(U^{T} f\right) \odot\left(U^{T} g\right)\right)
这里对于卷积核的傅里叶变换我们可以写为:
UTg=(g(λ1),g(λ2),…,g(λn))TUTg=(g(λ1),g(λ2),…,g(λn))TU^{T} g=\left(\hat{g}\left(\lambda_{1}\right), \hat{g}\left(\lambda_{2}\right), \ldots, \hat{g}\left(\lambda_{n}\right)\right)^{T}
故可将哈达马积去掉,写成:
f∗g=Udiag(g(λ1),g(λ2),…,g(λn))UTff∗g=Udiag(g(λ1),g(λ2),…,g(λn))UTff * g=U \operatorname{diag}\left(\hat{g}\left(\lambda_{1}\right), \hat{g}\left(\lambda_{2}\right), \ldots, \hat{g}\left(\lambda_{n}\right)\right) U^{T} f
2.1.3 Polynomial parametrization for localized filters.
前述非参数化的卷积核有两个局限性:
- 这样的卷积核在空间上不是局部化的;
- 学习复杂度是 O(n)O(n)O(n)。
这些问题可以通过使用多项式滤波器来解决
gθ(Λ)=∑k=0K−1θkΛkgθ(Λ)=∑k=0K−1θkΛkg_{\theta}(\Lambda)=\sum \limits _{k=0}^{K-1} \theta_{k} \Lambda^{k}
其中 θ∈RKθ∈RK\theta \in \mathbb{R}^{K} ,是多项式的系数向量,是要学习的参数。此时,图信号被 gθgθg_{\theta} 所卷积后得到的结果为:
y=U(∑k=0K−1θkΛk)UTx=(∑k=0K−1θkUΛkUT)x=∑k=0K−1θkLkxy=U(∑k=0K−1θkΛk)UTx=(∑k=0K−1θkUΛkUT)x=∑k=0K−1θkLkx\begin{array}{l}y&=U\left(\sum \limits _{k=0}^{K-1} \theta_{k} \Lambda^{k}\right) U^{T} x \&=\left(\sum \limits_{k=0}^{K-1} \theta_{k} U \Lambda^{k} U^{T}\right) x \&=\sum \limits_{k=0}^{K-1} \theta_{k} L^{k} x\end{array}
经证明,当 dG(i,j)>KdG(i,j)>Kd_{G}(i, j)>K 时有 (LK)i,j=0(LK)i,j=0\left(L^{K}\right)_{i, j}=0, 其中 dGdG d_{G} 代表最短路径距离。此时就说这样的卷积核是严格 K-localized 的。另外,学习参数复杂度为 O(K)O(K)O(K) ,与 CNN相同。
此种卷积核有以下特点:
- 卷积核只有 KKK 个参数,一般 K≪nK≪nK \ll n ,参数复杂度大大降低;
- 不需要进行拉普拉斯矩阵的特征分解,直接使用拉普拉斯矩阵进行变换,然而由于要计算 KKK 次,计算复杂度还是 O(n3)O(n3)O\left(n^{3}\right) ;
- 卷积核具有很好的空间局部性(就是卷积核的感受野),也就是说每次卷积会将中心顶点 K-hop neighbor 上的 feature 进行加权求和,权系数就是 θkθk\theta_{k} 。
2.1.4 Recursive formulation for fast filtering.
非参数化的卷积核的复杂度较高,并且上述多项式卷积核的计算复杂度仍然是比较高的。
本小节介绍的卷积核应用切比雪夫多项式,能够实现由于使用非参数化的卷积核复杂度较高,且多项式卷积核的计算复杂度依然差不多。思路是将 gθ(L)gθ(L)g_{\theta}(L) 参数化为一个可由递归计算的多项式函数,这样的多项式可以采用切比雪夫多项式,如下:
T0(x)=1T1(x)=xTk(x)=2xTk−1(x)−Tk−2(x)T0(x)=1T1(x)=xTk(x)=2xTk−1(x)−Tk−2(x)\begin{array}{l}T_{0}(x)=1 \T_{1}(x)=x \T_{k}(x)=2 x T_{k-1}(x)-T_{k-2}(x)\end{array}
参考:《 切比雪夫多项式》
利用切比雪夫多项式,卷积核设计为:
gθ(Λ)=∑k=0K−1θkTk(Λ˜)gθ(Λ)=∑k=0K−1θkTk(Λ~)g_{\theta}(\Lambda)=\sum \limits _{k=0}^{K-1} \theta_{k} T_{k}(\widetilde{\Lambda})
其中, θkθk\theta_{k} 是切比雪夫系数向量,也就是需要学习的参数。Tk(Λ˜)∈Rn×nTk(Λ~)∈Rn×nT_{k}(\widetilde{\Lambda}) \in \mathbb{R}^{n \times n} 是阶的切比雪夫多项式, Λ˜=2Λ/λmax−InΛ~=2Λ/λmax−In\widetilde{\Lambda}=2 \Lambda / \lambda_{\max }-I_{n} ,这样可以将特征值标准化到之间。
如此卷积操作就是下面这样的过程:
y=gθ(L)x=∑k=0K−1θkTk(L˜)xy=gθ(L)x=∑k=0K−1θkTk(L~)xy=g_{\theta}(L) x=\sum \limits _{k=0}^{K-1} \theta_{k} T_{k}(\widetilde{L}) x
上式的推导过程很简单就不赘述了,这里的 L˜∈Rn×nL~∈Rn×n\widetilde{L} \in \mathbb{R}^{n \times n} 也就是标准化以后的,即 L˜=2L/λmax−InL~=2L/λmax−In\widetilde{L}=2 L / \lambda_{\max }-I_{n} 。 将 x¯kx¯k\bar{x}_{k} 记作 x¯k=Tk(L˜)x∈Rkx¯k=Tk(L~)x∈Rk\bar{x}_{k}=T_{k}(\widetilde{L}) x \in \mathbb{R}^{k} ,同样地也可以利用递归关系去计算 x¯k=2L˜x¯k−1−x¯k−2x¯k=2L~x¯k−1−x¯k−2\bar{x}_{k}=2 \widetilde{L} \bar{x}_{k-1}-\bar{x}_{k-2} ,此时 x¯0=x,x¯1=L˜xx¯0=x,x¯1=L~x\bar{x}_{0}=x, \bar{x}_{1}=\widetilde{L} x ,此时卷积的过程又可以表示为:
y=gθ(L)x=[x¯0,⋯,x¯K−1]θy=gθ(L)x=[x¯0,⋯,x¯K−1]θy=g_{\theta}(L) x=\left[\bar{x}_{0}, \cdots, \bar{x}_{K-1}\right] \theta
这样设计的卷积过程的复杂度为 O(K|ε|)O(K|ε|)O(K|\varepsilon|) 。对比上一小节的多项式卷积核,这里利用切比雪夫多项 式设计的卷积核不再需要计算,而只是利用仅包含加减操作的递归关系来计算 Tk(L˜)Tk(L~)T_{k}(\widetilde{L}) ,这样大大减少了计算的复杂度。
2.1.5 Learning filters
在一个卷积层中,一个样本的第个 jth jth j^{\text {th }} feature map 的输出为:
ys,j=∑i=1Fingθi,j(L)xs,i∈Rnys,j=∑i=1Fingθi,j(L)xs,i∈Rny_{s, j}=\sum \limits _{i=1}^{F_{i n}} g_{\theta_{i, j}}(L) x_{s, i} \in \mathbb{R}^{n}
xs,ixs,ix_{s, i} 是输入的feature map,总计有 Fin ×Fout Fin ×Fout F_{\text {in }} \times F_{\text {out }} 个向量 θi,jθi,j\theta_{i, j} ,这些是需要学习的参数向量。 另外在训练时需要计算两个梯度:
∂E∂θi,j=∑s=1S[x¯s,i,0,⋯,x¯s,i,K−1]T∂E∂ys,j∂E∂xs,i=∑j=1Fout gθi,j(L)∂E∂ys,j∂E∂θi,j=∑s=1S[x¯s,i,0,⋯,x¯s,i,K−1]T∂E∂ys,j∂E∂xs,i=∑j=1Fout gθi,j(L)∂E∂ys,j\begin{array}{l}\frac{\partial E}{\partial \theta_{i, j}}=\sum \limits _{s=1}^{S}\left[\bar{x}_{s, i, 0}, \cdots, \bar{x}_{s, i, K-1}\right]^{T} \frac{\partial E}{\partial y_{s, j}} \\frac{\partial E}{\partial x_{s, i}}=\sum \limits_{j=1}^{F_{\text {out }}} g_{\theta_{i, j}}(L) \frac{\partial E}{\partial y_{s, j}}\end{array}
是损失函数,由于采用多项式卷积核,不同阶直接是累加关系,因此无论是计算对还是的梯度,都只需要先计算对的梯度,再利用累加关系很方便地就能得到最终结果,因此应用反向传播算法学习参数是可行的,在并行运算时也是高效的。还有一点就是 [x¯s,i,0,⋯,x¯s,i,K−1][x¯s,i,0,⋯,x¯s,i,K−1] \left[\bar{x}_{s, i, 0}, \cdots, \bar{x}_{s, i, K-1}\right] 只需要计算一次。
2.2 Graph Coarsening
池化操作需要将相似的节点聚类到一起,对于多层网络来说做到这一点相当于对需要保持局部几何 结构的图进行多尺度聚类(multi-scale clustering)。图的聚类方法存在多种,比如常见的谱聚类 方法(参考链接:谱聚类|机器学习推导系列 (二十) )。在本文的方法中没有采用谱聚类这种方 法,而是选择了一种近似能够将图的规模除以2的聚类方法,这样的方法可以精确控制粗化和池化的 size。本文采用的图粗化方法为Graclus多尺度聚类算法。
Graclus方法采用一种贪婪的方法来计算给定图的连续的粗化的版本,并且能够最小化多种谱聚类 的目标,在这里选择的目标为normalized cut。具体的方法是在每层进行粗化时,选择一个末标记 的节点,然后选择一个能够最小化 Wij(1/di+1/dj)Wij(1/di+1/dj)W_{i j}\left(1 / d_{i}+1 / d_{j}\right) 的末标记的邻居节点,然后将这两个节点标记,这两个匹配的节点在池化时被合并,合并节点的信号是这两个节点的信号加和。上述匹配的过程一直进行下去知道所有节点被遍历。这种方法是非常快速的,并且能够将图的规模近似除以2, 之所以近似是因为可能有一些末匹配的节点(文中称为singleton节点)。
2.3 Fast Pooling of Graph Signals
池化操作被执行多次,所以必须是高效的。输入的图和粗化图的节点的排列方法是无意义的,因此,一个直接的池化操作的方法是需要一张表来保存匹配的节点,然而这种方法是内存低效的,并且缓慢,也不能并行处理。本文采用的方法可以使得池化操作像1D池化那样高效。
本文采用的方法分两个步骤: ①创建一个平衡二叉树; ②重排列所有节点。
在进行图的粗化以后,粗化图的每个节点要么有两个子节点(被匹配到的节点),要么只有一个节点(singleton节点)。从最粗到最细的图,将会添加fake节点(不与图连接在一起)到每一层来与singleton节点进行匹配。这样的结构是一个平衡二叉树,主要包含3种节点: ①regular节点(或者singleton节点),拥有两个regular子节点(如下图 level 1节点0); ②regular节点(或者singleton节点),拥有一个regular节点和一个singleton节点作为子节点的节点(如下图 level 2节点0); ③fake节点,总是拥有两个fake子节点(如下图 level 1节点1)。
fake节点的值初始化通常选择一个中性的值,比如当使用max pooling和ReLU激活函数时初始化为0。这些fake节点不与图的节点连接,因此卷积操作不会影响到它们。虽然这些节点会增加数据的维度,这样会增加计算的花费,但是在实践中证明Graclus方法所剩下的singleton节点是比较少的。在最粗化的图中任意排列节点,然后传播回最细的图中,这是由于粗化图中第的节点的子节点是上一层图中的 2k2k2k 和 2k+12k+12k+1 节点,这样就可以在最细的图中有一个规范的排列顺序,这里规范是指相邻节点在较粗的层次上分层合并。这种 pooling 方法类似 1D pooling。这种规范的排列能够让 pooling 操作非常的高效且可以并行化,并且内存访问是 local 的。下图是这种方法的一个例子:
3 Numerical Experiments
这里简单列几个实验结果,具体实验设置可以自行参考原论文。
1、MNIST数据集上对比经典CNN
2、20NEWs数据集上多种架构效果
3、MNIST数据集上多种卷积核的对比
下图中Non-Param和Spline代表第一代GCN论文中提出的两种卷积核,Chebyshev代表本文提出的卷积核:
4、GPU加速效果对比
下图表明本文提出的GCN结构在使用GPU加速时比经典CNN能获得更多的加速倍数,说明该架构的并行化处理能力是比较可观的:
Paper Information
Abstract
Review
1 Introduction
2 Proposed Technique
2.1 Learning Fast Localized Spectral Filters
2.1.1 Graph Fourier Transform
2.1.2 Spectral filtering of graph signals
2.1.3 Polynomial parametrization for localized filters.
2.1.4 Recursive formulation for fast filtering.
2.1.5 Learning filters
2.2 Graph Coarsening
2.3 Fast Pooling of Graph Signals
3 Numerical Experiments
__EOF__
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBheqJuX-1642457577411)(https://blog.csdn.net/BlairGrowing)]Blair - 本文链接: https://blog.csdn.net/BlairGrowing/p/15812187.html
- 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角**【[推荐](javascript:void(0)
论文解读二代GCN《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》相关推荐
- Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering论文解读( and code)
<Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering> 提供了已实现的GCN,并且 ...
- Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering 论文阅读
Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering Code link:https://git ...
- 论文笔记:Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering
前言 初代频域GCN简单粗暴的将diag(g^(λl))diag(\hat{g}{(\lambda_l)})diag(g^(λl))变成了卷积核diag(θl)diag(\theta_l)diag ...
- 小波变换到小波网络理解+论文解读《Wavelet Convolutional Neural Networks》
连续小波变换最大的特点是什么 多分辨分析肯定是标准答案.所谓多分辨分析即是指小波在不同频率段会有不同的分辨率 由图,我们可以看出,低频时(频率为4),对应彩色条纹更细,意味着更高的频率分辨率,而条纹区 ...
- 论文解读 CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes
abstract 1.提出CSRNet是为了处理非常密集的场景,提供准确的计数和密度图 2.提出的CSRNet主要两部分组成:提取二维特征的CNN做前端,膨胀的CNN做后端,膨胀的卷积核是为了获得更大 ...
- 【论文精读】CMT: Convolutional Neural Networks MeetVision Transformers
声明 不定期更新自己精读的论文,通俗易懂,初级小白也可以理解 涉及范围:深度学习方向,包括 CV.NLP.Data fusion.Digital Twin 论文标题: CMT: Convolution ...
- 论文阅读:Multi-view Convolutional Neural Networks for 3D Shape Recognition
Preface 今天阅读一篇ICCV2015的论文:<Multi-view Convolutional Neural Networks for 3D Shape Recognition>, ...
- PATCHY-SAN - Learning Convolutional Neural Networks for Graphs ICML
文章目录 1 背景 2 PATCHY-SAN模型 Node Sequence Selection - 根据节点排序选择要进行卷积的节点 Neighborhood Assembly - 找到Node的领 ...
- [论文翻译]V-Net:Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
论文下载: 地址 V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation V-Net: ...
最新文章
- Acwing第 32 场周赛【完结】
- hdu_5085_Counting problem(莫队分块思想)
- 2018第三届中国数字化零售创新国际峰会9月即将震撼来袭
- 的内怎么放_放了心脏支架能活多久?医生坦言:做到三件事,才能和正常人一样...
- 淘宝山寨IOS sdk
- [Python爬虫] 之二十七:Selenium +phantomjs 利用 pyquery抓取今日头条视频
- ie6、ie7下overflow失效
- Mathtype公式编辑器常用快捷键
- 用HTML5为你的网页添加音效(兼容Firefox 3.5+, IE 6-9, Safari 3.0+, Chrome 3.0+, Opera 10.5+)...
- 润乾报表 echarts统计图分类显示不全
- STM32学习笔记(一)
- Centos7.4-docker安装部署实战
- 2018-7-5,Python练习
- 论文导读|《Exploiting Rich Syntactic Information for Semantic Parsing with Graph-to-Sequence Model》
- python处理excel和word文档
- 如何在IDEA中导入eclipse项目
- 计算机中怎么改邮箱地址,谁可以讲讲如何设置电脑邮箱
- 网站建设(1)——域名的类型、选择和购买
- CATIA 3DEXPERIENCE R2019x VBA开发介绍
- 菜鸟实战UML——活动图
热门文章
- banner中居中的page显示完全,其余显示百分之20--仿网易云首页轮播图
- 西安电子科大计算机学院院长,董伟生 | 个人信息 | 西安电子科技大学个人主页...
- python去除视频马赛克_python 给视频添加马赛克
- vue elementui checkbox第一次点击选不中的问题
- BI神器Power Query(4)-- PQ导入动态名称定义的表格
- python-can简述
- 你好,再见;你好,幸会!
- studing(来自转载)
- 使用 C++ 编写万年历程序
- SaaSBase:什么是INFOR ERP?
- Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering论文解读( and code)