理解神经网络的数学原理(一) 全连接模型的空间划分与编码逻辑

2023-05-16

概述

几年前就想写这篇文章,但是在解析神经网络的数学原理问题上断断续续,加上个人能力有限,很多问题并没有研究的很明白,以及神经网络本身高维问题的复杂性,导致这个问题的理解也是有限的。个人希望在这篇文章里抛砖引玉,让大家能更深入理解神经网络内部的基础数学原理与编码逻辑,启发大家后面的工作,如有错误请不吝啬指出。本文不会过多的介绍梯度下降或反向传播等参数更新的原理或动力学过程,而是以前向过程(Feed Forward)作为本文的重点。

分离超平面

和支持向量机(Support Vector Machine)一样,在神经网络或深度学习中也几乎处处都会涉及到分离超平面,也是其核心内容之一,所以这里会用较大的篇幅说明分离超平面的内容。

分离超平面(Separating Hyperplane)是指将两个不相交的凸集分割成两部分的一个平面。在数学中,超平面是 n n n 维欧氏空间中余维度等于 1 的线性子空间 。 H = { x ∣ w T x + b = 0 } H=\{x \mid w^Tx+b = 0\} H={xwTx+b=0} 就是这样的一个分离超平面,即将 n n n维欧式空间分离为两个半空间的一个超平面。

对于只有1个变量的方程 w 1 x 1 + b = 0 w_1x_1+b=0 w1x1+b=0而言,能显然得到 x 1 = − b w 1 x_1=\frac{-b}{w_1} x1=w1b,在 1 1 1维直线上 x x x为一个点,将直线分为两部分。

而对于有2个变量的方程 w 1 x 1 + w 2 x 2 + b = 0 w_1x_1+w_2x_2+b=0 w1x1+w2x2+b=0我们能直接计算出 x 2 = ( − w 1 x 1 − b ) / w 2 x_2=(-w_1x_1-b)/w_2 x2=(w1x1b)/w2,我们做一次代数替换 α = − w 1 w 2 , β = − b w 2 \alpha=\frac{-w_1}{w_2},\beta=\frac{-b}{w_2} α=w2w1β=w2b,方程变为了 x 2 = α x 1 + β x_2=\alpha x_1+\beta x2=αx1+β,这个是一元一次函数的等价形式,其中 α \alpha α为斜率 β \beta β为截距,当 α , β \alpha,\beta α,β确定时,该函数在2维平面是一条直线,将平面一分为二。

当方程为3个变量是时, w 1 x 1 + w 2 x 2 + w 3 x 3 + b = 0 ⇔ x 3 = α x 1 + β x 2 + γ w_1x_1+w_2x_2+w_3x_3+b=0\Leftrightarrow x_3 =\alpha x_1+\beta x_2+\gamma w1x1+w2x2+w3x3+b=0x3=αx1+βx2+γ ,该函数在三维空间中是一个平面,将三维空间分离为2个子空间。

同理 n > 3 n>3 n>3时, H = { x ∣ w T x + b = 0 } H=\{x \mid w^Tx+b = 0\} H={xwTx+b=0} n n n维空间中的一个超平面,由于物理限制我们无法直观的画出超平面了,但是这个超平面是存在的,所谓分离超平面只是沿用 3 3 3维空间中分离平面的概念。为了方便,在任意维的空间中我们统一称 H = { x ∣ w T x + b = 0 } H=\{x \mid w^Tx+b = 0\} H={xwTx+b=0}为分离超平面,或简称 w T x + b = 0 w^Tx+b=0 wTx+b=0为分离超平面,在超平面的一侧 w T x + b > 0 w^Tx+b>0 wTx+b>0,在超平面的另一侧 w T x + b < 0 w^Tx+b<0 wTx+b<0

单层感知机

