神经网络+深度学习+增强学习

神经网络

像飞机的灵感来源于鸟类,雷达的灵感来源于蝙蝠,红外线的灵盖来源于蛇,而本文要讨论的神经网络灵感来源于我们自己,人类大脑的神经元结构。从神经元结构被提出,到时下火热的无以复加的深度神经网络,发展过程也可为一波三折。我们按照时间的顺序,对一些经典的神经网络模型进行整理:

M-P模型

40年代初心理学家 W.W.Mcculloch 和梳理逻辑家 W.Pitts 提出 M-P 模型,神经网络被引入到计算机领域当中,其最初起源的灵感就是人类大脑中的神经元,如下图:

生物学上具体的专业术语我们这里不展开描述,我们总结一下神经元结构的特点:

  • 每个神经元都是一个多输入单输出的信息处理单元;
  • 神经元输入分兴奋性输入和抑制性输入两种类型;
  • 神经元具有空间整合特性和阈值特性;
  • 神经元输入与输出间有固定的时滞,主要取决于突触延搁。

由此两位大牛提出了神经网络的早期M-P模型,如下图:

该模型的基本思想很简单,就是仿照神经元接受多个输入信号,由于突触的性质和突触强度不同,所以对神经元的影响程度不同,我们加上了权重的概念,其正负模拟了神经元中的兴奋和抑制作用,最后所有信号累加整合,其值为:

输入信号有了,神经元是否被激活,要看输入信号是否超过了某一阈值电位,如果被激活神经元输出脉冲,否则神经元不会输出信号,其过程如下函数:

当然这里我们也可以写成矩阵的形式
类似神经元结构的特点,经典的M-P模型的特点可以总结如下:

  1. 每个神经元都是一个多输入单输出的信息处理单元;
  2. 神经元输入分兴奋性输入和抑制性输入两种类型;
  3. 神经元具有空间整合特性和阈值特性;
  4. 神经元输入与输出间有固定的时滞,主要取决于突触延搁;
  5. 忽略时间整合作用和不应期;
  6. 神经元本身是非时变的,即其突触时延和突触强度均为常数。(神经网络中权重在训练结束后是固定的)

结合两个公式来看这几个特点:对于特点1,我们的公式有多个x输入信号,但我们的输出信号只有一个o;权重的正负体现了特点2中输入分兴奋和抑制;对于第3个特点,我们第2个公式中只有当输入信号的累加和超出电位阈值才会有输出;另外我们的公式只考虑了所有输入信号的整合,并没有去考虑时间整合(就是不管你信号早到晚到,只要到了都是好信号),体现了特性4和5。
随着M-P模型的提出,神经网络的研究有三次兴起,最近的一次就是随着卷积神经网络提出的深度学习的火热。

早期神经网络

M-P模型很简单,仅仅是一种单个神经元上的建模,并没有形成网络,没法去完成一些特定的任务。由此人们提出了神经网络的概念,而早期的研究,由于当时硬件水平和计算条件的限制,神经网络结构一般比较简单。

两层神经网络

由此1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络。他给它起了一个名字“感知器”(Perceptron)
其结构如下图:

这种简单的单层神经网络有点类似于逻辑回归,通过简单的权重训练,能够处理简单的线性分类问题,类似下图:

而对于非线性的分类问题(如经典的异或问题)却无能为力,后来研究人员也发现了这一点,神经网络研究遍进入了低谷期(好伤心TT)

三层神经网络(带有隐层)

问题总是用来解决的嘛,既然两层神经网络hold不住非线性分类问题,那么我们就加一层,称为隐含层,由此而来的三层神经网络如下图:

这种三层神经网络具有非常好的非线性分类效果,其计算公式如下:

当然啦,就像我们平时的逻辑回归模型一样,bias在模型中是必不可少的,所以我们在原有结构上加入偏置节点,结构图如下:

神经网络中偏置节点是默认存在的,而且它非常特殊,就是没有输入,并且会输出的后一层的所有节点。加入偏置节点后计算公式如下:(一般情况下,偏置节点不会被画出来)

与两层神经网络不同,理论证明三层神经网络能够无限逼近任意连续函数。这里我们不禁会有疑问,我们知道两层神经网络是线性分类问题,那么两个线性问题拼在一起为什么就可以解决非线性分类问题了呢?

