图神经网络GNN学习笔记:图滤波器与图卷积神经网络

  • 4. 图滤波器
    • 4.1 空域视角
    • 4.2频域角度
  • 5. 图卷积神经网络
    • 5.1 对频率响应矩阵进行参数化
    • 5.2 对多项式系数进行参数化
    • 5.3 设计固定的图滤波器
  • 参考资料

4. 图滤波器

在图信号处理中,我们将图滤波器定义为对给定图信号的频谱中各个频率分量的强度进行增强或衰减的操作。

假设图滤波器为H∈RN×N,H:RN→RNH\in R^{N\times N},H:R^N\rightarrow R^NH∈RN×N,H:RN→RN,令输出图信号为yyy,则:
y=Hx=∑k=1N(h(λk)x~k)vky=Hx=\sum_{k=1}^N(h(\lambda_k)\tilde x_k)v_k y=Hx=k=1∑N​(h(λk​)x~k​)vk​
可以清楚地看到增强还是衰减是通过h(λ)h(\lambda)h(λ)项来控制的。对上式进行变换:
y=Hx=∑k=1N(h(λk)x~k)vk=[............v1v2...vN............][h(λ1)x~1h(λ2)x~2...h(λN)x~N]=V[h(λ1)h(λ2)...h(λN)][x~1x~2...x~N]=V[h(λ1)h(λ2)...h(λN)]VTxy=Hx=\sum_{k=1}^N(h(\lambda_k)\tilde x_k)v_k=\begin{bmatrix}... & ... & ... & ...\\v_1 & v_2 & ... & v_N\\... & ... & ... & ... \end{bmatrix}\begin{bmatrix}h(\lambda _1)\tilde x_1 \\h(\lambda _2)\tilde x_2 \\ ... \\h(\lambda _N)\tilde x_N\end{bmatrix}=V\begin{bmatrix}h(\lambda _1) & & & \\ & h(\lambda _2) & & \\ & & ... & \\ & & & h(\lambda _N)\end{bmatrix}\begin{bmatrix}\tilde x_1 \\\tilde x_2 \\ ... \\\tilde x_N\end{bmatrix}=V\begin{bmatrix}h(\lambda _1) & & & \\ & h(\lambda _2) & & \\ & & ... & \\ & & & h(\lambda _N)\end{bmatrix}V^Tx y=Hx=k=1∑N​(h(λk​)x~k​)vk​=⎣⎡​...v1​...​...v2​...​.........​...vN​...​⎦⎤​⎣⎢⎢⎡​h(λ1​)x~1​h(λ2​)x~2​...h(λN​)x~N​​⎦⎥⎥⎤​=V⎣⎢⎢⎡​h(λ1​)​h(λ2​)​...​h(λN​)​⎦⎥⎥⎤​⎣⎢⎢⎡​x~1​x~2​...x~N​​⎦⎥⎥⎤​=V⎣⎢⎢⎡​h(λ1​)​h(λ2​)​...​h(λN​)​⎦⎥⎥⎤​VTx
于是得到
H=V[h(λ1)h(λ2)...h(λN)]VT=VΛhVTH = V\begin{bmatrix}h(\lambda _1) & & & \\ & h(\lambda _2) & & \\ & & ... & \\ & & & h(\lambda _N)\end{bmatrix}V^T=V\Lambda_hV^T H=V⎣⎢⎢⎡​h(λ1​)​h(λ2​)​...​h(λN​)​⎦⎥⎥⎤​VT=VΛh​VT
相较于拉普拉斯矩阵,H仅仅改动了对角矩阵上的值。因此H具有以下形式:Hij=0H_{ij}=0Hij​=0,如果i≠ji\ne ji​=j或者eij∈Ee_{ij}\in Eeij​∈E。就是说,H矩阵只在对角与边坐标上时才有可能取非零值。从算子的角度看,HxHxHx描述了一种作用在每个节点一阶子图上的变换操作。一般来说,称满足上述性质的矩阵为G的图位移算子(Graph Shift Operator),拉普拉斯矩阵与邻接矩阵都是典型的图位移算子。


图滤波器具有以下性质:

(1)线性:H(x+y)=Hx+HyH(x+y)=Hx+HyH(x+y)=Hx+Hy

(2)滤波操作是顺序无关的:H1(H2x)=H2(H1x)H_1(H_2x)=H_2(H_1x)H1​(H2​x)=H2​(H1​x)