我们知道感知机 (perceptron) 是一个线性分类模型,其公式如下:
y = s i g n ( w T x + b ) = { 1 , w T x + b > 0 − 1 , w T x + b ⩽ 0 y = sign(w^Tx+b) =\left\{\begin{matrix} 1&,w^Tx+b>0 \\ -1&,w^Tx+b\leqslant 0 \end{matrix}\right. y=sign(wTx+b)={11,wTx+b>0,wTx+b0单层感知机是非常简单的一个模型,激活函数 s i g n ( x ) sign(x) sign(x)将超平面的一侧的输入空间强制划分为 1 1 1,另一侧划分为 − 1 -1 1,本质上是分离超平面的推广(当然激活函数也是神经网络中的核心内容之一,后文会详细解释),为了能使用随机梯度下降(SGD)等算法,即函数可微,我们可以将 s i g n ( x ) sign(x) sign(x)函数替换为 t a n h ( x ) tanh(x) tanh(x) s i g m o i d ( x ) sigmoid(x) sigmoid(x) R e L U ( x ) ReLU(x) ReLU(x)。因为感知机非常简单,这里只简单介绍,我们的重点放在不含隐藏层的全连接(Fully Connected,FC)模型解析上。

单层回归模型

单层线性回归模型 y = w T x + b y=w^Tx+b y=wTx+b,区别于分类模型,回归模型相当于直接求超平面,而不必硬性划分超平面的两侧,所以回归和分类一脉相承,核心内容是一样的,这也是神经网络可以既用来做分类也可以用来做回归的原因。区别之处在回归的 y y y值是连续的,而分类是离散的。后文会讲到如何将分类问题转换为回归问题。

单层全连接模型

二分类问题

读者可能会疑问,感知机不就是二分类的单层全连接模型吗?是的,我们知道在神经网络中一般有多少个分类就有多少个输出节点,对于神经网络的二分类而言我们一般使用2个节点作为输出,最后我们会阐明感知机模型等价于单层全连接二分类模型。 研究2个节点的原理能更好理解多节点的情形。

对于输出节点1,我们有 y 1 = w 1 T x + b 1 y_1 = w^T_1x+b_1 y1=w1Tx+b1,对于输出节点2,我们有 y 2 = w 2 T x + b 2 y_2 = w^T_2x+b_2 y2=w2Tx+b2,在全连接分类模型中我们一般使用 a r g max ⁡ ( x ) arg \max(x) argmax(x)获得输出节点的分类标签,即:
y = a r g max ⁡ ( y 1 , y 2 ) = { 1 , w 1 T x + b 1 ≥ w 2 T x + b 2 2 , w 1 T x + b 1 < w 2 T x + b 2 y = arg \max(y_1,y_2)=\left\{\begin{matrix} 1&,w^T_1x+b_1\geq w^T_2x+b_2 \\ 2&,w^T_1x+b_1<w^T_2x+b_2 \end{matrix}\right. y=argmax(y1,y2)={12,w1Tx+b1w2Tx+b2,w1Tx+b1<w2Tx+b2在上式中我们注意到,该二分类模型的决策超平面为 w 1 T x + b 1 = w 2 T x + b 2 w^T_1x+b_1 = w^T_2x+b_2 w1Tx+b1=w2Tx+b2,这里我们作一次变换可得方程 ( w 1 − w 2 ) T x + ( b 1 − b 2 ) = 0 (w_1-w_2)^Tx+(b_1-b_2) = 0 (w1w2)Tx+(b1b2)=0,作一次代数替换,令 w = ( w 1 − w 2 ) , b = ( b 1 − b 2 ) w=(w_1-w_2),b=(b_1-b_2) w=(w1w2),b=(b1b2) 可得 w T x + b = 0 w^Tx+b=0 wTx+b=0,这里因为对 y 1 , y 2 y_1,y_2 y1,y2作了差值, a r g max ⁡ ( x ) arg \max(x) argmax(x)不再适用,用 s i g n ( x ) sign(x) sign(x)代替,即:
y = s i g n ( y 1 − y 2 ) = { 1 , w T x + b > 0 − 1 , w T x + b ≤ 0 y = sign(y_1-y_2)=\left\{\begin{matrix} 1&,w^Tx+b> 0\\ -1&,w^Tx+b\leq 0 \end{matrix}\right. y=sign(y1y2)={11,wTx+b>0,wTx+b0所以我们可以看到,二节点的单层全连接层分类模型等价于感知机模型( w T x + b = 0 w^Tx+b = 0 wTx+b=0时分到哪类都是一样的, a r g max ⁡ arg \max argmax默认分到第 1 1 1 类),区别在于该分类网络多了一倍的参数,其构造的超平面并非 w 1 T x + b 1 = 0 w^T_1x+b_1=0 w1Tx+b1=0 w 2 T x + b 2 = 0 w^T_2x+b_2=0 w2Tx+b2=0,而是通过节点间计算得到的,在多节点的分类中单个节点的意义比较有限,分离超平面是一个相对问题,而非单个节点所决定的。
在这里插入图片描述
以上是二维数据上训练后的结果(损失函数为CrossEntropy,优化器为SGD,学习率固定为0.01,下同);其中蓝色直线表示节点超平面 w 1 T x + b 1 = 0 w^T_1x+b_1=0 w1Tx+b1=0,绿色直线表示节点超平面 w 2 T x + b 2 = 0 w^T_2x+b_2=0 w2Tx+b2=0,红色直线为(节点间)决策超平面 w T x + b = 0 w^Tx+b=0 wTx+b=0。受参数随机初始化的影响,虽然产生了几乎相同的决策超平面,但是节点的超平面却非常不同。

多分类问题

上面总结了 2 2 2个分类的情形,相对而言还是比较简单的,但是到多分类这里就变得更加复杂了。多分类中最简单的模型是 3 3 3分类模型,下面我们将解析 3 3 3分类模型,并推广到大于 3 3 3类的情形。

对于 3 3 3分类模型,输出由 3 3 3个节点组成, y 1 = w 1 T x + b 1 y_1 = w^T_1x+b_1 y1=w1Tx+b1 y 2 = w 2 T x + b 2 y_2 = w^T_2x+b_2 y2=w2Tx+b2 y 3 = w 3 T x + b 3 y_3 = w^T_3x+b_3 y3=w3Tx+b3,这里有多少分离超平面呢?每 2 2 2个节点构成一个超平面,所以 3 3 3个节点构成 3 3 3个分离超平面,分别为 h 12 = 0 , h 13 = 0 , h 23 = 0 h_{12}=0,h_{13}=0,h_{23}=0 h12=0,h13=0,h23=0,其中 h 12 = ( y 1 − y 2 ) , h 13 = ( y 1 − y 3 ) , h 23 = ( y 2 − y 3 ) h_{12}=(y_1-y_2),h_{13}=(y_1-y_3),h_{23}=(y_2-y_3) h12=(y1y2),h13=(y1y3),h23=(y2y3),同理根据排列组合原理,可以推导出任意节点 n ≥ 2 n \geq 2 n2构成的超平面数量为:
f ( n ) = C n 2 = n ∗ ( n − 1 ) 2 f(n) =C_n^2=\frac{n*(n-1)}{2} f(n)=Cn2=2n(n1)当我们使用激活函数 s ( h ) = { 1 , h > 0 0 , h ≤ 0 s(h)=\left\{\begin{matrix} 1&,h> 0\\ 0&,h\leq 0 \end{matrix}\right. s(h)={10,h>0,h0 去编码超平面所划分的空间,会得到

   y 1 = max ⁡ ( y 1 , y 2 , y 3 ) ⇔ s ( [ h 12 , h 13 , h 23 ] ) = [ 1 , 1 , 0 ∨ 1 ] y_1=\max(y_1,y_2,y_3)\Leftrightarrow s([h_{12},h_{13},h_{23}])=[1,1,0\vee 1] y1=max(y1,y2,y3)s([h12,h13,h23])=[1,1,01]
   y 2 = max ⁡ ( y 1 , y 2 , y 3 ) ⇔ s ( [ h 12 , h 13 , h 23 ] ) = [ 0 , 0 ∨ 1 , 1 ] y_2=\max(y_1,y_2,y_3)\Leftrightarrow s([h_{12},h_{13},h_{23}])=[0,0\vee 1,1] y2=max(y1,y2,y3)s([h12,h13,h23])=[0,01,1]
   y 3 = max ⁡ ( y 1 , y 2 , y 3 ) ⇔ s ( [ h 12 , h 13 , h 23 ] ) = [ 0 ∨ 1 , 0 , 0 ] y_3=\max(y_1,y_2,y_3)\Leftrightarrow s([h_{12},h_{13},h_{23}])=[0\vee 1,0,0] y3=max(y1,y2,y3)s([h12,h13,h23])=[01,0,0]

这里 0 ∨ 1 0\vee 1 01指:0或1,这也意味着,当我们确定空间划分(Space Partitioning)的编码时,我们就能得到概率最大的输出节点。 在大于3个节点时也是同样的道理,不过编码长度会随节点数接近平方增长。下面的图片是超平面将各划分的空间区域编码的一个示例:

但是我们也注意到这样的编码是不存在的: s ( [ h 12 , h 13 , h 23 ] ) = [ 0 , 1 , 0 ] s([h_{12},h_{13},h_{23}])=[0,1,0] s([h12,h13,h23])=[0,1,0] s ( [ h 12 , h 13 , h 23 ] ) = [ 1 , 0 , 1 ] s([h_{12},h_{13},h_{23}])=[1,0,1] s([h12,h13,h23])=[1,0,1],原因是逻辑不自洽,即:
( h 12 < 0 , h 13 > 0 ) ⇒ ( y 2 > y 1 > y 3 ) ⇒ ( y 2 > y 3 ) ⇒ h 23 > 0 (h_{12}<0,h_{13}>0)\Rightarrow (y_2>y_1>y_3)\Rightarrow (y_2>y_3)\Rightarrow h_{23}>0 (h12<0,h13>0)(y2>y1>y3)(y2>y3)h23>0

同理 ( h 12 > 0 , h 13 < 0 ) ⇒ h 23 < 0 (h_{12}>0,h_{13}<0)\Rightarrow h_{23}<0 (h12>0,h13<0)h23<0,这个是节点比较或分类层所带来的特性,意味着3个输出节点产生的3个超平面只产生一个交点,那么在 n > 3 n>3 n>3个节点上的逻辑呢?这个问题留给读者。

模型中还有其他的编码逻辑吗?通过实验归纳我们会发现,节点的超平面也可以参与到编码中,即任意的节点 y i > 0 y_i>0 yi>0能将一半空间中的其他类别数据简单的分离,而因为在 y i > 0 y_i>0 yi>0的空间中可能包含非该类的数据,这个时候需要 y i > y n ∖ i y_i>y_{n\setminus i} yi>yni,那么这个模型中的存在这样的编码逻辑:任意类别数据 x i x_i xi如果可以被单一超平面分离,且对应的 y i y_i yi m a x max max输出节点,那么 y i > 0 y_i>0 yi>0 y i − y n ∖ i > 0 y_i-y_{n\setminus i}>0 yiyni>0,即先通过节点划分一半的空间,再在半空间中通过节点间超平面划分。

因为数据并非线性可分,这里需要有一个重要的约束:任意类别数据可以被单一超平面分离,也就是在划分的半空间中存在该类的完整数据。虽然该逻辑是存在的,但模型会受初始化参数与代价函数影响,在边界处理上有权衡,如 y i ≤ 0 y_i\leq0 yi0的空间也可能包含该类数据,如上图及下图中个别蓝点存在于 y i ≤ 0 y_i\leq0 yi0的区域中,所以以上逻辑中 y i > 0 y_i>0 yi>0更像是一个约束条件,这个约束条件能更好的理解单个节点的逻辑。

在这里插入图片描述

以上是二维数据上训练后的结果;其中虚线分别表示节点超平面: y 1 = 0 , y 2 = 0 , y 3 = 0 y_1=0,y_2=0,y_3=0 y1=0,y2=0,y3=0,节点超平面将节点所属类别数据几乎完整划分到半空间中;实线分别表示决策超平面: h y 1 y 2 = 0 , h y 1 y 3 = 0 , h y 2 y 3 = 0 h_{y_1y_2}=0,h_{y_1y_3}=0,h_{y_2y_3}=0 hy1y2=0,hy1y3=0,hy2y3=0,决策超平面将3类数据划分到6个区域中,且每个超平面将两类数据完整分离。

线性区域(Linear Regions)

所谓线性区域,特指由线性函数所划分出来的区域,在神经网络中特指超平面所划分的区域。如上图,3个分离超平面(实线)将输入空间划分为了6个线性区域,训练后理想情况下使得每一个区域只包含单个类别的数据,任何输入数据通过获取区域编码就可得到数据的类别。线性区域在深度学习理论中有很多的研究,尤其是在模型复杂度上,线性区域数量能很好的描述模型容量。

对于神经网络而言,最大线性区域数量 f f f与输入空间维度 d d d、超平面数量 m m m的关系为:
f ( d , m ) = 1 + m + C m 2 + . . . + C m d = ∑ i = 0 d C m i f(d,m)=1+m+C_m^2+...+C_m^d=\sum_{i=0}^{d}C_m^i f(d,m)=1+m+Cm2+...+Cmd=i=0dCmi我们带入在2维空间上,超平面数量为3时,可以得到最大可以划分的线性区域数量为 1 + 3 + 3 = 7 1+3+3=7 1+3+3=7,而在单层全连接分类模型中,最大线性区域数量 f f f与输入空间维度 d d d、节点数量 n n n的关系为:
f ( d , n ) = ∑ i = 0 d C c n 2 i f(d,n)=\sum_{i=0}^{d}C_{c_n^2}^i f(d,n)=i=0dCcn2i在有隐藏层的模型中,隐藏层因为激活函数的作用,其节点数量和超平面的关系为 m = n m=n m=n,最大线性区域的数量计算也较简单,而有隐藏层模型总的线性区域数量计算会不太相同,后续会讨论,其他组合问题可参考 Enumerative Combinatorics 或 Combinatorial Theory的内容。

线性不可分

线性不可分的定义:数据集 D D D存在 n = 2 n=2 n=2类数据,对于任意类别数据 x i x_i xi与其他类别数据 x n ∖ i x_{n\setminus i} xni,存在 ( w , b ) (w,b) (w,b)使得 w T x i + b > 0 w^Tx_i+b>0 wTxi+b>0 w T x n ∖ i + b ≤ 0 w^Tx_{n\setminus i}+b \leq0 wTxni+b0,这时我们称数据集 D D D是线性可分的,反之我们称数据集 D D D是线性不可分的。

这里为什么是 n = 2 n=2 n=2,目前看到的线性可分的定义都是在2类问题上,那就意味着在 n > 2 n>2 n>2类时数据不能被线性划分,但是全连接层的分类模型是可以处理这种 n ≥ 2 n\geq2 n2类问题的,且在 n > 2 n>2 n>2时能处理比这个问题稍强的线性不可分情形,即在 w T x i + b > 0 w^Tx_i+b>0 wTxi+b>0的半空间中可以再次划分。

模型剪裁与压缩

对于多个节点的全连接层模型,模型裁剪与压缩,和有效输入特征的维数有关,所以更多集中在输入特征消减上。

而对于二分类模型,则可以通过前面二分模型的解释里的公式,将 y = ( w 1 − w 2 ) T x + ( b 1 − b 2 ) y=(w_1-w_2)^Tx+(b_1-b_2) y=(w1w2)Tx+(b1b2),作一次代数替换(也即分类模型转换为回归模型), w = ( w 1 − w 2 ) , b = ( b 1 − b 2 ) w=(w_1-w_2),b=(b_1-b_2) w=(w1w2),b=(b1b2) 得到 y = w T x + b y=w^Tx+b y=wTx+b,当 y > 0 时 y>0时 y>0分为类别一, y ≤ 0 y\leq0 y0时分为类别二,这样就可以将模型的参数量减少一半。对于输出为一个或多个二分类节点的模型(如:目标检测模型,分割模型等),通过这种裁剪与压缩方式,其参数量变得和多分类相等,但是却增强了模型的开集识别能力。

其实 B C E W i t h L o g i t s L o s s BCEWithLogitsLoss BCEWithLogitsLoss就是利用这个原理工作的,即模型有多少个类别就输出多少个节点(一个类别时只需要输出一个节点),而不是输出 2 2 2倍类别数的节点, B C E W i t h L o g i t s L o s s BCEWithLogitsLoss BCEWithLogitsLoss显式的带了 s i g m o i d 函数 sigmoid函数 sigmoid函数,所以在模型预测的时候需要带 s i g m o i d sigmoid sigmoid获得概率值,训练时则不用。

总结

通过本篇文章,希望大家能理解单层全连接分类模型的数学原理与编码逻辑,这边文章没有解析多层感知机(MLP),因为多层感知机相对来说会更加复杂其数学原理与编码逻辑,和单层模型有较大的区别,且内容较多,多层感知机的内容将留在下一篇文章分析。代码已开源 DNNexp。

参考文献

  1. On the Number of Linear Regions of Deep Neural Networks
  2. On the number of response regions of deep feed forward networks with piece- wise linear activations
  3. On the Expressive Power of Deep Neural Networks
  4. On the Number of Linear Regions of Convolutional Neural Networks
  5. Bounding and Counting Linear Regions of Deep Neural Networks
  6. Facing up to arrangements: face-count formulas for partitions of space by hyperplanes
  7. An Introduction to Hyperplane Arrangements
  8. Combinatorial Theory: Hyperplane Arrangements
  9. Partern Recognition and Machine Learning
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解神经网络的数学原理(一) 全连接模型的空间划分与编码逻辑 的相关文章

  • H.265编码视频播放器EasyPlayerPro-WIN版播放HLS协议视频流显示时间与实际不符如何修复?

    经过多年的技术积累与实践打造 xff0c TSINGSEE青犀视频团队研发的EasyPlayer播放器项目系列无论是在对接设备型号种类 xff0c 还是在对接编码的兼容性上 xff0c 都具备较高的可用性 xff0c 从集成进第三方平台到支
  • H.265流媒体播放器EasyPlayer.js的属性、方法及事件的调用汇总

    EasyPlayer是可支持H 264 H 265视频播放的流媒体播放器 xff0c 性能稳定 播放流畅 xff0c 可支持的视频流格式有RTSP RTMP HLS FLV WebRTC等 xff0c 具备较高的可用性 EasyPlayer
  • 接插件分类选型

    型号 特点 图片 排针排母 针距多为2 0 或 2 54 xff1b 分为直插 贴片 xff0c 直针 弯针 线 FPC 0 3 0 5 1 0 座 FFC 0 3 0 5 1 0 多用于连接液晶屏 SH1 0 GH1 25 MX1 25
  • vscode实用插件

    1 vscode icons 文件 文件夹图标 xff0c 使编辑器更漂亮 2 indent rainbow 使用四种颜色交替显示缩进 3 TinyPNG 压缩 JPG PNG 图片 4 Live Server 启动具有实时重载的本地开发服
  • 超声波测距的误差分析

    不管在液体还是气体中影响超声波测距精度的都有以下几个因素 一 气介状态下影响超声波测距精度的因素 xff1a 1 压力 不同压力的环境声速是会变化的 xff0c 一般来说压力越大 xff0c 声速越大 xff0c 压力越小 xff0c 声速
  • HAL库的串口基础学习(包含串口接收不定长数据的实现)

    HAL库的串口基础学习 xff08 1 xff09 HAL库有一个特点就是对于许多外设的初始化以及功能操作 xff0c 都提供有一个weak版本的函数 xff0c 这是充分的展现出库名字的含义 xff08 Hardware Abstract
  • 解决头文件相互包含问题的方法

    所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数 一般情况下 xff0c C C 43 43 要求所有的类型必须在使用前被定义 xff0c 但是在一些特殊情况下 xff0c 这种要求无法满足 xff0c 例如 xff0c 在类C
  • 101. 对称二叉树

    101 对称二叉树 给定一个二叉树 xff0c 检查它是否是镜像对称的 例如 xff0c 二叉树 1 2 2 3 4 4 3 是对称的 1 2 2 3 4 4 3 但是下面这个 1 2 2 null 3 null 3 则不是镜像对称的 1
  • code

    class Solution public void push int node stack1 push node int pop int temp while stack2 empty while stack1 empty temp 61
  • c++ unordered_map

    include lt iostream gt include lt unordered map gt int main simple comparison demo std unordered map lt int char gt exp
  • opencv 打开网络摄像头

    闲着没事从同学那里找到了个openwrt xff0c 突然间想起来OPENCV可以很轻松的打开自带的摄像头 xff0c 刚开始学习OPENCV 打开过若干次笔记本的摄像头 xff0c OPENCV能否打开网络摄像头呢 xff1f 在百度上搜
  • opencv 识别网球 ,或者绿色的小球 输出重心坐标

    void image process IplImage image int iLowH 61 26 int iHighH 61 69 int iLowS 61 42 int iHighS 61 206 int iLowV 61 0 int
  • linux 下面如何安装Eigen

    linux 下面如何进行安装 Eigen 1 安装 xff1a sudo apt get install libeigen3 dev 2 调整 xff0c 默认安装路径是 xff1a usr include eigen3 cd usr in
  • matlab 怎么把二维数组画出三维的图像出来

    最近要用到matlab 来进行可视化显示以下数据 xff0c 把数据导入matlab 之后 是二维数组的数据 xff0c 想以数组的x和y 分别为x 和y 轴 xff0c 然后以数组相对应的数据为z 轴 xff0c 然后进行画图显示 cle
  • C++ 怎么批量读取多个文件

    C 43 43 怎么批量读取多个文件 char szName 100 61 39 0 39 sprintf szName 34 training wall clouser wall d pcd 34 j num wall 格式化输出文件名
  • ros 下面同步相机和IMU 两个topic

    This file is used for collecting data fromm imu and camera at the same time One camera and one imu include lt ros ros h
  • 线程和进程的区别与联系以及单线程多进程与单进程多线程的区别

    线程和进程 概念 进程 xff08 process xff09 xff1a 是指具有已一定功能的独立程序 xff0c 是系统资源分配的基本单位 xff0c 在内存中有其完备的数据空间和代码空间 xff0c 拥有完整的虚拟空间地址 一个进程所
  • QgraphicsScene类

    概述 QgraphicsScene类为管理大量的2D图形item提供了一个管理界面 xff0c 做为item的容器 xff0c 它配合使用QgraphicsView使用来观察items 例如线 xff0c 矩形 xff0c 文本或者自定义的
  • 最好的 Curl 学习指南,强烈建议收藏!

    来自 xff1a 阮一峰的网络日志 链接 xff1a http www ruanyifeng com blog 2019 09 curl reference html 简介 curl 是常用的命令行工具 xff0c 用来请求 Web 服务器
  • TCP超时与重传

    1 TCP重传 A 基于时间信息 设置RTO xff1a tcp协议对超时报文的处理响应比较剧烈 xff0c 如 xff1a i 基于拥塞控制机制 xff0c 减小发送窗口大小 限窗 xff1b ii 当一个重传报文段被再次重传时 xff0

随机推荐

  • tcpdump参数用法详解

    一直在linux下开发的人一定会用到tcpdump xff0c 下面就是关于tcpdump的使用方法说明 1 tcpdump的选项 a 将网络地址和广播地址转变成名字 xff1b d 将匹配信息包的代码以人们能够理解的汇编格式给出 xff1
  • 学习图像处理知识---EmguCV3.4图像ArUco Marker Detection--DetectorParameters 结构体

    好久没有更新了图像处理 ArUco Marker Detection 种汉明 海明 码的格子图 用于相机 相机姿态估计之标记检测 在Emgu CV Aruco Namespace 命名空间中 重要的检测结构体DetectorParamete
  • 仿真导航中2d Nav Goal后小车不能到达目标点

    古月老师的课程我在进行仿真导航过程中 xff0c 遇到了小车不能到达我在rviz中指定的2d Nav Goal的目标点 xff0c 并且反复震荡的问题 解决方法如下 xff1a 模型参数里左右轮参数搞反了 xff0c 互换一下即可
  • 超声波传感器测距原理

    超声波 ultrasonic waves xff1a 人类耳朵能听到的声波频率为20HZ xff5e 20KHz 当声波的振动频率大于20KHz或小于20Hz时 xff0c 我们便听不见了 因此 xff0c 我们把频率高于20000赫兹的声
  • stm32串口中断收发数据环形缓冲区的设计

    cpp view plain copy Function Name USART2 IRQHandler Description This function handles USART2 global interrupt request In
  • CMake注意事项

    今天被target link libraries找不到库文件的问题给郁闷了好久 xff0c 后来才发现target link libraries第二个参数 xff08 即需要连接的库 xff09 居然一定要lib作为开头 xff0c 才能在
  • Web后端http请求(带用户名和密码防止401 Unauthorized)

    Java Java这方面的Jar包应该比较多 xff0c 比如HttpClient xff0c 我这里使用最基本的 xff1a java view plain copy 认证信息对象 xff0c 用于包含访问翻译服务的用户名和密码 Auth
  • 开关电源基础——TI电源在电赛中的应用

    开关电源基础 线性稳压器等效电路 如果输入是39V xff0c 输出是13V xff0c 那么效率为33 3 xff0c 过低的效率导致能量的浪费 如何提高线性稳压器的效率呢 xff1f 这是开关电源最原始的设计思想 xff0c 但是我们又
  • QGraphicsView类

    QGraphicsView提供一个显示QGraphicsScene内容的窗口 xff0c 该窗口可以滚动 xff0c 可以在构造时候把场景对象作为参数 xff0c 或者之后使用setScene 来设置view的场景 xff0c 然后调用了s
  • STM32 USART 接收任意长度字符

    近段时间学习到 STM32 USART 部分 xff0c 基本上在接收数据的时候都是采用定长 xff0c 所以一直想实现接收任意长度的字符串 这里的任意长度不是指的无限长 xff0c 而是在自己定义的缓冲区范围之类 比如说缓冲区的大小是 1
  • 关于RS485和RS422总线,一主多从回复信号被拉低收不到反馈数据的问题。

    芯片 xff1a MAX13487EESA xff08 RS485 xff09 这里这个三个电阻不接 AK管不接也行 如果你发现你在总线上挂接两个以上的RS485模块 xff0c 发现总线电压和只接一个时波形幅度降低了 xff0c 就是上面
  • ubuntu16.04 UNIX 网络编程卷一 源码使用

    参考源码目录 README文档 tar xvf unpv13e tar gz 解压 然后进入源码目录 a configure 这一步没有出现问题 b cd lib c make 这一步没有出错 d cd libfree e make 这一步
  • HTTP认证之摘要认证——Digest

    一 概述 Digest认证是为了修复基本认证协议的严重缺陷而设计的 xff0c 秉承 绝不通过明文在网络发送密码 的原则 xff0c 通过 密码摘要 进行认证 xff0c 大大提高了安全性 相对于基本认证 xff0c 主要有如下改进 xff
  • QFramework Pro 开发日志(六)一键生成类图功能介绍

    这个功能连续开发了三天 xff0c 现在完成了一个基本的雏形 先说说 xff0c 为啥做这个功能吧 作为 Unity 开发者 xff0c 不管是在做游戏还是在做工具 方案 学习源码的时候 xff0c 多多少少都会需要魔改一些其他插件 框架
  • HAL库教程9:串口接收不定长数据

    串口收到的两组数据之间 xff0c 往往会有一定的时间间隔 可以判断这个间隔 xff0c 来实现无需结束符 xff0c 无需指定长度 xff0c 串口可接收不定长数据的功能 如果串口在一定的时间内没有收到新的数据 xff0c 可以认为一组数
  • odroid平台——ASUS Xtion Pro Live + Openni + ROS搭建(Xu4升级版)

    之前的文章写了基于odroid xu3的Xtion 43 ROS搭建方法 xff0c 由于xu3停产了 xff0c 只能换用xu4 xff0c 但是换的过程中发现xu4没有usb2 0 xff0c 只有usb3 0 xff0c 但是很遗憾X
  • Tensorflow: Cannot dlopen some GPU libraries. Skipping registering GPU devices...

    Cannot dlopen some GPU libraries Skipping registering GPU devices 很久没搞Tensorflow了 xff0c 又出了一些问题 xff0c 这里作个备份 可能的问题为 xff1
  • 目标检测模型、卷积网络的感受野与分形特征

    概述 最近几年深度学习的快速发展对目标检测 xff08 Object Detection xff09 领域也产生了巨大的影响 xff0c 各种SOTA xff08 State of Art xff09 的模型也层出不穷 xff0c 包括但不
  • 点关于直线的距离、垂足、对称点公式

    下面通过两种直线方程的形式 xff0c 求解点关于直线的距离 垂足 对称点公式 问题描述1 xff1a 已知点的坐标 xff08 x0 xff0c y0 xff09 xff0c 直线的方程为Ax 43 By 43 C 61 0 xff1b
  • 理解神经网络的数学原理(一) 全连接模型的空间划分与编码逻辑

    概述 几年前就想写这篇文章 xff0c 但是在解析神经网络的数学原理问题上断断续续 xff0c 加上个人能力有限 xff0c 很多问题并没有研究的很明白 xff0c 以及神经网络本身高维问题的复杂性 xff0c 导致这个问题的理解也是有限的