上图很好的解释了我们的疑问。首先上图左侧部分可以看出,三层神经网络的决策分界非常平滑,而且分类的很好。而上图右侧部分展示了该图经过空间变换后的结果,我们可以看到输出层的决策分界仍然是直线,关键是,从输入层到隐含层时,发生了空间变换。
也就是说三层神经网络可以做非线性分类的关键便是隐含层的加入,通过矩阵和向量相乘,本质做了一次线性变换,使得原先线性不可分的问题变得线性可分。所以多层神经网络本质就是复杂函数的拟合。
现在三层神经网络结构定了,如何来进行网络的训练,这就需要用到反向传播算法(本质就是梯度下降,还说的这儿玄乎<-T->)

BP算法

上面我们提到两层神经网络,其中隐层的权值是需要我们学习的,而这个权值我们不能直接获取,所以我们利用输出层得到输出结果和期望输出的误差来间接调整隐层的权值。BP算法的学习过程由信号的正向传播和误差的反向传播两个过程组成。

  • 正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。
  • 反向传播时,将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。

下图展示了整个BP算法的信号流程图:

BP网络有三个要素:

  1. 网络拓扑结构
  2. 传递函数
  3. 学习算法

网络拓扑结构便是我们之前总结的两层神经网络结构,我们主要从传递函数和学习算法进行整理阐述下。

传递函数

首先什么是传递函数呢?请看下图:

图中是最基本的单个神经元的模型,针对于多个输入,我们会进行整合并利用一个非线性函数进行输出,函数的要求必须是可微单调递增函数,通常采用非线性变换函数———sigmoid函数也称S函数(形状),有单极性S型函数和双极性S型函数两种。
这里的非线性函数通常称为激活函数,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。常用的激活函数有ReLU,sigmoid,softmax等

  • 单极性S型函数定义如下:

    函数曲线图如下(似乎不够S。。)

  • 双极性S型函数定义如下:

    函数曲线图如下:

可以看出根据上面的S函数,我们会整合所有输入,输出一个新的值,从之前生物学的原理来看也就是说神经元是否被激活。

学习算法

学习算法是BP神经网络结构的核心,也是两层神经网络有一次兴起的重要原因,因为人们找到了如何去训练一个神经网络来达到我们预期的分类效果(拟合不同的非线性连续函数)。而BP算法(反向传播算法)的本质其实就是一种逐层梯度下降
我们以三层感知器为例,当网络输出与期望输出不一致时,存在误差E,定义如下:

将以上误差反向逐层展开(体现了反向传播算法中的反向含义)

最终我们展开到输入层如下:

根据上式我们发现误差E是的函数,我们发现调整权值可以改变误差E的大小,而调整权值的原则是使得误差不断减小。因此我们应该使得权值与误差的梯度下降成正比,如下:

其中值得注意的是表示学习效率,即权重调整的幅度。
我们可以看出对于权重的调整是从输出层逐层反传过来的,而且我们也发现我们在梯度下降的过程中需要求导,这也就是我们在最初要求传递函数可微的原因

深度神经网络

有三层神经网络,我们自然而然就会想到将神经网络加入更多层,扩展到深度神经网络,但是一个非常显著的问题就是参数的个数,比如之前我们的三层神经网络每层有1000个节点,那么我们需要调整的权值参数就达到了10^9量级,这问题限制了很大程度上限制了深度神经网络的发展。这就要把大哥叫出来帮忙了,就是近期一直火热的deep learning,由于本人在这方面也是门外汉,只从经典的卷积神经网络(CNN)进行一些归纳整理。

CNN的解决之道

