神经网络数学原理与编码逻辑(一) 无隐层模型

news2024/11/19 20:27:35

概述

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

分离超平面

分离超平面(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

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

单层感知机

我们知道感知机 (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)。因为感知机非常简单,这里只简单介绍,我们的重点放在无隐藏层的模型解析上。

无隐层回归模型

无隐层回归模型,其实就是线性回归模型 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 T − w 2 T ) x + ( b 1 − b 2 ) = 0 (w^T_1-w^T_2)x+(b_1-b_2) = 0 (w1Tw2T)x+(b1b2)=0,作一次代数替换,令 w = ( w 1 T − w 2 T ) , b = ( b 1 − b 2 ) w=(w^T_1-w^T_2),b=(b_1-b_2) w=(w1Tw2T),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,而是通过节点间计算得到的,在多节点的分类中单个节点的意义比较有限,分离超平面是一个相对问题,而非单个节点所决定的,尤其在多分类中或含有隐藏层的网络中其分离超平面并非显而易见,这也是神经网络难以被理解的原因之一。
在这里插入图片描述
以上是二维数据上训练后的结果;其中蓝色直线表示节点超平面 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。受参数随机初始化的影响,虽然产生了几乎相同的决策超平面,但是节点的超平面却非常不同。

无隐层多分类模型

神经网络的最后一层,一般用来作为分类层或回归层,无隐层分类模型也就是我们所说的全连接层(Fully Connected Layer,FCLayer)。上面总结了 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 ( x ) = { 1 , x > 0 0 , x ≤ 0 s(x)=\left\{\begin{matrix} 1&,x> 0\\ 0&,x\leq 0 \end{matrix}\right. s(x)={10,x>0,x0 去编码超平面,会得到

   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/1] y1=max(y1,y2,y3)s([h12,h13,h23])=[1,1,0/1]
   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/1,1] y2=max(y1,y2,y3)s([h12,h13,h23])=[0,0/1,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/1,0,0] y3=max(y1,y2,y3)s([h12,h13,h23])=[0/1,0,0]

这里 0 / 1 0/1 0/1指:0或1,这也意味着,当我们确定编码时,我们就能得到概率最大的输出节点。在大于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/i} yi>yn/i,那么这个模型中的存在这样的编码逻辑:任意类别数据 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/i}>0 yiyn/i>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/i} xn/i,存在 ( 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/i}+b \leq0 wTxn/i+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的半空间中可以再次划分。

激活函数的作用

通过上面的分析,如 s i g n ( x ) sign(x) sign(x)激活函数可以直接将任意节点超平面 w T x + b = 0 w^Tx+b=0 wTx+b=0转化为决策超平面,而无需节点间的比较,这样也简化了模型编码,减少模型参数量,避免节点比较带来的最大编码区缺陷。其他激活函数也是同样的道理,如 R e L U ( x ) ReLU(x) ReLU(x)等等。激活函数的这个性质对有隐藏层的网络解析也是很重要的,如果超平面要基于节点间比较来产生将会变得更加复杂。

通过对无隐层网络的分析,我们也发现了 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作为决策边界,能使编码逻辑更加简单清晰,易于解释。而 s i g n ( x ) , R e L U ( x ) sign(x),ReLU(x) sign(x),ReLU(x)等几乎常用的激活函数都是以 w T x + b = 0 w^Tx+b=0 wTx+b=0作为决策边界编码数据的。

总结

通过本篇文章,希望大家能理解无隐藏层模型的编码逻辑及激活函数的作用,这边文章没有解析多层感知机,因为多层感知机相对来说会更加复杂其编码逻辑和无隐藏层模型有较大的区别,且内容较多,多层感知机的内容将留在下一篇文章分析。

参考文献

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OAuth2代码流程演示

目录 一&#xff0c;创建项目 二&#xff0c;项目结构 一&#xff0c;创建项目 新建项目时&#xff0c;如果换了工作区间我们一定要记得改maven地址&#xff0c;不然下载插件时不仅占用C盘内存&#xff0c;还会下载的很慢。 导入项目 导入新项目后就会下载新的插件&#xf…