(3)如果h(λ)≠0h(\lambda)\ne 0h(λ)​=0,则该滤波操作是可逆的


称Λh\Lambda _hΛh​为图滤波器H的频率响应矩阵,对应的函数h(λ)h(\lambda)h(λ)为H的频率响应函数,不同的频率响应函数可以实现不同的滤波效果。在信号处理中,常见的滤波器有3类:

  • 低通滤波器:只保留信号中的低频成分,关注信号中平滑的部分
  • 高通滤波器:只保留信号中的高频成分,关注信号中快速变化的部分
  • 带通滤波器:只保留信号特定频段的成分

理论上,希望实现任意性质的图滤波器,也就是实现任意类型函数曲线的频率响应函数。通过逼近理论,用泰勒展开——多项式逼近函数去近似任意函数。下面,聚焦拉普拉斯矩阵多项式拓展形式的图滤波器上:
H=h0L0+h1L1+h2L2+...+hKLK=∑k=0khkLkH=h_0L^0+h_1L^1+h_2L^2+...+h_KL^K=\sum_{k=0}^kh_kL^k H=h0​L0+h1​L1+h2​L2+...+hK​LK=k=0∑k​hk​Lk
其中,K是图滤波器H的阶数。和图信号一样,对于图滤波器,可以从空域视角和频域视角来理解。

4.1 空域视角

对于y=Hx=∑k=0KhkLkxy=Hx=\sum_{k=0}^Kh_kL^kxy=Hx=∑k=0K​hk​Lkx,如果设定x(k)=Lkx=Lx(k−1)x^{(k)}=L^kx=Lx^{(k-1)}x(k)=Lkx=Lx(k−1),则:y=∑k=0Khkx(k)y=\sum_{k=0}^Kh_kx^{(k)}y=∑k=0K​hk​x(k)。这里将输出信号变成了(K+1)(K+1)(K+1)组图信号的线性加权。由于L是一个图位移算子,因此x(k−1)x^{(k-1)}x(k−1)到x(k)x^{(k)}x(k)的变换只需要所有节点的一阶邻居参与计算。总的来说,x(k)x^{(k)}x(k)的计算只需要所有节点的k阶邻居参与,称这种性质为图滤波器的局部性。

从空域角度看,滤波操作具有以下性质:

  1. 具有局部性,每个节点的输出信号值只需要考虑其K阶子图;
  2. 可以通过K步迭代式的矩阵向量乘法来完成滤波操作

4.2频域角度

由于L=VΛVTL=V\Lambda V^TL=VΛVT,则:
H=∑k=0KhkLk=∑k=0Khk(VΛVT)k=V(∑k=0KhkΛk)VT=V[∑k=0Khkλ1k...∑k=0KhkλNk]VTH=\sum_{k=0}^Kh_kL^k=\sum_{k=0}^Kh_k(V\Lambda V^T)^k=V(\sum_{k=0}^Kh_k\Lambda ^k)V^T=V\begin{bmatrix}\sum_{k=0}^Kh_k\lambda _1^k & & \\ & ... & \\ & & \sum_{k=0}^Kh_k\lambda _N^k \end{bmatrix}V^T H=k=0∑K​hk​Lk=k=0∑K​hk​(VΛVT)k=V(k=0∑K​hk​Λk)VT=V⎣⎡​∑k=0K​hk​λ1k​​...​∑k=0K​hk​λNk​​⎦⎤​VT
通过上式可知,H的频率响应函数为λ\lambdaλ的K次代数多项式,如果K足够大,可以用这种形式去逼近任意一个关于λ\lambdaλ的函数。

如果我们用该滤波器进行滤波,则:
y=Hx=V(∑k=0KhkΛk)VTxy=Hx=V(\sum_{k=0}^Kh_k\Lambda ^k)V^Tx y=Hx=V(k=0∑K​hk​Λk)VTx
即为频域视角下的滤波操作,其变换过程由以下三步组成:

  1. 通过图傅里叶变换,即VTxV^TxVTx将图信号变换到频域空间
  2. 通过Λh=∑k=0KhkΛk\Lambda _h=\sum_{k=0}^Kh_k\Lambda ^kΛh​=∑k=0K​hk​Λk对频率分量的强度进行调节,得到y~\tilde yy~​;
  3. 通过逆图傅里叶变换,即Vy~V\tilde yVy~​将y~\tilde yy~​反解成图信号yyy。