根据网上的资料总结,CNN的核心点有三个:

  • 局部感知:形象地说,就是模仿你的眼睛,想想看,你在看东西的时候,目光是聚焦在一个相对很小的局部的吧?严格一些说,普通的多层神经网络,隐层节点会全连接到一个图像的每个像素点上,而在卷积神经网络中,每个隐层节点只连接到图像某个足够小局部的像素点上,从而大大减少需要训练的权值参数。我们用两张对比图来说明下:

    从图中我们可以看出,对于一张1000×1000像素的图片,假设神经网络中的隐节点有1M个。对于传统的深度神经网络,所有的隐节点会连接到图像中的每个像素点,那么我们需要训练的权重参数就达到了匪夷所思的10^12量级。而CNN提出局部感知,即图中右侧展示的,每个神经元只与10×10个像素值相连,那么我们的权重参数就下降到10^8,参数数量为原来的万分之一(虽然还是很多TT)

  • 权值共享:形象地说,就如同你的某个神经中枢中的神经细胞,它们的结构、功能是相同的,甚至是可以互相替代的。局部感知的方式在一定程度上减少了参数,那么另一个减少参数的神器便是权值共享。在上面我们提到的局部感知的例子中,对于1M个神经元,每个神经元需要局部感知10×10个像素点,那么参数个数是100×1M个,那么如果我们在这里假设每个神经元的权重参数都是相同的,那么我们的参数个数就会骤减到100个,很夸张对不拉,做到这一步的神器便是卷积操作。
    权值共享基于的原理或者说假设是图像中局部的统计特征与其他部分是一样的,也就意味着假设我们在图像的局部学习到了一组特征,那么我们可以直接将这组特征应用到图像的其它部分。就拿上面的例子来看,我们假设在第一个神经元中学习到了局部10×10像素点的特征,那么我们完全可以将这个特征应用在图像的其他位置上,那么我们另外的1M-1的神经元权重参数就不需要训练了,所以我们只需要训练第一个神经元的权重参数即可,而这第一个神经元得到的局部特征称为卷积核。当然啦,我们不会这么变态的只用一个卷积核,这样对于图像特征的提取也是不充分的,所以往往CNN中都会有多个卷积核来进行卷积操作,每个卷积核会提取出图像某一方面的特征。如下图展示了卷积操作的基本原理:

    图中展示了一个3×3的卷积核在5×5的图像上做卷积的过程。每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。

  • 池化:形象地说,你先随便看向远方,然后闭上眼睛,你仍然记得看到了些什么,但是你能完全回忆起你刚刚看到的每一个细节吗?不能(也没必要),我们通常会提取整个图像中一些关键的点作为一种“映像”放到脑海中。同样,在卷积神经网络中,通过卷积获得了特征之后,下一步我们需要利用这些特征去做分类,当然我们可以利用所有这些特征去做分类(如softmax分类器),但同样的这里又会遇到我们的老问题,计算量过大。所以,在进行分类之前,我们利用人类判别图片记录关键特征的原理,同样在处理卷积层输出的特征时,我们也可以做一些“压缩”或者说提取处理,这种方法被称为池化(Down-pooling)。以最大池化(Max Pooling)为例,1000×1000的图像经过10×10的卷积核卷积后,得到的是991×991的特征图(参考上图5×5图像经过卷及操作变成了3×3的图像),然后使用2×2的池化规模,即每4个点组成的小方块中,取最大的一个作为输出,最终得到的是496×496大小的特征图。池化得原理我们可以用下图形象的说明:

CNN整体结构

上面我们从CNN的三个核心点出发,阐述了CNN的基本原理,下图我们列出了CNN的整体结构:

图中从左至右描述了CNN神经网络的几个不同层

  • 输入层(图像):在CNN神经网络的输入当中,一般为了减少复杂度,往往采用灰度化后的图像作为输入,而如果使用RGB的彩色图像,那么输入会分为RGB三个分量图像。输入图像一般都需要归一化,常规的可以使用我们前面阐述的sigmoid函数,归一化到[0,1],如果使用tanh激活函数,则归一化到[-1, 1]。这一部分我们涉及到了我们上面阐述的局部感知的方式来减少参数。
  • 多个卷积(C)-下采样(S)层:将上一层的输出与本层权重W做卷积得到各个C层,然后下采样得到各个S层,这一部分主要涉及了我们上面阐述的三个核心点中的卷积和池化操作,而这些层的输出称为Feature Map。
  • 光栅化(X):是为了与传统的多层感知器全连接。即将上一层的所有Feature Map的每个像素依次展开,排成一列。
  • 传统的多层感知器(N&O):最后的分类器一般使用Softmax,如果是二分类,当然也可以使用逻辑回归LR。

至此关于CNN的基本原理基本阐述完毕啦,关于CNN的参数训练等内容这里不再赘述,可以参考Deep learning:五十一(CNN的反向求导及练习)

总结

