Lesson 9.2&9.3&9.4 黑箱:不可解释的深层神经网络&探索多层神经网络:层vsh(z)

2023-05-16

二、黑箱:深层神经网络的不可解释性

在这里插入图片描述
首先从结构上来看,多层神经网络比单层神经网络多出了“中间层”。中间层常常被称为隐藏层(hidden layer),理论上来说可以有无限层,所以在图像表示中经常被省略。层数越多,神经网络的模型复杂度越高,一般也认为更深的神经网络可以解决更加复杂的问题。在学习中,通常我们最多只会设置3~5个隐藏层,但在实际工业场景中会更多。还记得这张图吗?当数据量够大时,现代神经网络层数越深,效果越好。
在这里插入图片描述
在一个神经网络中,更靠近输入层的层级相对于其他层级叫做"上层",更靠近输出层的则相对于其他层级叫做"下层"。若从输入层开始从左向右编号,则输入层为第0层,输出层为最后一层。除了输入层以外,每个神经元中都存在着对数据进行处理的数个函数。在我们的例子异或门(XOR)中,隐藏层中的函数是NAND函数和OR函数(也就是线性回归的加和函数+阶跃函数),输出层上的函数是AND函数。对于所有神经元和所有层而言,加和函数的部分都是一致的(都得到结果 z z z),因此我们需要关注的是加和之外的那部分函数。在隐藏层中这个函数被称为激活函数,符号为 h ( z ) h(z) h(z),在输出层中这个函数只是普通的连接函数,我们定义为是 g ( z ) g(z) g(z)。我们的数据被逐层传递,每个下层的神经元都必须处理上层的神经元中的 h ( z ) h(z) h(z)处理完毕的数据 ,整个流程本质是一个嵌套计算结果的过程。
在这里插入图片描述
在神经网络中,任意层上都有至少一个神经元,最上面的是常量神经元,连接常量神经元的箭头上的参数是截距 b b b,剩余的是特征神经元,连接这些神经元的箭头上的参数都是权重 w w w。神经元是从上至下进行编号,需要注意的是,常量神经元与特征神经元是分别编号的。和从0开始编号的层数不同,神经元是从1开始编号的。在异或门的例子中,含有1的偏差神经元是1号偏差神经元,含有特征的神经元则是1号特征神经元。