假设所有的多项式系数hkh_khk​构成向量hhh,则HHH的频率响应矩阵为:
Λh=∑k=0KhkΛk=diag(Ψh)\Lambda_h=\sum_{k=0}^Kh_k\Lambda^k=diag(\Psi h) Λh​=k=0∑K​hk​Λk=diag(Ψh)
其中,ψ=[1λ1...λ1K1λ2...λ2K............1λN...λNK]\psi = \begin{bmatrix} 1 & \lambda_1 & ... & \lambda_1^K\\ 1 & \lambda_2 & ... & \lambda_2^K\\... & ... & ... & ...\\1 & \lambda_N & ... & \lambda_N^K\end{bmatrix}ψ=⎣⎢⎢⎡​11...1​λ1​λ2​...λN​​............​λ1K​λ2K​...λNK​​⎦⎥⎥⎤​为范德蒙矩阵,可以反解得到多项式系数:
h=ψ−1diag−1(Λh)h=\psi^{-1}diag^{-1}(\Lambda_h) h=ψ−1diag−1(Λh​)
其中,diag−1diag^{-1}diag−1表示将对角矩阵变成列向量。上式说明给定想要的频率响应矩阵,可以反解得到多项式系数。这个公式对于特定性质的图滤波器的设计十分重要。

从频域角度看,图滤波操作的性质如下:

  1. 从频域视角能够更加清晰地完成对图信号的特定滤波操作
  2. 图滤波器如何设计具有显式的公式指定
  3. 对矩阵进行特征分解是一个非常耗时的操作,具有O(N3)O(N^3)O(N3)的时间复杂度。相较于空域视角的矩阵向量乘法,工程上有局限性。

5. 图卷积神经网络

给定两组G上的图信号x1,x2x_1,x_2x1​,x2​,其图卷积运算定义如下:
x1∗x2=IGFT(GFT(x1)⊙GFT(x2))x_1*x_2=IGFT(GFT(x_1)\odot GFT(x_2)) x1​∗x2​=IGFT(GFT(x1​)⊙GFT(x2​))
其中⊙\odot⊙表示哈达玛积,即矩阵对应位置元素相乘。这里的定义与离散时间信号处理中的卷积定义是一样的——时域中的卷积运算等价于频域中的乘法运算

对上式进行推导:
x1∗x2=V((VTx1)⊙(VTx2))=V(x~1⊙(VTx2))=V(diag(x~1)(VTx2))=(Vdiag(x~1)VT)x2x_1*x_2=V((V^Tx_1)\odot (V^Tx_2))=V(\tilde x_1 \odot (V^Tx_2))=V(diag(\tilde x_1)(V^Tx_2))=(Vdiag(\tilde x_1)V^T)x_2 x1​∗x2​=V((VTx1​)⊙(VTx2​))=V(x~1​⊙(VTx2​))=V(diag(x~1​)(VTx2​))=(Vdiag(x~1​)VT)x2​
令Hx~1=Vdiag(x~1)VTH_{\tilde x_1}=V diag(\tilde x_1)V^THx~1​​=Vdiag(x~1​)VT,显然Hx~1H_{\tilde x_1}Hx~1​​是一个图位移算子,其频率响应矩阵为x1x_1x1​的频谱,可得:
x1∗x2=Hx~1x2x_1*x_2=H_{\tilde x_1}x_2 x1​∗x2​=Hx~1​​x2​
从上式可得,两组图信号的图卷积运算总能转化为对应形式的图滤波运算。从这个层面上看,图卷积等价于图滤波。后面提到的图卷积运算都是特指上式右边的滤波形式。至于对应的卷积信号,一般并不需要显示地表达出来。

注:前面所有的图信号处理的相关概念里的图信号都能被拓展到矩阵形式。

设矩阵X∈RN×dX\in R^{N\times d}X∈RN×d,可以将XXX视为ddd组定义在图GGG上的图信号,于是称XXX为图信号矩阵,ddd为图信号的总通道数,X:,jX_{:,j}X:,j​表示第jjj个通道上的图信号。

5.1 对频率响应矩阵进行参数化