~长出一口气~,从最一开始单个神经元模型的提出,到两层和三层的简单神经网络,再到时下火热的深度学习,我们可以用下图从时间上进行一个大致的梳理:

我们可以看到,神经网络的发展经历了三次跌宕起伏:

  • 感知器:第一次兴起的研究点便是科研人员利用两层神经网络(起了个玄乎的名字感知器)进行了简单的分类问题,当时的人们大呼找到了人工智能的奥秘,从而兴起了对神经网络的研究,但是随着众多学者发现两层感知器只能完成最简单的线性分类问题,对于经典的异或分类问题都无法完成时,神经网络陷入低谷。
  • BP算法:第二次兴起的关键点便是BP算法的提出,当人们发现两层神经网络无法胜任非线性分类问题时,已经想到了增加神经网络层数,但是随着网络层数的增加,权重参数如何训练的问题无法解决,直到BP反向传播算法的提出,解决了这一问题,从而发生了神经网络的又一次兴起。但是随之而来的其它算法,如SVM,等算法的提出,人们发现这些算法的通用性和可计算性都优于神经网络,神经网络进入到了第二次低谷。
  • 深度学习:第三次兴起的关键点便是时下火热的深度学习了,它的标致之一便是CNN卷积神经网络的提出,将它用于图像分类问题当中(当然了这也离不开硬件水平的提高,比如高并行的GPU诞生)。

而对于每次神经网络可解决的问题,我们可以用下图来阐述:

上图中我们可以看出,随着神经网络的发展,我们在解决最基本的分类问题时的效果越来越好,这也是神经网络的魅力所在啦^v^。当然在神经网络发展的过程当中,计算机硬件水平的发展也是不容忽视的,随着计算能力和性能的提高,原来不可能实现的想法、算法都能付诸实践进行试验。

增强学习

机器学习领域,我们都知道两位大哥就是监督学习和非监督学习,我们有样本X和标记或者未标记的Y,我们通过训练可以做一些分类或者聚类的任务。但是,对于一些序列决策或者控制问题,是很难得到上面那样的规则样本的,比如机器人的控制问题,决策机器人下一步该怎么走,那么这时我们就需要清楚另外一位大哥——增强学习,虽然他似乎曝光度并不是很高,那么何谓增强学习呢?
增强学习(Reinforcement Learning, RL),其英文定义如下:
Reinforcement learning is learning what to do ----how to map situations to actions ---- so as to maximize a numerical reward signal.[6]
也就是说增强学习关注的是智能体如何在环境中采取一系列行为,从而获得最大的累积回报
通过增强学习,一个智能体(agent)应该知道在什么状态下应该采取什么行为。RL是从环境状态到动作的映射的学习,我们把这个映射称为策略

马尔可夫决策过程(MDP)

一提到马尔科夫,大家通常会立刻想起马尔可夫链(Markov Chain)以及机器学习中更加常用的隐式马尔可夫模型(Hidden Markov Model, HMM)。它们都具有共同的特性便是马尔可夫性:当一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态;换句话说,在给定现在状态时,它与过去状态(即该过程的历史路径)是条件独立的,那么此随机过程即具有马尔可夫性质。具有马尔可夫性质的过程通常称之为马尔可夫过程。[7]
之后我们便来说说马尔可夫决策过程(Markov Decision Process),其也具有马尔可夫性,与上面不同的是MDP考虑了动作,即系统下个状态不仅和当前的状态有关,也和当前采取的动作有关。
用表格描述马尔可夫各个模型的关系(摘自[8])

基本定义

一个马尔可夫决策过程由五元组组成

  • S:表示状态集(states)
  • A:表示一系列动作(actions)
  • :表示状态转移概率。表示的是在当前s ∈ S状态下,经过a ∈ A作用后,会转移到的其他状态的概率分布情况。比如,在状态s下执行动作a,转移到s'的概率可以表示为p(s'|s,a)。
  • (dicount factor):表示阻尼系数[0,1)
  • R:,表示回报函数(reward function)
    MDP 的动态过程如下:某个智能体(agent)的初始状态为s0,然后从 A 中挑选一个动作a0执行,执行后,agent 按概率随机转移到了下一个s1状态,s1∈ 
    。然后再执行一个动作a1,就转移到了s2,接下来再执行a2…,我们可以用下面的图表示状态转移的过程。

    如果回报r是根据状态s和动作a得到的,则MDP还可以表示成下图:

值函数

上面我们给出了MDP的定义,作为一个智能体(agent),当它在决定下一步应该走什么时,最简单的方式就是看下Reward函数的值是多少,即比较走不同动作的回报,从而做出决定。但是就像下棋的时候,我们每走一步都会向后考虑,所谓“走一步看三步”,所以这里我们只看一步即一次Reward函数是不够的,这就引出了值函数(Value Function)也叫折算累积回报(discounted cumulative reward)。

状态值函数(state value function)

当我们遵循某个策略,我们将值函数定义如下:

我们将上面的式子写作递推的样子如下:

另外当策略,在状态s时,我们可以确定唯一的动作a,但是s经过动作a会进入哪个状态是不唯一的,比如同样是掷骰子操作,可能得到的状态有6种,那么利用Bellman等式我们便可以得到下面的公式:

再根据我们最初增强学习的目的,我们便可以得出,求V的目的就是想找到一个当前状态s下,最优的行动策略,表示如下:

动作值函数(action value function)

上面我们的值函数的只与状态s有关,如果与状态s和动作a都有关,便称为动作值函数,即所谓的Q函数,如下:

从上式我们可以看出,我们不仅仅依赖状态s和策略,并且还依赖于动作a。

综上我们可以将MDP的最优策略定义如下:

关于MDP的求解主要分为值迭代和策略迭代,分别站在不同的角度对MDP进行求解,这里我们不在赘述,网上有很多相关资料。下面我们简单阐述下动作值函数的值迭代求解方式,即所谓的Q-learning

Q学习

Q学习的基本迭代公式如下:

从公式中我们也可以看出它是一种值迭代方式,因为我们每次更新的是Q函数的值,而非策略。简单起见,整理一个简单的例子加以说明。
假设我们有这样一个房间:

我们的目的是训练一个机器人,使得它在图中的任意一个房间都能够到达房间外。
OK,我们对房间进行建模:

并得到reward矩阵:

通过一下过程的迭代我们最终得出了我们的结果Q矩阵

可以看出,我们的机器人现在无论在哪个房间,都可以利用我们的Q矩阵顺利的走到屋外。

噗噗噗,终于写到这里了,综上我们将马里奥只能AI需要用到的算法简单整理了下(如有任何谬误请指出^v^)。下面我们结合两种成熟的算法,归纳整理马里奥AI的两种实现方式。

参考文献:

  1. 漫谈ANN(1):M-P模型
  2. 漫谈ANN(2):BP神经网络
  3. 卷积神经网络
  4. 卷积神经网络全面解析
  5. 重磅!神经网络浅讲:从神经元到深度学习
  6. R.Sutton et al. Reinforcement learning: An introduction , 1998
  7. 马尔可夫性质
  8. 增强学习(二)----- 马尔可夫决策过程MDP
  9. 增强学习(三)----- MDP的动态规划解法
  10. 增强学习(Reinforcement Learning and Control)
  11. wiki-Q-learning
  12. Q-Learning example
  13. Stanley K O, Miikkulainen R. Evolving neural networks through augmenting topologies[J]. Evolutionary computation, 2002, 10(2): 99-127.
  14. Wang Y, Schreiber B. Creating a Traffic Merging Behavior Using NeuroEvolution of Augmenting Topologies[J]. 2015.
  15. Cussat-Blanc S, Harrington K, Pollack J. Gene regulatory network evolution through augmenting topologies[J]. IEEE Transactions on Evolutionary Computation, 2015, 19(6): 823-837.
  16. Mnih V, Kavukcuoglu K, Silver D, et al. Playing atari with deep reinforcement learning[J]. arXiv preprint arXiv:1312.5602, 2013.