消息队列简介

提高系统性能首先考虑的是数据库的优化&#xff0c;之前一篇文章《数据库的使用你可能忽略了这些》中有提到过开发中&#xff0c;针对数据库需要注意的事项。但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库…

Unity可用 运行时语音合成(文本转语音)插件 RT-Voice PRO

Unity语音合成文本转语音插件 RT-Voice PRO前言一、导入RT-Voice PRO插件二、使用步骤1.先看自带例子&#xff08;01-Speech&#xff09;2.自行配置总结前言 提示&#xff1a;这个插件在Unity Asset Store 卖 78美刀,确实买不起啊。 &#x1f602; AssetStore下载链接 文章最后…

复试数据结构篇[第5章-第6章]

文章目录第五章 数组和广义表1-数组定义2-数组的顺序表示3-矩阵的压缩存储&#xff08;1&#xff09;对称矩阵和三角矩阵&#xff08;2&#xff09;对角矩阵&#xff08;3&#xff09;稀疏矩阵&#xff08;3&#xff09;十字链表4-广义表的定义串、数组、广义表小结第六章 树与…

JVM的类加载

什么是类加载&#xff1f;java程序运行前&#xff0c;要经过编译即.java>.class文件。运行的时候java进程(JVM)就会读取对应的.class文件&#xff0c;并解析内容&#xff0c;在内存中构造出类对象并进行初始化&#xff08;类对象就是描述这个类有哪些属性&#xff0c;哪些方…

基于卡尔曼滤波器的PID控制-3

基于卡尔曼滤波器的PID控制系统结构如图1所示。图1 基于卡尔曼滤波器的PID控制被控对象为二阶传递函数&#xff1a;离散化结果与“基于卡尔曼滤波器的PID控制-1”的仿真实例相同。采样时间为1ms。控制干扰信号w(k)和测量噪声信号v(k)幅值均为0.002的白噪声信号&#xff0c;输入…

Python中最全的窗口操作,如窗口最大化、最小化、窗口置顶、获取缩放比例等

Python窗口操作 前言 本文记录在Python中操作Windows应用窗口的操作。 这里的操作都是自己摸索借助强大的搜索引擎整理出来的&#xff0c;我真棒&#xff01;&#xff01;&#xff01; 知识点&#x1f4d6;&#x1f4d6; 名称解释名称ctypes****ctypesPython的外部函数库。它…

高阶导数——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是高阶导数&#xff0c;在这之前&#xff0c;我们学习了导数的概念和函数的求导法则&#xff0c;那么今天&#xff0c;就让我们一起进入高阶导数的世界吧 一、高阶导数的定义 二、高阶导数的计算 1.直接法 2.间…

儿童护眼台灯如何选择?2023年儿童护眼台灯推荐

随着科技不断发展&#xff0c;生活方式的改变&#xff0c;各类的电子产品的使用&#xff0c;加上不注意保护视力、过度用眼等&#xff0c;我国儿童青少年的近视率出现上升趋势&#xff0c;为了保护孩子们的健康&#xff0c;护眼台灯受到许多家庭的青睐&#xff0c;那么儿童的护…

[个人备忘]go包管理

版本 1.18创作目的: 之前想要在go的项目里引用另一个自己写的项目, 然后被折磨半天,乃至弃坑1,创建项目我们创建目录gogogo,下面有两个项目: 分别创建main.goutils/main.gopackage utils import "fmt" // 大写才能被外部访问 func Log(){fmt.Print("go mod is s…

Postman 实现备份数据 Postman恢复数据 postman 导出导入数据 postman 导入导出数据

Postman 实现备份数据 Postman恢复数据 postman 导出导入数据 postman 导入导出数据 一、需求描述 在使用postman调试接口时&#xff0c;若遇到内网的环境&#xff0c;无法通过账户同步数据&#xff1b; 在A电脑调试的接口数据&#xff0c;需要移动到B电脑上&#xff0c;如何实…