既然图卷积操作等价于图滤波操作,而图滤波算子的核心在于频率响应矩阵,那么自然想到对频率响应矩阵进行参数化。定义如下神经网络层:
X′=σ(V[θ1θ2...θn]VTX)=σ(Vdiag(θ)VTX)=σ(ΘX)X'=\sigma (V\begin{bmatrix}\theta _1 & & & \\ & \theta _2 & & \\ & & ... & \\ & & & \theta _n \end{bmatrix}V^TX)=\sigma(V diag(\theta)V^TX)=\sigma(\Theta X) X′=σ(V⎣⎢⎢⎡​θ1​​θ2​​...​θn​​⎦⎥⎥⎤​VTX)=σ(Vdiag(θ)VTX)=σ(ΘX)
其中,σ(⋅)\sigma(\cdot)σ(⋅)是激活函数,θ=[θ1,θ2,...,θN]\theta=[\theta_1,\theta_2,...,\theta_N]θ=[θ1​,θ2​,...,θN​]是需要学习的参数,Θ\ThetaΘ是对应的需要学习的图滤波器,XXX是输入的图信号矩阵,X′X'X′是输出的图信号矩阵。

可以从空域和频域两个视角来理解这层网络:

  1. 从空域角度看,该层引入了一个自适应的图位移算子,从而完成对输入图信号的针对性变换操作。
  2. 从频域角度看,该层在XXX和X′X'X′之间训练了一个可自适应的图滤波器,图滤波器的频率响应函数可以通过任务与数据之间的对应关系来进行监督学习。

存在的问题:

  • 引入的学习参数过多,为图中的节点数,在大规模图上几乎不可行,容易过拟合
  • 真实的图数据中,数据的有效性通常都蕴含在低频段中,因此对每个频道都进行学习是没必要的

5.2 对多项式系数进行参数化

为了拟合任意的频率响应函数,将拉普拉斯矩阵的多项式形式转化为一种可学习的形式,具体如下:
X′=σ(V(∑k=0KθkΛk)VTX)=σ(Vdiag(Ψθ)VTX)X'=\sigma (V(\sum_{k=0}^K\theta_k\Lambda^k)V^TX)=\sigma(V diag(\Psi \theta)V^TX) X′=σ(V(k=0∑K​θk​Λk)VTX)=σ(Vdiag(Ψθ)VTX)
其中,θ=[θ1,θ2,...,θK]\theta=[\theta_1,\theta_2,...,\theta_K]θ=[θ1​,θ2​,...,θK​]是多项式系数向量,也是该网络层真正需要学习的参数,与之前方法不同的是,这个方法的参数量KKK可以自由控制。K越大,可拟合的频率响应函数的次数就越高,可以对应输入图信号矩阵与输出图信号矩阵之间复杂的滤波关系;K越小,可拟合的次数就越低,输入图信号矩阵与输出图信号矩阵之间的滤波关系越简单。

总的来说,一般设K<<NK<<NK<<N,这大大降低模型过拟合的风险。

5.3 设计固定的图滤波器

上述方法由于对矩阵特征分解比较依赖,故计算复杂度较高。因此,GCN中对K<<NK<<NK<<N进行了限制,设K=1K=1K=1,则:
X′=σ(θ0X+θ1LX)X'=\sigma(\theta_0 X+\theta_1LX) X′=σ(θ0​X+θ1​LX)
令θ0=θ1=θ\theta_0=\theta_1=\thetaθ0​=θ1​=θ,则:
X′=σ(θ(I+L)X)=σ(θL~X)X'=\sigma(\theta(I+L)X)=\sigma(\theta\tilde LX) X′=σ(θ(I+L)X)=σ(θL~X)
注意:这里的θ\thetaθ是一个标量,相当于对L~\tilde LL~的频率响应函数做了一个尺度变换,通过这种尺度变换在神经网络模型中会被归一化操作替代,因此,没必要引入这个参数,故令其为1,即θ=1\theta=1θ=1,然后得到一个固定的图滤波器L~\tilde LL~。

为了加强网络学习时的数值稳定性,对L~\tilde LL~做归一化处理。令L~sym=D~−1/2A~D~−1/2,A~=A+I,D~ii=∑jA~ij\tilde L_{sym}=\tilde D^{-1/2} \tilde A \tilde D^{-1/2},\tilde A=A+I,\tilde D_{ii}=\sum_{j}\tilde A_{ij}L~sym​=D~−1/2A~D~−1/2,A~=A+I,D~ii​=∑j​A~ij​,称L~sym\tilde L_{sym}L~sym​为重归一化形式的拉普拉斯矩阵。L~sym\tilde L{sym}L~sym的特征值范围为(−1,1](-1,1](−1,1],可以有效防止多层网络优化时出现的梯度消失或爆炸的现象。