除了神经元和网络层,权重、偏差、神经元上的取值也存在编号。这些编号规律分别如下:
在这里插入图片描述
这些编号实在很复杂,因此在本次课程中,我将编号改写为如下情况:
在这里插入图片描述
有了这些编号说明,我们就可以用数学公式来表示从输入层传入到第一层隐藏层的信号了。以上一节中说明的XOR异或门为例子,对于仅有两个特征的单一样本而言,在第一层的第一个特征神经元中获得加和结果的式子可以表示为:
z 1 1 = b → 1 → 1 + x 1 w 1 → 1 0 → 1 + x 2 w 2 → 1 0 → 1 z_{1}^{1}=b_{\rightarrow 1}^{\rightarrow 1}+x_{1} w_{1 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{2 \rightarrow 1}^{0 \rightarrow 1} z11=b11+x1w1101+x2w2101
而隐藏层中被 h ( z ) h(z) h(z)处理的公式可以写作:
σ 1 1 = h ( z 1 1 ) = h ( b → 1 1 + x 1 w 1 → 1 0 → 1 + x 2 w 2 → 1 0 → 1 ) \begin{aligned} \sigma_{1}^{1} &=h\left(z_{1}^{1}\right) \\ &=h\left(b_{\rightarrow 1}^{1}+x_{1} w_{1 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{2 \rightarrow 1}^{0 \rightarrow 1}\right) \end{aligned} σ11=h(z11)=h(b11+x1w1101+x2w2101)
根据我们之前写的NAND函数,这里的 h ( z ) h(z) h(z)为阶跃函数。
现在,我们用矩阵来表示数据从输入层传入到第一层,并在第一层的神经元中被处理成 σ \sigma σ的情况:
Z 1 = W 1 ⋅ X + B 1 \mathbf{Z}^{1}=\mathbf{W}^{1} \cdot \mathbf{X}+\mathbf{B}^{1} Z1=W1X+B1
[ z 1 1 z 2 1 ] = [ w 1 → 1 0 → 1 w 1 → 2 0 → 1 w 2 → 1 0 → 1 w 2 → 2 0 → 1 ] ∗ [ x 1 x 2 ] + [ b → 1 → 1 b → 2 0 ] \left[\begin{array}{l} z_{1}^{1} \\ z_{2}^{1} \end{array}\right]=\left[\begin{array}{ll} w_{1 \rightarrow 1}^{0 \rightarrow 1} & w_{1 \rightarrow 2}^{0 \rightarrow 1} \\ w_{2 \rightarrow 1}^{0 \rightarrow 1} & w_{2 \rightarrow 2}^{0 \rightarrow 1} \end{array}\right] *\left[\begin{array}{l} x_{1} \\ x_{2} \end{array}\right]+\left[\begin{array}{l} b_{\rightarrow 1}^{\rightarrow 1} \\ b_{\rightarrow 2}^{0} \end{array}\right] [z11z21]=[w1101w2101w1201w2201][x1x2]+[b11b20]
 矩阵结构表示为:  ( 2 , 1 ) = ( 2 , 2 ) ∗ ( 2 , 1 ) + ( 2 , 1 ) \text { 矩阵结构表示为: }(2,1)=(2,2) *(2,1)+(2,1)  矩阵结构表示为(2,1)=(2,2)(2,1)+(2,1)
= [ x 1 w 1 → 1 0 → 1 + x 2 w 1 → 2 0 → 1 x 1 w 2 → 1 0 → 1 + x 2 w 2 → 2 0 → 1 ] + [ b → 1 → 1 b → 1 b → 2 ] = [ x 1 w 1 → 1 0 → 1 + x 2 w 1 → 2 0 → 1 + b → 1 → 1 x 1 w 2 → 1 0 → 1 + x 2 w 2 → 2 0 → 1 + b → 2 → 1 ] [ σ 1 1 σ 2 1 ] = [ h ( x 1 w 1 → 1 0 → 1 + x 2 w 1 → 2 0 → 1 + b → 1 → 1 ) h ( x 1 w 2 → 1 0 → 1 + x 2 w 2 → 2 0 → 1 + b → 2 0 ) ] \begin{aligned} &=\left[\begin{array}{l} x_{1} w_{1 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{1 \rightarrow 2}^{0 \rightarrow 1} \\ x_{1} w_{2 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{2 \rightarrow 2}^{0 \rightarrow 1} \end{array}\right]+\left[\begin{array}{l} b_{\rightarrow 1}^{\rightarrow 1} \\ b \rightarrow 1 \\ b \rightarrow 2 \end{array}\right] \\ &=\left[\begin{array}{l} x_{1} w_{1 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{1 \rightarrow 2}^{0 \rightarrow 1}+b_{\rightarrow 1}^{\rightarrow 1} \\ x_{1} w_{2 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{2 \rightarrow 2}^{0 \rightarrow 1}+b_{\rightarrow 2}^{\rightarrow 1} \end{array}\right] \\ \left[\begin{array}{c} \sigma_{1}^{1} \\ \sigma_{2}^{1} \end{array}\right] &=\left[\begin{array}{l} h\left(x_{1} w_{1 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{1 \rightarrow 2}^{0 \rightarrow 1}+b_{\rightarrow 1}^{\rightarrow 1}\right) \\ h\left(x_{1} w_{2 \rightarrow 1}^{0 \rightarrow 1}+x_{2} w_{2 \rightarrow 2}^{0 \rightarrow 1}+b_{\rightarrow 2}^{0}\right) \end{array}\right] \end{aligned} [σ11σ21]=[x1w1101+x2w1201x1w2101+x2w2201]+b11b1b2=[x1w1101+x2w1201+b11x1w2101+x2w2201+b21]=[h(x1w1101+x2w1201+b11)h(x1w2101+x2w2201+b20)]
相应的从中间层最下面的神经网络会得到的结果是 σ 1 2 \sigma_{1}^{2} σ12(如果是阶跃函数则是直接得到y)。 σ \sigma σ会作为中间层的结果继续传入下一层。如果我们继续向下嵌套,则可以得到:
z 1 2 = b → 1 → 2 + σ 1 1 w 1 → 1 1 → 2 + σ 2 1 w 2 → 1 1 → 2 σ 1 2 = g ( z 1 2 ) σ 1 2 = g ( b → 1 − 2 + σ 1 1 w 1 → 1 1 → 2 + σ 2 1 w 2 → 1 1 → 2 ) \begin{aligned} z_{1}^{2} &=b_{\rightarrow 1}^{\rightarrow 2}+\sigma_{1}^{1} w_{1 \rightarrow 1}^{1 \rightarrow 2}+\sigma_{2}^{1} w_{2 \rightarrow 1}^{1 \rightarrow 2} \\ \sigma_{1}^{2} &=g\left(z_{1}^{2}\right) \\ \sigma_{1}^{2} &=g\left(b_{\rightarrow 1}^{-2}+\sigma_{1}^{1} w_{1 \rightarrow 1}^{1 \rightarrow 2}+\sigma_{2}^{1} w_{2 \rightarrow 1}^{1 \rightarrow 2}\right) \end{aligned} z12σ12σ12=b12+σ11w1112+σ21w2112=g(z12)=g(b12+σ11w1112+σ21w2112)
由于第二层就已经是输出层了,因此第二层使用的函数是 g ( z ) g(z) g(z),在这里,第二层的表达和第一层几乎一 模一样。相信各种编号在这里已经让人感觉到有些头疼了,虽然公式本身并不复杂,但涉及到神经网络不同的层以及每层上的神经元之间的数据流动,公式的编号会让人有所混淆。如果神经网络的层数继续增加,或每一层上神经元数量继续增加,神经网络的嵌套和计算就会变得更加复杂。

在实际中,我们的真实数据可能有超过数百甚至数千个特征,所以真实神经网络的复杂度是非常高,计算非常缓慢的。所以,当神经网络长成如下所示的模样,我们就无法理解中间过程了。我们不知道究竟有多少个系数,如何相互作用产生了我们的预测结果,因此神经网络的过程是一个“黑箱”。
在这里插入图片描述
在PyTorch中实现神经网络的时候,我们一般用不到这些复杂的数学符号,也不需要考虑这些嵌套流程,毕竟这些计算非常底层。那为什么我们还要学习这些符号呢?有以下几点原因:

1、利用数学的嵌套,我们可以很容易就理解深层神经网络为什么会随着层数的增多、每层上神经元个数的增多而变得复杂,从而理解“黑箱”究竟是怎样形成的

2、多层神经网络与单层神经网络在许多关键点上其实有所区别,这种区别使用代数表示形式会更容易显示。比如,单层神经网络(线性回归、逻辑回归)中直线的表现形式都是 X w Xw Xw,且 w w w是结构为(n_features,1)的列向量,但在多层神经网络中,随着“层”和神经元个数的增加,只有输入层与第一个隐藏层之间是特征与 w w w的关系,隐藏层与隐藏层、隐藏层与输出层之间都是 σ \sigma σ w w w的关系。并且,即便是在输入层与第一个隐藏层之间,单个特征所对应的 w w w不再是列向量,而是结构为(上层特征神经元个数,下层特征神经元个数)的矩阵。并且,每两层神经元之间,都会存在一个权重矩阵,权重将无法直接追踪到特征x上,这也是多层神经网络无法被解释的一个关键原因。同时,为了让输出结果和都保持列向量的形式(与神经网络的图像匹配), X X X的结构也要顺应 w w w的变化而变化(上文的推导中我们展现的是单 一样本仅有两个特征的情况,想想看多个样本多个特征会是什么样吧),相乘公式也变化为 w X wX wX。这些细节在由单层推广到多层时,都会成为新手容易掉入的坑,基础不牢固的情况下,新手很可能在2层推广 到4层,2个特征推广到N个特征,甚至是1个样本推广到多个样本时被卡住。(W的结构会改变——权重矩阵,X从行变成列,Z变成W在前X在后)

3、嵌套的数学公式可以帮助我们更好地理解反向传播,以及更好地阅读其他教材。

不过,即便神经网络是一个神秘黑箱,我们依然可以对它进行一系列的探索。基于我们已经熟悉的三层神经网络XOR的结构,我们来提出问题。

三、探索多层神经网络:层 vs h(z)

我们首先想要发问的隐藏层的作用。在之前的XOR函数中,我们提出”多层神经网络能够描绘出一条曲线作为决策边界,以此为基础处理单层神经网络无法处理的复杂问题“,这可能让许多人产生了“是增加层数帮助了神经网络”的错觉。实际上并非如此。

在神经网络的隐藏层中,存在两个关键的元素,一个是加和函数 ∑ \sum ,另一个是 h ( z ) h(z) h(z)。除了输入层之外,任何层的任何神经元上都会有加和的性质,因为神经元有“多进单出”的性质,可以一次性输入多个信号,但是输出只能有一个,因此输入神经元的信息必须以某种方式进行整合,否则神经元就无法将信息传递下去,而最容易的整合方式就是加和 ∑ \sum 。因此我们可以认为加和 ∑ \sum 是神经元自带的性质,只要增加更多的层,就会有更多的加和。但是 h ( z ) h(z) h(z)的存在却不是如此,即便隐藏层上没有 h ( z ) h(z) h(z)(或 h ( z ) h(z) h(z)是一个恒等函数),神经网络依然可以从第一层走到最后一层。让我们来试试看,在XOR中,假设隐藏层上没有 h ( z ) h(z) h(z)的话,会发生什么:
在这里插入图片描述

#回忆一下XOR数据的真实标签
xorgate = torch.tensor([0,1,1,0],dtype=torch.float32)

def AND(X):
    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    #下面这一行就是阶跃函数的表达式,注意AND函数是在输出层,所以保留输出层的阶跃函数g(z)
    andhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return andhat

def OR(X):
    w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32) #在这里我修改了b的数值
    zhat = torch.mv(X,w)
    #注释掉阶跃函数,相当于h(z)是恒等函数
    #yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return zhat

def NAND(X):
    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32) 
    zhat = torch.mv(X,w)
    #注释掉阶跃函数,相当于h(z)是恒等函数
    #yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return zhat

def XOR(X):
    #输入值:
    input_1 = X
    #中间层:
    sigma_nand = NAND(input_1)
    sigma_or = OR(input_1)
    x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)
    #输出层:
    input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)
    y_and = AND(input_2)
    #print("NANE:",y_nand)
    #print("OR:",y_or)
    return y_and
    
XOR(X)
#tensor([0., 0., 0., 0.])

很明显,此时XOR函数的预测结果与真实的xorgate不一致。当隐藏层的 h ( z ) h(z) h(z)是恒等函数或不存在时,叠加层并不能够解决XOR这样的非线性问题。从数学上来看,这也非常容易理解。
从输入层到第1层:
在这里插入图片描述
从第1层到输出层:
在这里插入图片描述
不难发现,最终从输出层输出的结果和第一层的输出结果 x 1 w 11 1 + x 2 w 12 1 + b 1 1 x_{1} w_{11}^{1}+x_{2} w_{12}^{1}+b_{1}^{1} x1w111+x2w121+b11是类似的,只不过是乘以特征 x 1 x_{1} x1, x 2 x_{2} x2的具体数值不同。在没有 h ( z ) h(z) h(z)时,在层中流动的数据被做了仿射变换(affine transformation),仿射变换后得到的依然是一个线性方程,而这样的方程不能解决非线性问题。可见“层”本身不是神经网络解决非线性问题的关键,层上的 h ( z ) h(z) h(z)才是。 从上面的例子和数学公式中可以看出,如果 h ( z ) h(z) h(z)是线性函数,或不存在,那增加再多的层也没有用。

那是不是任意非线性函数作为 h ( z ) h(z) h(z)都可以解决问题呢?让我们来试试看,在XOR例子中如果不使用阶跃函数,而使用sigmoid函数作为,会发生什么。

def AND(X):
    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    #下面这一行就是阶跃函数的表达式,注意AND函数是在输出层,所以保留输出层的阶跃函数g(z)
    andhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return andhat
    
def OR(X):
    w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32) #在这里我修改了b的数值
    zhat = torch.mv(X,w)
    #h(z), 使用sigmoid函数
    sigma = torch.sigmoid(zhat)
    return sigma
    
def NAND(X):
    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32) 
    zhat = torch.mv(X,w)
    #h(z), 使用sigmoid函数
    sigma = torch.sigmoid(zhat)
    return sigma
    
def XOR(X):
    #输入值:
    input_1 = X
    #中间层:
    sigma_nand = NAND(input_1)
    sigma_or = OR(input_1)
    x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)
    #输出层:
    input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)
    y_and = AND(input_2)
    #print("NANE:",y_nand)
    #print("OR:",y_or)
    return y_and
    