python第三方库的离线安装与自动安装脚本(以flask为例 Ubuntu18.04系统)

1.第三方库安装方式 1.1 pip 安装 以flask为例&#xff0c;使用指令 pip install flask即可安装 其他选项&#xff1a; install 安装库 uninstall 卸载库 list 列出已经安装的库 show 列出已安装的库的详细信息 search 通过PyPI搜索库 help 帮助命令1.2 源码安装 官网获取…

SpringBoot整合Shiro

简介Shiro是一个功能强大和易于使用的Java安全框架&#xff0c;为开发人员提供一个直观而全面的解决方案的认证&#xff0c;授权&#xff0c;加密&#xff0c;会话管理。Shiro 四个主要的功能&#xff1a;Authentication&#xff1a;身份认证/登录&#xff0c;验证用户是不是拥…

kubernetes -- 删除namespace的过程以及遇到的bug解决

通过阅读本篇文章你可以收获如下知识&#xff1a; 解决一个bug。理解k8s的controller中&#xff0c;删除namespace的源码&#xff0c;理解其中的删除过程。 问题 执行kubectl delete ns {ns-name}命令来删除ns-name的时候&#xff0c;发现状态一直停留在Terminating。 [roo…

2023牛客寒假算法基础集训营5

(0条未读通知) 【题解】2023牛客寒假算法基础集训营5_ICPC/CCPC/NOIP/NOI刷题训练题单_牛客竞赛OJ (nowcoder.com) A-小沙の好客 下面是错误代码&#xff0c;我刚开始看到这题&#xff0c;觉得很简单阿&#xff0c;做了才知道&#xff0c;会超时&#xff0c;所以不能单纯的去做…

Mac电脑运行速度又卡又慢如何解决?CleanMyMacX2023最新版

CleanMyMac X为您喜爱的东西腾出空间。体验一系列巧妙的新功能&#xff0c;CleanMyMac可让您安全智能地扫描和清理整个系统&#xff0c;删除大量未使用的文件&#xff0c;缩小iPhoto图库的大小&#xff0c;卸载不需要的应用程序或修复不正常工作的应用程序&#xff0c;管理所有…

ARM异常处理

1.ARM异常源1.1 异常模式2.ARM异常响应CPSR内存储的是当前模式。2.1 异常向量表每个异常源只有四个字节的存储空间&#xff0c;所以不在向量表中写异常处理程序&#xff0c;而是写跳转指令。2.2 IRQ异常举例

产业互联网曾被认为是一个生搬硬凑出来的概念

有关产业互联网的质疑&#xff0c;依然还在耳畔会响。但&#xff0c;我们却无可避免地进入到了产业互联网的周期里。这听上去有些耸人听闻&#xff0c;却在真实地发生着。曾经&#xff0c;产业互联网被认为是一个生搬硬凑出来的概念&#xff0c;甚至还有人认为&#xff0c;它仅…

垃圾渗滤液膜后稳定出水水质稳定工艺

垃圾渗滤液的来源及水质特点 垃圾渗滤液是垃圾在堆放和填埋过程中由于发酵和雨水的淋洗、冲刷以及地表地下水的浸泡出来的污水。 当垃圾堆体的湿度超过其持水能力后&#xff0c;垃圾堆体内悬浮的或溶解的有机污染物和重金属等无机污染物将会随之一块溶出&#xff0c;便会产生渗…

大学生需要配备什么电子产品、上大学必备电子产品推荐清单

又是一年开学季&#xff0c;最近我们这里的中小学已经陆陆续续通知开学了。大学生正式开学还需要一段时间&#xff0c;作为大学生在入学之前&#xff0c;一定要准备好各种学习和生活物资。对于大学生而言&#xff0c;有大把的时间可以用来快活&#xff0c;而现在数码产品又成为…