再考虑一下L~sym\tilde L_{sym}L~sym​,想一下它是怎么来的:我们一步步定义、推导出了GFT和IGFT,定义了图滤波器,给出了图卷积的定义,将图卷积的运算写成了图滤波器的形式,为了加强图滤波器的拟合能力给出了多项式形式的图滤波器,最后我们将其化简为只有两项,得到了L~\tilde LL~,再进行归一化得到了L~sym\tilde L_{sym}L~sym​。

也就是说,L~sym\tilde L_{sym}L~sym​可以看作是一个图滤波器,也可以看作是图位移算子,L~symX\tilde L_{sym} XL~sym​X就是在做图卷积!而得到L~sym\tilde L_{sym}L~sym​无疑是容易的,不需要计算特征值、特征向量,只需要得到邻接矩阵即可。


为了加强网络的拟合能力,设计一个参数化的权重矩阵WWW对输入的图信号矩阵进行仿射变换,于是得到:
X′=σ(L~symXW)X'=\sigma(\tilde L_{sym}XW) X′=σ(L~sym​XW)
这里的WWW是可学习的。如果没有其他说明,上式为图卷积层(GCN layer),以此为主题堆叠多层的神经网络模型称为图卷积模型(GCN)

==图卷积层是对频率响应函数拟合形式上的极大简化,最后相应的图滤波器退化成了L~sym\tilde L_{sym}L~sym​,图卷积操作变成了L~symX\tilde L_{sym}XL~sym​X。==如果将X由信号矩阵的角色切换到特征矩阵上,由于L~sym\tilde L_{sym}L~sym​是一个图位移算子,依据矩阵乘法的行向量视角,L~symX\tilde L_{sym}XL~sym​X的计算等价于对邻居节点的特征向量进行聚合操作,于是,图卷积层在节点层面的计算公式为:
xi=σ(∑vj∈N~(vi)L~sym[i,j](Wxj))x_i=\sigma(\sum_{v_j\in \tilde N(v_i)}\tilde L_{sym}[i,j](Wx_j)) xi​=σ(vj​∈N~(vi​)∑​L~sym​[i,j](Wxj​))
实际工程中,L~sym\tilde L_{sym}L~sym​可以用稀疏矩阵来表示,这可以进一步降低图卷积层的计算复杂度。相较于频域图卷积中矩阵分解时O(N3)O(N^3)O(N3)的时间复杂度,这种空域图卷积计算的时间复杂度可以降至O(∣E∣d∣)O(|E|d|)O(∣E∣d∣)。

在实际任务中设计固定图滤波器的做法有效性的说明:

(1)L~sym\tilde L_{sym}L~sym​本身所具有的滤波特性是比较符合真实数据的特有性质的,能对数据实现高效的滤波操作。

(2)堆叠多层GCN层,在某种程度上,可以达到高阶多项式形式的频率响应函数的滤波能力。

一般,对于只能从频域出发进行矩阵特征分解从而执行图卷积计算的模型,称为频域图卷积模型;相应地,能在空域视角执行矩阵乘法计算的模型,称之为空域图卷积模型。注意:虽然空域图卷积模型在工程上具有优越性,但是这类模型也都可以从频域视角进行理解。

参考资料

[1] 《深入浅出图神经网络:GNN原理解析》

[2] 图信号与图卷积神经网络 读书笔记

[3] 图信号与图傅里叶变换

[4] 拉普拉斯矩阵与拉普拉斯算子的关系

[5] 图傅里叶变换

[6] 图卷积网络原来是这么回事(三)