XOR(X)
#tensor([0., 0., 0., 0.])

可以发现,如果将 h ( z ) h(z) h(z)换成sigmoid函数,XOR结构的神经网络同样会失效!可见,即便是使用了 h ( z ) h(z) h(z),也不一定能够解决曲线分类的问题。在不适合的非线性函数加持下,神经网络的层数再多也无法起效。所以, h ( z ) h(z) h(z)是真正能够让神经网络算法“活起来”的关键,没有搭配合适 h ( z ) h(z) h(z)的神经网络结构是无用的,而 h ( z ) h(z) h(z)正是神经网络中最关键的概念之一激活函数(activation function)。

四、激活函数

在这里插入图片描述
经过前面的介绍与铺垫,到这里相信大家已经充分理解激活函数的作用了。神经网络中可用的激活函数多达数十种(详情可以在激活函数的维基百科中找到:https://en.wikipedia.org/wiki/Activation_function),但机器学习中常用的激活函数只有恒等函数(identity function),阶跃函数(sign),sigmoid 函数,ReLU,tanh,softmax这六种,其中Softmax与恒等函数几乎不会出现在隐藏层上,Sign、Tanh 几乎不会出现在输出层上,ReLU与Sigmoid则是两种层都会出现,并且应用广泛。幸运的是,这6种函数我们在之前的课程中已经全部给大家介绍完毕。在这里,我们将总结性声明一下输出层的g(z)与隐藏层的h(z)之间的区别,以帮助大家获得更深的理解:

  1. 虽然都是激活函数,但隐藏层和输出层上的激活函数作用是完全不一样的。输出层的激活函数是为了让神经网络能够输出不同类型的标签而存在的。其中恒等函数用于回归,sigmoid函数用于二分类,softmax用于多分类。换句说, g ( z ) g(z) g(z)仅仅与输出结果的表现形式有关,与神经网络的效果无关,也因此它可以使用线性的恒等函数。但隐藏层的激活函数就不同了,如我们之前尝试的XOR,隐藏层上的激活函数 h ( z ) h(z) h(z)的选择会影响神经网络的效果,而线性的是会让神经网络的结构失效的。
  2. 在同一个神经网络中, g ( z ) g(z) g(z) h ( z ) h(z) h(z)可以是不同的,并且在大多数运行回归和多分类的神经网络时,他们也的确是不同的。每层上的 h ( z ) h(z) h(z)可以是不同的,但是同一层上的激活函数必须一致。

我们可以通过下面的这段代码来实际体会一下, h ( z ) h(z) h(z)影响模型效果,而 g ( z ) g(z) g(z)只影响模型输出结果的形式的事实。之前我们曾经尝试过以下几种情况:
在这里插入图片描述
现在我们来试试看,隐藏层上的 h ( z ) h(z) h(z)是阶跃函数,而输出层的 g ( z ) g(z) g(z)是sigmoid的情况。如果XOR网络依然有效,就证明了 g ( z ) g(z) g(z)的变化对神经网络结果输出无影响。反之,则说明也影响神经网络输出结果。

#如果g(z)是sigmoid函数,而h(z)是阶跃函数
#输出层,以0.5为sigmoid的阈值
def AND(X):
    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    sigma = torch.sigmoid(zhat)
    andhat = torch.tensor([int(x) for x in sigma >= 0.5],dtype=torch.float32)
    return andhat

#隐藏层,OR与NAND都使用阶跃函数作为h(z)
def OR(X):
    w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32) #在这里我修改了b的数值
    zhat = torch.mv(X,w)
    yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return yhat