神经网络+深度学习+增强学习相关推荐

  1. 机器学习的五大分类,监督学习 无监督学习 半监督学习 迁移学习 增强学习

    机器学习的五大分类,监督学习 无监督学习 半监督学习 迁移学习 增强学习@监督学习 无监督学习 半监督学习 监督学习 在监督学习中,给定一组数据,我们知道正确的输出结果应该是什么样子,并且知道在输入和 ...

  2. 深度学习:AI对抗学习比深度、增强学习能好多少

    人工智能中,或许对抗学习是继深度学习.增强学习之后下一个热点,但是,它只对中等难度的任务具有实用性,依然不能解开"迁移学习"(实际中不可行)所追求的那种像人一样跨越多个领域,具备所 ...

  3. 【强化学习】强化学习/增强学习/再励学习介绍

    Deepmind团队在17年12月5日发布的最新Alpha Zero中,非常重要的一种方法就是强化学习(reinforcement learning),又称再励学习.评价学习,是一种重要的机器学习方法 ...

  4. 区别:强化学习集成学习增强学习规则学习

    1.强化学习 强化学习是智能体(Agent)以"试错"的方式进行学习,通过与环境进行交互获得的奖赏指导行为,目标是使智能体获得最大的奖赏,强化学习不同于连接主义学习中的监督学习,主 ...

  5. matlab学习增强学习,使用 MATLAB 和 Simulink 进行强化学习

    请选择其一 Alabama Alaska 美属萨摩亚 APO/FPO AA APO/FPO AE APO/FPO AP Arizona Arkansas California Caroline Isl ...

  6. 专访微软邓力:语音识别与非监督深度学习、增强学习、词嵌入、类脑智能

    在俞栋接受CSDN专访解读基于深度学习的语音识别技术及CNTK开源软件的同时,<解析深度学习-语音识别实践>一书的另一位作者.微软人工智能首席科学家邓力也接受CSDN专访,以另外的视角诠释 ...

  7. 关于增强学习你应该了解的五件事儿

    摘要: 本文主要是讲解了机器学习中的增强学习方法的基本原理,常用算法及应用场景,最后给出了学习资源,对于初学者而言可以将其作为入门指南. 强化学习(Reinforcement Learning)是当前 ...

  8. 增强学习和OpeAI Gym的介绍:基础增强学习问题的演示

    编者注:想要深入学习增强学习,请查看Marcos Campos在2017年9月17 - 20日于旧金山举行的O'Reilly人工智能会议上所做的"增强学习介绍"辅导课.你可以在Ju ...

  9. 零和博弈下的逆增强学习

     这篇文章是个人用来水观点的,用不严谨的语言讨论两件事情,由于严格证明太长,数学都采用 hand-waving 方式的证明,大家意会思路便可,要讨论如下两件事情: 文本的生成对抗模型,下面简称文本 ...

最新文章

  1. 李德毅院士:未来交通——自动驾驶与智能网联
  2. OpenCL异构扩展
  3. linux大小写敏感和windows大小写不敏感(忽略大小写)导致的直接拷贝文件文件名冲突问题(需要打tar包再分享)
  4. 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
  5. 【填坑】博客搬家造成的博客重复问题
  6. php去除英文和标点,php 过滤英文标点符号及过滤中文标点符号代码_php技巧
  7. alv界面允许数字输入负号_在Excel中输入这些字符,我被虐哭了
  8. 初始activiti工作流引擎
  9. java用DFA实现脏词过滤以及用FileAlterationListenerAdaptor实现对资源文件修改的动态监听
  10. 防止电脑辐射必看 保护好你的肌肤 - 生活至上,美容至尚!
  11. 魔改部署自己专属的合成大西瓜(三:上线篇<踩坑篇>)
  12. PADS 管脚编号全部修改方式
  13. Flex JSP with HttpService
  14. vfp spt连接mysql_VFP与SQL远程异构数据库
  15. 基于Python的语音识别控制系统
  16. 金融分析python和r语言比较_金融领域R语言对比python
  17. element-UI设置背景色和边框色
  18. oracle的日期时间转换日期,oracle 的时间日期转换函数
  19. 软件测试之语音识别(ASR)测试
  20. 158 Linux中断基础概念

热门文章

  1. Word中下一页表格无法提到上一页,导致有一大段空白的解决办法
  2. revit二次开发创建桥架、线管
  3. MyApplication has stopped
  4. POJ1509 GlassBeads
  5. PACT: PARAMETERIZED CLIPPING ACTIVATION FOR QUANTIZED NEURAL NETWORKS
  6. FSL中FDT的相关操作——数据转换、EDDY、DTIFIT、BEDPOSTX、Registration
  7. js判断输入是否为数字
  8. 什么是 web 开发
  9. mysql增删改查 简称_mysql增删改查基本语句
  10. 第2集丨天才儿童的打油诗的一些思考