【图神经网络】图神经网络(GNN)学习笔记:图滤波器与图卷积神经网络相关推荐

  1. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  2. tensorflow学习笔记五:mnist实例--卷积神经网络(CNN)

    mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的.但是CNN层数要多一些,网络模型需要自己来构建. 程序比较复杂,我就分成几个部分来叙述. 首先,下载并加载数据: import ...

  3. 深度学习笔记(六) cnn 卷积神经网络

    1)卷积神经网络是一种前馈神经网络,前面讲的网络包括full NN,感知器都是前馈网络,BP是一种前馈网络的训练方法. 2)卷积神经网络主要是降维,有点类似PBA CNN的基本结构包括两层,其一为特征 ...

  4. 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习

    图神经网络GNN学习笔记:基于GNN的图表示学习 1. 图表示学习 2. 基于GNN的图表示学习 2.1 基于重构损失的GNN 2.2 基于对比损失的GNN 参考资料 本文主要就基于GNN的无监督图表 ...

  5. 【图神经网络】图神经网络(GNN)学习笔记:图分类

    图神经网络GNN学习笔记:图分类 1. 基于全局池化的图分类 2. 基于层次化池化的图分类 2.1 基于图坍缩的池化机制 1 图坍缩 2 DIFFPOOL 3. EigenPooling 2.2 基于 ...

  6. GNN学习笔记(四):图注意力神经网络(GAT)节点分类任务实现

    目录 0 引言 1.Cora数据集 2.citeseer数据集 3.Pubmed数据集 4.DBLP数据集 5.Tox21 数据集 6.代码 嘚嘚嘚,唠叨小主,闪亮登场,哈哈,过时了过时了,闪亮登场换 ...

  7. 【图神经网络】图神经网络(GNN)学习笔记:图的基础理论

    图神经网络GNN学习笔记:图的基础理论 1. 图的概述 2.图的基本类型 2.1 有向图和无向图 2.2 非加权图与加权图 2.3 连通图与非连通图 2.4 二部图 2.5 邻居和度 2.6 子图和路 ...

  8. 【图神经网络】图神经网络(GNN)学习笔记:GNN的通用框架

    图神经网络GNN学习笔记:GNN的通用框架 1. MPNN 2. NLNN 3. GN 参考资料 所谓通用框架,是对多种变体GNN网络结构的一般化总结,也是GNN编程的通用范式,这里介绍3类通用框架: ...

  9. Tensorflow2学习笔记:简单灰度图分类

    Tensorflow2学习笔记:简单灰度图分类 相关介绍 实验环境 实验步骤 导入相关库 导入数据集 浏览数据 预处理数据 构建模型 设置层 编译模型 训练模型 向模型馈送数据 评估准确率 进行预测 ...

  10. Redis运维和开发学习笔记-全书思维导图

    Redis运维和开发学习笔记-全书思维导图 图片过大,无法上传. 链接:https://pan.baidu.com/s/13pnEMBEdLgjZNOOEAuDvEQ 密码:qhch

最新文章

  1. PHP获取页面执行时间的方法
  2. fileviewfinder.php,Laravel在FileViewFinder.php中查找视图的错误处理程序
  3. __asm__ __volatile__(: : :memory);
  4. 【Flink】Too many fields referenced from an atomic type
  5. OLTP和OLAP是什么
  6. 最强android平板,最强安卓平板!华为MatePad Pro来了:搭载麒麟990
  7. java自动校准程序_java – VisualVM校准步骤与Windows 10挂起
  8. oracle 数据库 swap,Oracle swap 100%案例分析
  9. JavaScript强化教程——AngularJS 表达式
  10. php生成图形验证码的几种方法
  11. 一页纸项目管理及模板下载
  12. 基于jpress二次开发的H5商城(已开源)
  13. 西北工业大学noj数据结构实验003稀疏矩阵转置
  14. 【优秀的截图软件】jietu 2.2.2 for mac
  15. css 元素上下居中
  16. Cloudflare DDNS梅林插件代码
  17. 人类无法抗拒的十大心理学效应
  18. ROS学习笔记之——robot_localization包
  19. category ue 协议_LTE中UE能力(UE Capability)的梳理和解析
  20. 报错:Expected singleton

热门文章

  1. 计算机硬盘的参数错误,电脑提示移动硬盘参数错误的解决方法
  2. win10软件拒绝访问删不掉_文件拒绝访问,详细教您win10文件访问被拒绝怎么解决...
  3. linux系统怎么拨号上网,在linux中如何拨号上网?
  4. 拼音速度测试软件,在线五笔打字练习
  5. 一根网线让两台笔记本对拷文件
  6. LeetCode476
  7. 【ACWing】1123. 铲雪车
  8. 惠普服务器ilo默认地址_使用ILO进行HP服务器管理的Docker容器
  9. 分布式事务处理框架之LCN
  10. python读有中文的文件_在python中pandas读文件,有中文字符的方法