def NAND(X):
    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32) 
    zhat = torch.mv(X,w)
    yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return yhat

def XOR(X):
    #输入值:
    input_1 = X
    #中间层:
    sigma_nand = NAND(input_1)
    sigma_or = OR(input_1)
    x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)
    #输出层:
    input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)
    y_and = AND(input_2)
    #print("NANE:",y_nand)
    #print("OR:",y_or)
    return y_and

XOR(X)
#tensor([0., 1., 1., 0.])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lesson 9.2&9.3&9.4 黑箱:不可解释的深层神经网络&探索多层神经网络:层vsh(z) 的相关文章

  • 【信息奥赛题解】昆虫繁殖(详细分析题解 & C++ 代码)

    昆虫繁殖问题 x1f31f 题目名称 昆虫繁殖 题目描述 科学家在热带森林中发现了一种特殊的昆虫 xff0c 这种昆虫的繁殖能力很强 每对成虫过 X X X 个月后开始产卵 xff0c 每月产 Y Y
  • ESP实验02-读取DS1307&eerom34c32

    1 模块介绍 本实验主要用到两个模块 esp32 tinyRTC 模块的图片如下所示 xff1a esp32模块型号为ESP32Devkitc v4 xff0c 是启明云端官方的开发板 与乐鑫官方的完全一致 xff0c 引脚顺序 xff0c
  • 无人机仿真SLAM_gazebo&promethues

    无人机仿真 总体概述系统要求 PX4固件简介无人机固件整体框图无人机软件框图无人机硬件模型 Mavlink模块位置估计与姿态估计模块安装与编译二次开发 机载计算机程序控制模块估计模块仿真模块SLAM模块SLAM效果演示 总体概述 无人机仿真
  • LLVM/clang & lib路径 & 测试代码

    部分转载自 xff1a Ubuntu编译安装llvm clangUbuntu14 04 Linux安装LLVM clang 3 7 xff08 带有标准库 libc 43 43 xff0c libc 43 43 abi xff09 所需即所
  • AUTOSAR_DCM&DEM(UDS&OBD)

    1 术语与缩写 术语 DCM Diagnostic Communication Manager DEM Diagnostic Event Manager UDS Unified diagnostic services OBD On Boar
  • ElasticSearch学习&&理解

    注 xff1a 本篇的es基于7 5 1版本 目录 Elasticsearch是什么 xff1f ElasticSearch的环境搭建 ElasticSearch的名词 ElasticSearch查询出的数据格式 ElasticSearch
  • Linux下rpm&yum&apt-get

    RPM简介 RPM命名 RedHat Package Manager xff0c 简称则为RPM 属于Red Hat阵营的 xff0c 与其并列的则是debian centos中大部分我们安装都是使用yum install xff0c 而d
  • 指针p,*p,&p之间的区别

    假设我们定义一个指针p 那么会经常使用到三个符号 xff1a 1 xff0c p xff1b p是一个指针变量的名字 xff0c 表示此指针变量指向的内存地址 xff0c 如果使用 p来输出的话 xff0c 它将是一个16进制数 2 xff
  • CMake&CMakeList.txt

    1 各种关系 在各种开源项目中 xff0c 经常会发现项目中除了代码源文件 xff0c 还包含了 CMakeList txt Makefile 文件 xff0c 在项目的编译时候需要用到的命令有 cmake make 我们本次想搞清楚他们之
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • 【STM32】 利用paho MQTT&WIFI 连接阿里云

    ST联合阿里云推出了云接入的相关培训 xff08 基于STM32的端到端物联网全栈开发 xff09 xff0c 所采用的的板卡为NUCLEO L4R5ZI板 xff0c 实现的主要功能为采集温湿度传感器上传到阿里云物联网平台 xff0c 并
  • C++编程(五)--- Cmake详解&Makefile详解

    C C 43 43 程序员肯定离不开Makefile和Cmake xff0c 因为如果对这两个工具不熟悉 xff0c 那么你就不是一个合格的C C 43 43 程序员 本文对Makefile和Cmake xff0c 及它们的使用进行了详细的
  • 【日志工具】g3log_6_ROS1中g3log的安装&使用

    ROS1中g3log的安装 amp 使用 基于ros1 melodic版本进行封装使用 g3log库安装 git clone https span class token operator span span class token com
  • 关于&&和||的优先级问题

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • 无人机拉力测试台研制&测试过程中的9个关键技术点

    随着近年来无人机行业的飞速迭代发展 xff0c 越来越多的相关从业人员选择使用拉力测试台来测试并优化无人机的动力系统 xff0c 本文尝试从无人机拉力测试台的研制和使用角度来阐述无人机拉力测试中的9个关键技术点 1 电磁干扰方面的考虑 测试
  • STM32 HAL库 STM3…

    原文地址 xff1a STM32 HAL库 STM32CUBEMX KEIL TIM1 PWM 四路输出可调 一 作者 xff1a 用户2797410335 硬件 xff1a TM32F407VET6 8M晶振 xff0c JLINK JT
  • JLINK给STM32下载的两种模式--jtag & sw连线及配置

    jtag线就不说了 xff0c 将jlink的Vref GND TMS TCK分别接至SW接口 对于STM32F103RCT6来说 xff1a TMS PA12 xff0c TCK PA14 关于KEIL MDK中的设置如下图所示就可以了
  • n&(1<<i)用法

    1 lt lt i 是将1左移i位 xff0c 即第i位为1 xff0c 其余位为0 xff1b 例如1 lt lt 2 则0001 gt 0100 n amp 1 lt lt i 是将左移i位的1与n进行按位与 xff0c 即为保留n的第
  • 超声波传感器(CH101&ch201) - Ⅱ

    文章目录 1 前言 2 目前官方发布的Horn有以下几种 3 超声波TOF传感器 VS 红外线传感器 4 开发评估套件 1 前言 上一篇简单的引入了CH101 CH201 这两种传感器 这种传感器使用的时候除了需要芯片外 还需要一个声学的
  • ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法

    作者丨人脸人体重建 来源丨人脸人体重建 编辑丨极市平台 极市导读 本文围绕3D人脸重建的评估方式进行了重新的思考和探索 作者团队通过构建新数据集RELAY xff0c 囊括了更丰富以及更高质量的脸部区域信息 xff0c 并借助新的流程对先前

