精华内容
下载资源
问答
  • CNN笔记:通俗理解卷积神经网络

    万次阅读 多人点赞 2016-07-02 22:14:50
    通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都其抱有巨大的热情。当我2013年再次来到北京时,有...

                   通俗理解卷积神经网络(cs231n与5月dl班课程笔记)

     

     

     

    1 前言

        2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机器学习”更火,那就是“深度学习”。

        本博客内写过一些机器学习相关的文章,但上一篇技术文章“LDA主题模型”还是写于2014年11月份,毕竟自2015年开始创业做在线教育后,太多的杂事、琐碎事,让我一直想再写点技术性文章但每每恨时间抽不开。然由于公司在不断开机器学习、深度学习等相关的在线课程,耳濡目染中,总会顺带着学习学习。

        我虽不参与讲任何课程(我所在公司“七月在线”的所有在线课程都是由目前讲师团队的100多位讲师讲),但依然可以用最最小白的方式 把一些初看复杂的东西抽丝剥茧的通俗写出来。这算重写技术博客的价值所在。

        在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒小阳讲的5月dl班所写,是一篇课程笔记。

        一开始本文只是想重点讲下CNN中的卷积操作具体是怎么计算怎么操作的,但后面不断补充,包括增加不少自己的理解,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。

     

     

    2 人工神经网络

    2.1 神经元

        神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

        举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在通过非线性激活函数进行非线性变换后,神经元被激活然后被传递到其他神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。

        神经网络的每个神经元如下

        基本wx + b的形式,其中

    • 表示输入向量
    • 为权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重
    • b为偏置bias
    • g(z) 为激活函数
    • a 为输出

        如果只是上面这样一说,估计以前没接触过的十有八九又必定迷糊了。事实上,上述简单模型可以追溯到20世纪50/60年代的感知器,可以把感知器理解为一个根据不同因素、以及各个因素的重要性程度而做决策的模型。

        举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有二个因素,这二个因素可以对应二个输入,分别用x1、x2表示。此外,这二个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。一般来说,音乐节的演唱嘉宾会非常影响你去不去,唱得好的前提下 即便没人陪同都可忍受,但如果唱得不好还不如你上台唱呢。所以,我们可以如下表示:

    • :是否有喜欢的演唱嘉宾。 = 1 你喜欢这些嘉宾, = 0 你不喜欢这些嘉宾。嘉宾因素的权重 = 7
    • :是否有人陪你同去。 = 1 有人陪你同去, = 0 没人陪你同去。是否有人陪同的权重 = 3。

        这样,咱们的决策模型便建立起来了:g(z) = g( * + * + b ),g表示激活函数,这里的b可以理解成 为更好达到目标而做调整的偏置项。

        一开始为了简单,人们把激活函数定义成一个线性函数,即对于结果做一个线性变化,比如一个简单的线性激活函数是g(z) = z,输出都是输入的线性变换。后来实际应用中发现,线性激活函数太过局限,于是人们引入了非线性激活函数。

    2.2 激活函数

        常用的非线性激活函数有sigmoid、tanhrelu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。

        sigmoid的函数表达式如下

        其中z是一个线性组合,比如z可以等于:b + * + *通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1

        因此,sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):

        也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0

        压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。

        举个例子,如下图(图引自Stanford机器学习公开课

        z = b + * + *,其中b为偏置项 假定取-30,都取为20

    • 如果 = 0  = 0,则z = -30,g(z) = 1/( 1 + e^-z )趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z=-30的时候,g(z)的值趋近于0
    • 如果 = 0 = 1,或 =1 = 0,则z = b + * + * = -30 + 20 = -10,同样,g(z)的值趋近于0
    • 如果 = 1 = 1,则z = b + * + * = -30 + 20*1 + 20*1 = 10,此时,g(z)趋近于1。

        换言之,只有都取1的时候,g(z)→1,判定为正样本;取0的时候,g(z)→0,判定为负样本如此达到分类的目的。

    2.3 神经网络

        将下图的这种单个神经元

        组织在一起,便形成了神经网络。下图便是一个三层神经网络结构

        上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。

        啥叫输入层、输出层、隐藏层呢?

    • 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
    • 输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
    • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

        同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。比如下图中间隐藏层来说,隐藏层的3个神经元a1、a2、a3皆各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2 a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。

        上图(图引自Stanford机器学习公开课)中

    • 表示第j层第i个单元的激活函数/神经元
    • 表示从第j层映射到第j+1层的控制函数的权重矩阵 

        此外,输入层和隐藏层都存在一个偏置(bias unit),所以上图中也增加了偏置项:x0、a0。针对上图,有如下公式

        此外,上文中讲的都是一层隐藏层,但实际中也有多层隐藏层的,即输入层和输出层中间夹着数层隐藏层,层和层之间是全连接的结构,同一层的神经元之间没有连接。

     

     

    3 卷积神经网络之层级结构

       cs231n课程里给出了卷积神经网络各个层级结构,如下图

        上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车

        所以

    • 最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。

        中间是

    • CONV:卷积计算层,线性乘积 求和。
    • RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
    • POOL:池化层,简言之,即取区域平均或最大。

        最右边是

    • FC:全连接层

        这几个部分中,卷积计算层是CNN的核心,下文将重点阐述。


    4 CNN之卷积计算层

    4.1 CNN怎么进行识别
       简言之,当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?一个可能的办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果二者一致,则判定未知图案即是一个"X"图案。

       而且即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,如下图所示 [图来自参考文案25]


    而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。卷积计算结果为1表示匹配,否则不匹配。

    具体而言,为了确定一幅图像是包含有"X"还是"O",相当于我们需要判断它是否含有"X"或者"O",并且假设必须两者选其一,不是"X"就是"O"。



    理想的情况就像下面这个样子:

    标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形

    对于计算机来说,只要图像稍稍有一点变化,不是标准的,那么要解决这个问题还是不是那么容易的:


    计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。

    但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。


    当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。

    对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:


    因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同,得出结论:


    但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:


    这也就是CNN出现所要解决的问题。

    Features


    对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。

    每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。


    这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下:






    看到这里是不是有了一点头目呢。但其实这只是第一步,你知道了这些Features是怎么在原图上面进行匹配的。但是你还不知道在这里面究竟进行的是怎样的数学计算,比如这个下面3*3的小块到底干了什么?


    这里面的数学操作,就是我们常说的“卷积”操作。接下来,我们来了解下什么是卷积操作。

    4.2 什么是卷积

        对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

        非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。

        OK,举个具体的例子。比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。

        分解下上图

    对应位置上是数字先相乘后相加 =

        中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8

    4.3 图像上的卷积

        在下图对应的计算过程中,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。

        具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

        如下图所示

      

     

    4.4 GIF动态卷积图

        在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数: 
      a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
      b. 步长stride:决定滑动多少步可以到边缘。

      c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。 

      这里写图片描述 

        cs231n课程中有一张卷积动图,貌似是用d3js 和一个util 画的,我根据cs231n的卷积动图依次截取了18张图,然后用一gif 制图工具制作了一gif 动态卷积图。如下gif 图所示

        可以看到:

    • 两个神经元,即depth=2,意味着有两个滤波器。
    • 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
    • zero-padding=1。

        然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

        如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

    • 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
    • 中间部分是两个不同的滤波器Filter w0、Filter w1
    • 最右边则是两个不同的输出

        随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

        值得一提的是:

    1. 左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
    • 打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。

    与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

    • 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。

        我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

        首先,我们来分解下上述动图,如下图

        接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:

    1* 0 + 1*0 + -1*

    +

    -1*0 + 0*0 + 1*1

    +

    -1*0 + -1*0 + 0*1

     

    +

    -1*0 + 0*0 + -1*0

    +

    0*0 + 0*1 + -1*1

    +

    1*0 + -1*0 + 0*2

     

    +

    0*0 + 1*0 + 0*0

    +

    1*0 + 0*2 + 1*0

    +

    0*0 + -1*0 + 1*0

     

    +

     

    1

    =

    1

        然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果

        最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

     

     

    5 CNN之激励层与池化层

    5.1 ReLU激励层

        2.2节介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下

        ReLU的优点是收敛快,求梯度简单。

    5.2 池化pool层

        前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)

        上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。很简单不是?

     

     

    6 后记

        本文基本上边看5月dl班寒讲的CNN视频边做笔记,之前断断续续看过不少CNN相关的资料(包括cs231n),但看过视频之后,才系统了解CNN到底是个什么东西,作为听众 寒讲的真心赞、清晰。然后在写CNN相关的东西时,发现一些前置知识(比如神经元、多层神经网络等也需要介绍下),包括CNN的其它层次机构(比如激励层),所以本文本只想简要介绍下卷积操作的,但考虑到知识之间的前后关联,所以越写越长,便成本文了。

        此外,在写作本文的过程中,请教了我们讲师团队里的寒、冯两位,感谢他两。同时,感谢爱可可老师的微博转发,感谢七月在线所有同事。

    以下是修改日志:

    • 2016年7月5日,修正了一些笔误、错误,以让全文更通俗、更精准。有任何问题或槽点,欢迎随时指出。
    • 2016年7月7日,第二轮修改完毕。且根据cs231n的卷积动图依次截取了18张图,然后用制图工具制作了一gif 动态卷积图,放在文中4.3节。
    • 2016年7月16日,完成第三轮修改。本轮修改主要体现在sigmoid函数的说明上,通过举例和统一相关符号让其含义更一目了然、更清晰。
    • 2016年8月15日,完成第四轮修改,增补相关细节。比如补充4.3节GIF动态卷积图中输入部分的解释,即7*7*3的含义(其中7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)。不断更易懂。
    • 2016年8月22日,完成第五轮修改。本轮修改主要加强滤波器的解释,及引入CNN中滤波器的通俗比喻。

        July、最后修改于二零一六年八月二十二日中午于七月在线办公室。

     


    7 参考文献及推荐阅读

    1. 人工神经网络wikipedia
    2. 斯坦福机器学习公开课
    3. http://neuralnetworksanddeeplearning.com/
    4. 雨石 卷积神经网络:http://blog.csdn.net/stdcoutzyx/article/details/41596663
    5. cs231n 神经网络结构与神经元激励函数:http://cs231n.github.io/neural-networks-1/中译版
    6. cs231n 卷积神经网络:http://cs231n.github.io/convolutional-networks/
    7. 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
    8. 七月在线5月深度学习班第5课CNN训练注意事项部分视频:https://www.julyedu.com/video/play/42/207
    9. 七月在线5月深度学习班:https://www.julyedu.com/course/getDetail/37
    10. 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:http://blog.csdn.net/joycewyj/article/details/51792477
    11. 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
    12. 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50100367
    13. 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:http://blog.csdn.net/han_xiaoyang/article/details/50447834
    14. 深度学习与计算机视觉系列(10)_细说卷积神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50542880
    15. zxy 图像卷积与滤波的一些知识点:http://blog.csdn.net/zouxy09/article/details/49080029
    16. zxy 深度学习CNN笔记:http://blog.csdn.net/zouxy09/article/details/8781543/
    17. http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/中译版
    18. 《神经网络与深度学习》中文讲义:http://vdisk.weibo.com/s/A_pmE4iIPs9D
    19. ReLU与sigmoid/tanh的区别:https://www.zhihu.com/question/29021768
    20. CNN、RNN、DNN内部网络结构区别:https://www.zhihu.com/question/34681168
    21. 理解卷积:https://www.zhihu.com/question/22298352
    22. 神经网络与深度学习简史:1 感知机和BP算法4 深度学习的伟大复兴
    23. 在线制作gif 动图:http://www.tuyitu.com/photoshop/gif.htm
    24. 支持向量机通俗导论(理解SVM的三层境界)
    25. CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象,甚赞。
    展开全文
  • 深入理解AlexNet网络

    万次阅读 多人点赞 2018-08-16 22:44:14
    AlexNet 论文:《ImageNet ...第一个典型的CNN是LeNet5网络结构,但是第一个引起大家注意的网络却是AlexNet,也就是文章《ImageNet Classification with Deep Convolutional Neural Networks》介绍的网络结...

    AlexNet

    论文:《ImageNet Classification with Deep Convolutional Neural Networks》

    第一个典型的CNN是LeNet5网络结构,但是第一个引起大家注意的网络却是AlexNet,也就是文章《ImageNet Classification with Deep Convolutional Neural Networks》介绍的网络结构。这篇文章的网络是在2012年的ImageNet竞赛中取得冠军的一个模型整理后发表的文章。作者是多伦多大学的Alex Krizhevsky等人。Alex Krizhevsky其实是Hinton的学生,这个团队领导者是Hinton,那么Hinton是谁呢?这就要好好说说了,网上流行说 Hinton, LeCun和Bengio是神经网络领域三巨头,LeCun就是LeNet5作者(Yann LeCun),昨天的文章就提到了这个人。而今天的主角虽然不是Hinton,但却和他有关系,这篇的论文第一作者是Alex,所以网络结构称为AlexNet。这篇论文很有意思,因为我读完这篇论文之后,没有遇到比较难以理解的地方,遇到的都是之前学过的概念,比如Relu,dropout。之前学的时候只知道Relu是怎么一回事,今天才知道它真正的来源。这篇文章在2012年发表,文章中的模型参加的竞赛是ImageNet LSVRC-2010,该ImageNet数据集有1.2 million幅高分辨率图像,总共有1000个类别。测试集分为top-1和top-5,并且分别拿到了37.5%和17%的error rates。这样的结果在当时已经超过了之前的工艺水平。AlexNet网络结构在整体上类似于LeNet,都是先卷积然后在全连接。但在细节上有很大不同。AlexNet更为复杂。AlexNet有60 million个参数和65000个 神经元,五层卷积,三层全连接网络,最终的输出层是1000通道的softmax。AlexNet利用了两块GPU进行计算,大大提高了运算效率,并且在ILSVRC-2012竞赛中获得了top-5测试的15.3%error rate, 获得第二名的方法error rate 是 26.2%,可以说差距是非常的大了,足以说明这个网络在当时给学术界和工业界带来的冲击之大。

    一些背景

    在计算机视觉领域object detection & recognition 通常用机器学习的方法来解决。为了提高识别的效果,我们可以通过收集更多的可训练的数据来让模型的泛化性能提高。目前,在以一万为单位的数量级层面的数据(称为简单的识别任务)已经获得了非常好的性能,例如:MNIST 手写数字识别任务,最好的性能已经达到了<0.3%的误差。但是现实中的物体存在相当多的变化属性,所以学习识别它们需要更多的数据。事实上,小的图像训练数据有很多的缺点,无论以我们的直觉想还是理论证明都是有依据的,理论上论文《Why is real-world visual object recognition hard?》给出了研究方法。随着互联网技术的发展,以及智能手机的普及图像数据获取可以说越来越容易。所以就有组织去收集这些现实中事物的图像并进行标记和分割。例如:LabelMe(Labelme: a database and web-based tool for image annotation. ),包含了成百上千的全分割图像。 ImageNet(ImageNet: A Large-Scale Hierarchical Image Database. I),包含15 million 标记的高分辨率图像,包含超过了22000种现实中的事物。

    文章中说该模型有5层卷积,去掉任意一层都会使结果不好,所以这个网络的深度似乎是很重要的,这样的话难免引起我们的思考,记得不知道哪位大神在一篇论文中证明了,神经网络可以模拟任意多项式,只要神经元数量足够多,并且和深度关系不大。但这里的实验却表示深度会对网络的性能有影响。

    文章中还提到了,他们用5-6天训练了这个模型,并且限制了网络的大小,因为现有的硬件智能允许那么大的内存,用更好的设备还可以获得更好的效果。

    网络结构

    AlexNet 的网络结构是这样的,为啥我感觉这样表示的网络很丑呀,哈哈。

    感觉这个网络很复杂呀,需要怎么理解好呢?首先这幅图分为上下两个部分的网络,论文中提到这两部分网络是分别对应两个GPU,只有到了特定的网络层后才需要两块GPU进行交互,这种设置完全是利用两块GPU来提高运算的效率,其实在网络结构上差异不是很大。为了更方便的理解,我们假设现在只有一块GPU或者我们用CPU进行运算,我们从这个稍微简化点的方向区分析这个网络结构。网络总共的层数为8层,5层卷积,3层全连接层。

    第一层:卷积层1,输入为 224×224×3224 \times 224 \times 3的图像,卷积核的数量为96,论文中两片GPU分别计算48个核; 卷积核的大小为 11×11×311 \times 11 \times 3; stride = 4, stride表示的是步长, pad = 0, 表示不扩充边缘;
    卷积后的图形大小是怎样的呢?
    wide = (224 + 2 * padding - kernel_size) / stride + 1 = 54
    height = (224 + 2 * padding - kernel_size) / stride + 1 = 54
    dimention = 96
    然后进行 (Local Response Normalized), 后面跟着池化pool_size = (3, 3), stride = 2, pad = 0 最终获得第一层卷积的feature map
    最终第一层卷积的输出为

    第二层:卷积层2, 输入为上一层卷积的feature map, 卷积的个数为256个,论文中的两个GPU分别有128个卷积核。卷积核的大小为:5×5×485 \times 5 \times 48; pad = 2, stride = 1; 然后做 LRN, 最后 max_pooling, pool_size = (3, 3), stride = 2;

    第三层:卷积3, 输入为第二层的输出,卷积核个数为384, kernel_size = (3×3×2563 \times 3 \times 256), padding = 1, 第三层没有做LRN和Pool

    第四层:卷积4, 输入为第三层的输出,卷积核个数为384, kernel_size = (3×33 \times 3), padding = 1, 和第三层一样,没有LRN和Pool

    第五层:卷积5, 输入为第四层的输出,卷积核个数为256, kernel_size = (3×33 \times 3), padding = 1。然后直接进行max_pooling, pool_size = (3, 3), stride = 2;

    第6,7,8层是全连接层,每一层的神经元的个数为4096,最终输出softmax为1000,因为上面介绍过,ImageNet这个比赛的分类个数为1000。全连接层中使用了RELU和Dropout。

    上面的结构是假设在一块GPU上面的,和论文的两块GPU有差别,但是为了方便理解,还是采用越简单的结构越好。

    ReLU Nonlinearity(Rectified Linear Unit)

    标准的L-P神经元的输出一般使用tanh 或 sigmoid作为激活函数, tanh(x)=sinhxcoshx=exexex+extanh(x) = \frac{sinhx}{coshx} = \frac{e^x - e^{-x}}{e^x + e^{-x}}, sigmoid: f(x)=11+exf(x) = \frac{1}{1 + e^{-x}}。但是这些饱和的非线性函数在计算梯度的时候都要比非饱和的现行函数f(x)=max(0,x)f(x) = max(0, x)慢很多,在这里称为 Rectified Linear Units(ReLUs)。在深度学习中使用ReLUs要比等价的tanh快很多。


    上图是使用ReLUs和tanh作为激活函数的典型四层网络的在数据集CIFAR-10s实验中,error rate收敛到0.25时的收敛曲线,可以很明显的看到收敛速度的差距。虚线为tanh,实线是ReLUs。

    Local Response Normalization(局部响应归一化)

    在神经网络中,我们用激活函数将神经元的输出做一个非线性映射,但是tanh和sigmoid这些传统的激活函数的值域都是有范围的,但是ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化。也就是Local Response Normalization。局部响应归一化的方法如下面的公式:

    b(x,y)i=a(x,y)i(k+αj=max(0,in/2)min(N1,i+n/2)(a(x,y)j)2)βb^{i}_{(x, y)} = \frac{a^{i}_{(x, y)}}{(k + \alpha \sum\limits_{j = max(0, i - n / 2)}^{min(N-1, i+n / 2)}(a^j_{(x, y)})^2)^{\beta}}

    这个公式什么意思呢?a(x,y)ia^i_{(x, y)}代表的是ReLU在第i个kernel的(x, y)位置的输出,n表示的是a(x,y)ia^i_{(x, y)}d的邻居个数,N表示该kernel的总数量。b(x,y)ib^i_{(x,y)}表示的是LRN的结果。ReLU输出的结果和它周围一定范围的邻居做一个局部的归一化,怎么理解呢?我觉得这里有点类似域我们的最大最小归一化,假设有一个向量X=[x1,x2,...,xn]X = [x_1,x_2, ... ,x_n]
    那么将所有的数归一化到0-1之间的归一化规则是:xi=xixminxmaxxminx_i = \frac{x_i - x_{min}}{x_{max} - x_{min}}
    上面那个公式有着类似的功能,只不过稍微复杂一些,首先运算略微复杂,其次还有一些其他的参数α,β,k\alpha, \beta, k

    我们看上图,每一个矩形表示的一个卷积核生成的feature map。所有的pixel已经经过了ReLU激活函数,现在我们都要对具体的pixel进行局部的归一化。假设绿色箭头指向的是第i个个kernel对应的map,其余的四个蓝色箭头是它周围的邻居kernel层对应的map,假设矩形中间的绿色的pixel的位置为(x, y),那么我需要提取出来进行局部归一化的数据就是周围邻居kernel对应的map的(x, y)位置的pixel的值。也就是上面式子中的a(x,y)ja^j_{(x, y)}。然后把这些邻居pixel的值平方再加和。乘以一个系数α\alpha再加上一个常数k,然后β\beta次幂,就是分母,分子就是第i个kernel对应的map的(x, y)位置的pixel值。这样理解之后我感觉就不是那么复杂了。

    关键是参数α,β,k\alpha, \beta, k如何确定,论文中说在验证集中确定,最终确定的结果为:
    k=2,n=5,α=104,β=0.75k=2, n=5, \alpha=10^{-4}, \beta = 0.75

    Overlapping Pooling(覆盖的池化操作)

    一般的池化层因为没有重叠,所以pool_size 和 stride一般是相等的,例如8×88\times 8的一个图像,如果池化层的尺寸是2×22 \times 2,那么经过池化后的操作得到的图像是 4×44 \times 4大小,这种设置叫做不覆盖的池化操作,如果 stride < pool_size, 那么就会产生覆盖的池化操作,这种有点类似于convolutional化的操作,这样可以得到更准确的结果。在top-1,和top-5中使用覆盖的池化操作分别将error rate降低了0.4%和0.3%。论文中说,在训练模型过程中,覆盖的池化层更不容易过拟合。

    Overall Architecture

    用caffe 自带的绘图工具(caffe/python/draw_net.py) 和caffe/models/bvlc_alexnet/目录下面的train_val.prototxt绘制的网络结构图如下图


    这张图也是单个GPU的网络结构,不是两个GPU的网络结构。

    防止过拟合的方法

    神经网络的一个比较严重的问题就是过拟合问题,论文中采用的数据扩充和Dropout的方法处理过拟合问题。

    Data Augmentation(数据扩张,就是对原始数据做一些变化)

    数据扩充是防止过拟合的最简单的方法,只需要对原始的数据进行合适的变换,就会得到更多有差异的数据集,防止过拟合。

    Dropout

    Dropout背后有很多有意思的东西,但是在这里我们不需要了解太深,只需要知道Dropout是在全连接层中去掉了一些神经节点,达到防止过拟合的目的,我们可以看上面的图在第六层和第七层都设置了Dropout。关于DropOut的理解,推荐一篇文章

    Reference

    1. AlexNet 原始论文
    2. caffe AlexNet
    3. dropout 理解
    4. 机器学习进阶笔记之三|深入理解Alexnet
    展开全文
  • OSI网络模型的理解

    千次阅读 2017-07-12 23:00:15
    对于OSI参考模型来说之前只知道有几层,分别是什么,但是对于为什么这样分,以及它们之间的关系和对应执行的功能并不是很清楚。从今天开始进行计算机网络部分的总结与巩固,第一篇:OSI网络模型的理解

    对于OSI参考模型来说之前只知道有几层,分别是什么,但是对于为什么这样分,以及它们之间的关系和对应执行的功能并不是很清楚。从今天开始进行计算机网络部分的总结与巩固,第一篇:对OSI网络模型的理解。

    OSI参考模型

    对于网络通信而言,是信息从一个主机发送到另一个主机的过程,其中每一个主机的信息都会经历这么7层处理,分别是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。每个层次完成不同的功能,各层之间相互协作完成整个网络通信工作。其实这个模型只是我们提出来的一个理论结果,在市场上或者是在实际中,却不一定是成功的,但是在对于帮助我们理解网络工作中OSI模型算是对我们理解起来帮助很大的。

    这里写图片描述

    通信过程

    用两个主机A,B通信举例,中间通过一个中间系统,比如说是路由器互连,如图:

    这里写图片描述

    主机要完成整个七层的功能,中间系统只需要完成三层的功能。

    按照层次结构来看,对等层次之间会遵循相关层次的协议进行数据交换,规定了这个层次如何去构造数据,交换数据,但是数据信息并不是直接在对等层之间进行交流,而是要借助一些物理介质来传播,比如光信号,电信号或是电磁波这种,所以最终通信是离不开物理介质的。如图:

    这里写图片描述

    但是在这么一个模型中,信息具体是怎么交流的呢?比如我们从A主机要发送信息到B主机,需要经历这么一个过程:A主机将信息处理依次经过应用层,表示层一直到物理层,物理层将信息传到中间系统,然后将信息往上层还原一直到网络层,网络层进一步明确数据的下一步传输然后将数据给下层的链路进而给物理层,通过主机B的物理层往上还原至应用层。

    这里写图片描述

    协议中定义的是对等层之间的数据交换,在图中直观的能看到对应层之间有协议连接,但是其实数据还是经过了我们刚才描述的那个过程,而不是直接对应层之间的数据交换。就比如说我们给一个人写信,直观上来看就是我们手中的信直接到了对方手中,但是其中还是经过了邮政系统的一个处理过程。所以协议是对等的,但是数据传输是纵向的。

    具体传输过程:主机A将数据给应用层,应用层根据网络应用,应用层协议的不同,会在用户数据后加上应用层头,这就构成了一个协议数据单元(A-PDU),信息到了表示层会加上这一层的头部信息构成表示层的协议数据单元进一步交给会话层,按照这样的思想会话层加上头部给传输层,传输层加上头部给网络层,数据到了数据链路层,会在原本信息中加头加尾作为链路层的协议数据单元交给物理层,这里所有数据被呈现成了比特单元。这个比特流会在物理介质中传播到目的主机,目的主机物理层接收到信息后传递给链路层会识别出附加的数据单元信息去除后给网络层头部,这样的过程一直持续到应用层,还原出了原始数据给主机B利用。

    这里写图片描述

    在上述过程中数据为什么要进行一层一层的封装然后给下一层?

    增加控制信息(地址信息,差错检测编码,协议控制)

    各层功能

    物理层:简单来说就是通过传输介质,实现每一个比特的传输,当然了具体一点有下面几个方面:

    • 规范接口特性(机械特性,电气特性,功能特性,规程特性)
    • 解决比特编码问题
    • 定义数据率
    • 解决比特同步问题(时钟同步)
    • 定义传输模式(单工,半双工,全双工)

    数据链路层:负责结点-结点之间的数据传输,是以帧为单位的数据传输。要解决组帧的问题需要在这一层进行加头加尾的工作。组帧的主要目的在于接受信息的一端在收到比特流的时候能够成功的切分出帧信息以及头部信息。还可以完成物理寻址的功能,在帧头中增加发送端/接收端的物理地址标识数据帧的发送端/接收端。

    网络层:负责源主机到目的主机数据分组交付,进行逻辑寻址(全局唯一逻辑地址,确保数据分组被送达目的主机,如IP地址。解决路由问题(路径选择)。分组转发。

    • 分段与重组
    • SAP寻址(确保将完整报文提交给正确进程,如端口号)
    • 连接控制
    • 流量控制
    • 差错控制

    会话层:组织两个会话之间的通信。

    • 对话控制(建立,维护)
    • 同步(在数据流中插入“同步点”)

    表示层:处理两个系统间交换信息的语法与语义问题,对上层数据或信息进行变换处理,使一个主机的应用层信息可以被另一个主机的应用程序理解。

    • 数据表示转化(转换为主机独立的编码)
    • 加密/解密
    • 压缩/解压缩

    应用层:支持用户通过用户代理(如浏览器)或网络接口使用网络服务。

    典型的应用层服务有:

    • 文件传输(FTP)
    • 电子邮件(SMTP)
    • Web(HTTP)
    • ……

    总结

    这就是OSI七层模型结构,每个层次完成不同功能,相邻层次之间通过接口完成数据上下传递,对等层次之间遵循协议来交换网络数据单元。

    展开全文
  • 对网络应用层的理解(一)

    千次阅读 2017-07-13 22:03:38
    上一篇博客中从OSI模型出发讲了总体上面的各层功能,今天从应用层开始来具体讲述每一层的理解。第二篇:对网络应用层的理解(一)。

    上一篇博客中从OSI模型出发讲了总体上面的各层功能,今天从应用层开始来具体讲述每一层的理解。第二篇:对网络应用层的理解(一)。

    网络应用体系结构

    • 客户机/服务器结构(C/S)
    • 点对点结构(P2P)
    • 混合结构(Hybrid)

    C/S结构:按照功能不同将主机划分为客户机和服务器,服务器用来提供服务,客户机使用服务器提供的服务。

    服务器:

    • 7*24小时提供服务
    • 永久性访问地址/域名
    • 利用大量服务器实现可扩展性

    客户机:

    • 与服务器通信,使用服务器提供服务
    • 间歇性接入网络
    • 可能使用动态IP地址
    • 不会与其他客户机直接通信

    例如:

    这里写图片描述

    P2P结构:例如文件共享下载服务

    特点:

    • 没有永远在线的服务器
    • 任意端系统/节点之间可以直接通讯
    • 节点间歇性接入网络
    • 节点可能改变IP地址

    混合结构:Napster(一款可以在网络中下载自己想要的MP3文件的软件。它同时能够让自己的机器也成为一台服务器,为其它用户提供下载。)

    • 文件传输使用P2P结构
    • 文件的搜索采用C/S结构-集中式

    这里写图片描述

    进程间通信:socket

    同一主机上运行的进程之间通信:进程间通信机制/操作系统提供

    不同主机上运行的进程之间通信:消息交换/报文交换

    socket:操作系统提供的一种抽象,将网络硬件基础设施以及网络协议栈,比如说链路层,网络层,传输层抽象为一个叫socket套接字的东西。如下图:进程间通信利用socket发送/接受消息实现

    这里写图片描述

    HTTP协议

    web应用遵循HTTP协议(HyperText Transfer Protocol),采用C/S结构,是一个无状态协议,也就是说服务器不维护任何有关客户端过去所发请求的消息,使用TCP传输服务,具体如下:

    • 服务器在80端口等待客户的请求
    • 浏览器发起到服务器的TCP连接(创建套接字Socket)
    • 服务器接受来自浏览器的TCP连接
    • 浏览器与web服务器交换http消息
    • 关闭TCP连接

    HTTP连接的两种类型

    非持久化连接(HTTP1.0版本使用,每个TCP连接最多允许传输一个对象)

    持久化连接(HTTP1.1版本使用,每个TCP连接允许传输多个对象)

    HTTP消息

    请求消息格式:method-请求方法,url-请求路径,version-版本号

    这里写图片描述

    对比get和post请求方法

    GET POST
    参数携带在url的后面 url不携带参数
    效率高 效率低
    能够被缓存 默认不会被缓存
    数据量小 数据量大
    产生一个tcp数据包(header+data) 产生两个tcp数据包(先发送header,再发送data)

    响应消息格式

    这里写图片描述

    其中两个时间点:Date(Date头域表示消息发送的时间,服务器响应中要包含这个头部,因为缓存在评估响应的新鲜度时要用到,其时间的描述格式由RFC822定义)Last-Modified(WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等)

    响应状态码

    1XX 表示请求已经接收,继续处理
    2XX 请求被正常处理
    3XX 表明浏览器要执行某种附加操作以完成请求
    4XX 客户端发生错误
    5XX 服务器发生错误

    常用状态码

    200 表示客户端请求成功
    301 永久性重定向
    302 临时性重定向
    304 从客户端的缓存中取资源
    400 客户端请求有语法错误
    401 请求需要认证
    403 服务端拒绝服务
    404 找不到对应资源
    500 服务器端发生故障
    503 服务器正在维护

    cookie技术

    由服务端产生保存在客户端,用来跟踪用户会话,弥补http协议无状态的不足。某些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。

    cookie的原理

    这里写图片描述

    这里通过这个图大致描述一下过程:假设有一个从未访问过亚马逊网站的用户访问该网站,这里浏览器本身在cookie文件中有一条信息叫做ebay:8734,这个我们先不管它。客户端第一次访问服务器的时候使用的是常规访问方法,也就是不携带任何cookie信息的。服务器第一次接受请求后发现这个用户是第一次访问的,于是服务器给这个用户创建了一个ID:1678,然后将这个用户的信息以及ID一起存储在数据库中记录下来。当服务器给客户机第一次返回时,在常规响应行基础上加上set-cookie:1678返回,浏览器收到响应时,会将这段信息解析出来并且给自己的cookie文件中加上用户在这个网站上的唯一标识号1678。当用户在一次访问时,会携带它的cookie信息1678请求,服务器再一次收到请求后会识别出该用户,然后可以做一些面向这个用户的特殊行为,比如说我在这个网站上买东西,这时候就会识别出我买过什么,然后给出相似的物品推荐。再相隔一周或者更长时间,只要我的cookie有效,那么再次访问这个网站时,还会重复上述第二次的过程。

    所以这也就不得不提出cookie的弊端,最大的弊端就是 隐私问题,还拿上面购物的例子举例,一些非法的商家可能会时不时推送一些广告或者是其他信息给用户,造成个人隐私的泄露,导致不安全问题。

    cookie的字段

    name cookie名称
    value cookie的值
    domain cookie的域名,默认为请求的地址
    path cookie的页面路径
    size cookie的大小
    expires cookie的过期日期
    secure cookie安全
    httponly cookie的读写性

    web缓存技术

    我在之前的博客中 写过,这里就不再具体总结了,详情:http://blog.csdn.net/shenmill/article/details/71080926

    展开全文
  • 复杂网络简单理解

    万次阅读 多人点赞 2017-11-28 09:42:18
    普通人而言,在媒体上看到复杂网络,首先想到的是互联网,实际上网络已经成为Internet的代名词,确实Internet从只有几个结点的简单的网络,发展到今天Internet的用户已经数以亿计,即使不考虑终端用户,路由器的...
  • 简单理解LSTM神经网络

    万次阅读 多人点赞 2018-08-17 14:23:34
    简单理解LSTM神经网络   https://blog.csdn.net/shijing_0214/article/details/52081301   递归神经网络 在传统神经网络中,模型不会关注上一时刻的处理会有什么信息可以用于下一时刻,每一次都只会关注当前...
  • 网络协议理解(一)IP 网络协议理解(三)TCP协议 网络协议理解(三)UDP协议 网络协议理解(四)TCP协议与UDP协议的区别(详解) ---- 面向字节流?面向报文? IP协议三个定义: IP定义了在TCP/...
  • amp;see_lz=1# 先从回归(Regression)问题说起。我在本吧已经看到不少人...具体地说,要让机器观察什么是圆的,什么是方的,区分各种颜色和形状,然后根据这些特征某种事物进行分类或预测。其实这就是回归问题。 ...
  • 两层网络、三层网络理解

    万次阅读 多人点赞 2018-04-27 13:52:35
    对于搞IT的同行而言,大部分人都不会直接和网络打交道,因此除非从事网络开发,否则对网络内部机制也不会太关心,但是明白网络数据是怎么走的,这每个IT工程师应该是很重要的基础知识。网络数据包如何在网络上游荡...
  • 网络功能虚拟化NFV

    万次阅读 多人点赞 2019-05-07 21:21:07
    网络功能虚拟化(NFV)技术是为了解决现有专用通信设备的不足而产生的。通信行业为了追求设备的高可靠性、高性能,往往采用软件和硬件结合的专用设备来构建网络。比如专用的路由器、CDN、DPI、防火墙等设备,均为...
  • 简单理解与实验生成对抗网络GAN

    万次阅读 多人点赞 2017-05-26 21:31:49
    之前GAN网络是近两年深度学习领域的新秀,火的不行,本文旨在浅显理解传统GAN,分享学习心得。现有GAN网络大多数代码实现使用python、torch等语言,这里,后面用matlab搭建一个简单的GAN网络,便于理解GAN原理。GAN...
  • 计算机网络之我见-通俗理解计算机网络(一)

    千次阅读 多人点赞 2018-07-29 19:52:45
    采用某些MVC框架写好程序打包部署到tomcat等容器中就能写出功能强大的“XX管理系统”,然而如果需要编写那些自己制定协议的基于tcp/udp的网络服务程序,理解计算机网络的基本工作原理还是很有必要的。本人才疏学浅,...
  • 神经网络中的 “隐藏层” 理解

    万次阅读 2019-09-01 14:50:20
    隐藏层在神经网络中的作用:中间的黑盒子,可以认为是很其他的不同功能层的一个总称 每个图层都可以应用您想要的任何函数到前一层(通常是线性变换,然后是压缩非线性)。 隐藏层的工作是将输入转换为输出层可以...
  • 通俗理解卷积神经网络

    万次阅读 2016-08-31 22:48:05
    通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言  2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机
  • 本课程是计算机网络原理视频课程的第一部分(后面还有两部分),包括了OSI/RM、TCP/IP体系结构中的“物理层”和“数据链路层”(包括MAC子层)各种功能实现原理和各主要协议工作原理。本课程内容非常丰富,讲解非常...
  • ip地址网络位和主机位理解

    千次阅读 2014-10-25 17:54:27
    1.A类地址网络地址第一位必须是0的理解:因为A类地址在1~126之间,换算为二进制数即在(00000001~01111111)之间,二进制01111111为十进制的127,所以A类网络标识第一位是0且必须是0。 对于B类地址网络地址前...
  • 背景之前博文中关于CNN的模型训练功能上是能实现,但是研究CNN模型内部结构的时候,各个权重系数ww,偏差bb的shape还是存在疑惑,为什么要取1024,为什么取7*7*64,最近找到了一些相关资料,这个问题有了新的...
  • 关于java网络编程的理解解析
  • 网络原理以及VM中VMnet0,VMnet1,VMnet8的理解

    千次阅读 多人点赞 2017-11-28 20:56:35
     : 可以理解成A,也可以理解成B。 2. 术语  调制解调器(Modem): 实现模拟信号与数字信号间的相互转换,可以忽略成一条网线。  路由器: 提供路由、DHCP、NAT等的专门设备,连接不同的网络(包括局域网与WAN...
  • Unity的网络功能

    万次阅读 2012-08-06 17:48:23
    首先要说明的是,Unity本身的网络功能并不适合做MMO类型的游戏。如果要使用Unity作为MMO游戏的客户端,一般来说都是在C#中通过socket建立自定义的网络通信来实现。Unity本身的网络功能是为多人游戏设计的,这种游戏...
  • 理解激活函数在神经网络模型构建中的作用

    万次阅读 多人点赞 2017-06-01 12:02:36
    什么是激活函数在生物学家研究大脑神经元工作机理时,发现如果一个神经元开始工作时,该神经元是一种被激活的状态,我想着大概就是为什么神经网络模型中有一个单元叫做激活函数。 那么什么是激活函数呢,我们可以...
  • 深入理解LSTM神经网络

    万次阅读 多人点赞 2017-05-06 16:35:54
    下面是LSTM单元内各部分的理解: LSTM的关键是单元状态(cell state),即图中LSTM单元上方从左贯穿到右的水平线,它像是传送带一样,将信息从上一个单元传递到下一个单元,和其他部分只有很少的线性的相互作用...
  • : 可以理解成A,也可以理解成B。 2. 术语 调制解调器(Modem): 实现模拟信号与数字信号间的相互转换,可以忽略成一条网线。 路由器: 提供路由、DHCP、NAT等的专门设备,连接不同的网络(包括局域网与WAN之间的...
  • 本课程专门介绍计算机网络体系结构“网络层”和“传输层”相关的协议工作原理和主要功能实现原理
  • 计算机网络的认识与理解

    千次阅读 2018-10-22 10:46:33
    计算机是一群地理位置分散的具有自主功能的计算机,通过通信设备和传输媒体连接...构成网络的计算机往往分布在不同的地理位置,通过通信设备和线路连接起来,并且在功能完善的网络操作系统和通信协议管理下,将各...
  • UE4网络同步详解(一)——理解同步规则

    万次阅读 多人点赞 2017-10-15 21:41:40
    这篇文章主要以问题的形式,针对UE同步的各个方面的内容,...如果想深入了解同步的实现原理,可以参考UE4网络同步(二)——深入同步细节 问题一:如何理解Actor与其所属连接? 附加:1. Actor的Role是ROLE_Autho...
  • 计算机网络端口号的理解

    千次阅读 2015-01-06 17:27:09
    POS机调试需要设置端口号,看下来《计算机网路》这本书,以下是我看书之后的理解,不懂得同学可以看下帮助理解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 622,890
精华内容 249,156
关键字:

对网络功能的理解