随机推荐

  • 关于wince6.0 升级全年包的注意事项(作者:gooogleman)

    作者 xff1a gooogleman Email xff1a gooogleman 64 foxmail com 最近在S5pv210 wince6 0 系统定制上更新了几个包 xff0c 发现了一些微软更新补丁包的问题 xff0c 现在
  • 二级域名绑定二级目录的两种方法

    当用WordPress建站后 xff0c WordPress位于二级目录 xff08 v ar www html xff09 下 xff0c 进行域名解析时如何把域名解析到二级目录下 xff0c 网络上一般有两种方法 xff0c 一是利用接
  • PMP 真的没用吗?

    最近在备考2018 3 24 的pmp 认证考试 xff0c 有不少收获 xff0c 此前我曾在群里邀请大家一起备考 xff0c 一些人跳出来就说考这些有啥用 xff1f 干技术的把技术干好就行了 xff0c 技术人员最烦这些没点技术的项目
  • 一个嵌入式产品的从研发到量产的流程(作者:gooogleman@foxmail.com)

    作者 xff1a gooogleman 64 foxmail com 一个嵌入式产品的开发流程是 1 了解清楚客户需求 2 模具开发 3 硬件工程师准备硬件 xff0c 物料选型 xff0c 原理图 xff0c PCB和模具工程师商议PCB
  • 【电赛国赛备赛笔记】【赛题经验分享会】

    存在的问题 光流问题 起飞后定不住飞行过程中方向太偏光照度对飞行稳定性的影响纹理变化对飞行稳定性的影响 目前还没有很好的解决办法 xff0c 但如果不限制使用器材的话 xff0c 用双目摄像头可能可以解决问题 赛题准备 视觉方面的算法和代码
  • APM32f003替换STM32进行低成本系统开发

    STM32F003是基于Arm Cortex M0内核的32位MCU xff0c 工作电压为2 4 3 6V xff0c 主频48MHz xff0c 内置16KB Flash 定时器 ADC 通信接口 APM32F003系列主频与STM32
  • 【VSCode】Windows 下搭建 C++ 环境

    文章目录 Part I 预备知识Part II 搭建过程Part III 安装较高版本的MinGW Part I 预备知识 MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境 MinGW 收集了一系列免费的Windo
  • 路由器开发————概念理解

    区别 xff1a 静态ip 可以直接使用Internet上网的IP xff08 相当于公网IP xff09 pppoe 从运营商那里动态获取的静态IP的过程就是PPPOE 运营商为了提高他手上拥有的静态IP的利用率 xff0c 而做出的动态
  • 干了三年java外包,我转AI了....

    谈及到程序员外包这件事 xff0c 我想我是比较有发言权的一个 xff0c 即使我现在已经从一个外包公司的JAVA开发转行做人工智能算法 我是2018年毕业的 xff0c 一毕业找的第一份工作就是一家外包公司 xff0c 主要做的是承接甲方
  • 人工智能的算法有哪些?AI常用算法

    人工智能 xff08 AI xff09 是一个非常广泛的领域 xff0c 其中包含许多不同的算法和技术 以下是一些常见的人工智能算法 xff1a 人工智能的算法有哪些 xff1f 机器学习 xff08 Machine Learning xf
  • 卡尔曼滤波五个公式各个参数的意义

    卡尔曼滤波五个公式各个参数的意义 wccsu1994 2018 11 30 10 49 33 45928 收藏 218 分类专栏 xff1a 卡尔曼滤波 版权 系统的状态方程为 xff1a 这个状态方程是根据上一时刻的状态和控制变量来推测此
  • FutureTask 示例

    1 简单示例 2 泡茶 1 简单示例 创建 FutureTask FutureTask lt Integer gt futureTask 61 new FutureTask lt gt gt 1 43 2 创建并启动线程 Thread t1
  • Centos6.5下进行PHP版本升级

    统计插件 WP Statistics 要求PHP5 4以上 xff0c 可本机PHP为5 3 3 xff0c 无奈只有对服务器PHP进行升级 xff0c 遂写下本文 Step1 xff1a 查看安装服务器当前安装版本 php V Step2
  • 一段日子的结束, 也是一段日子的开始

    一个朋友说的 xff0c 一段日子的结束 xff0c 也是另一段日子的开始 也正是我现在的状态 xff0c 我结束了一段往事 xff0c 也因此开始了一段日子 xff0c 曾经的曾经已离我远去 昨天和好朋友聊天到很晚 xff0c 谈了很多
  • 岁月静好

    不是说马年会马上转运的 xff0c 是不是蛇年的时候前半年太幸福了 xff0c 用了太多的好人品 xff0c 各种奖学金 xff0c 各种申请中标 xff0c 各种荣誉 xff0c 然后我要还了 小猴子说我开始会依赖人了 xff0c 哈哈
  • STM32 中重定向printf 和 scanf

    uart c 如果使用 pragma import use no semihosting 则在MDK中不勾选use Microlib 当前代码直接重定向没使用 pragma import use no semihosting 故需要选择us
  • Ubuntu环境下Pixhawk原生固件PX4的编译

    Ubuntu下Pixhawk原生固件PX4的编译这个问题困扰了两天时间 xff0c 可能是博主脑力不够 xff0c 主要是环境搭建不起来 xff0c 主要原因应该是路径的原因 xff0c 最后在大师傅的帮助下还好成功将路径搭建好 xff0c
  • 远程连接虚拟机的Network error: Connection timed out问题

    MobaXterm远程连接虚拟机的Network error Connection timed out问题 我使用的是MobaXterm远程连接我使用VMware创建的虚拟机 更新一下 xff1a 如果出现这种问题 xff0c 极大可能是服
  • springboot项目接入天猫精灵

    springboot项目接入天猫精灵 最近工作需要使用到天猫精灵的语音功能 xff0c 大体是通过呼叫对应的 调用词 实现携带参数 xff0c 然后调用我项目中的接口 xff0c 以实现对应的业务 所以在此简单的记录下使用过程 实际上 xf
  • Lesson 9.2&9.3&9.4 黑箱:不可解释的深层神经网络&探索多层神经网络:层vsh(z)

    二 黑箱 xff1a 深层神经网络的不可解释性 首先从结构上来看 xff0c 多层神经网络比单层神经网络多出了 中间层 中间层常常被称为隐藏层 xff08 hidden layer xff09 xff0c 理论上来说可以有无限层 xff0c