zoukankan      html  css  js  c++  java
  • [AI开发]零代码公式让你明白神经网络的输入输出

    这篇文章的标题比较奇怪,网上可能很少类似专门介绍神经网络的输入输出相关文章。在我实际工作和学习过程中,发现很有必要对神经网络的输入和输出做一个比较全面地介绍。跟之前博客一样,本篇文章不会出现相关代码或者公式之类的,还是希望用更直观的图文来说明问题,读者不太可能通过阅读文章来获取代码或者解决方案从而直接应用到实际项目中。由于我主要做CV相关,对卷积神经网络了解比较多,本篇文章的神经网络指的是卷积神经网络CNN。

    对于监督学习来讲(本篇文章只针对监督学习),解决的主要问题就是X->Y的映射问题,也就是说对于输入X,我们的模型需要预测它的输出Y。我们暂且称这里的X为输入,这里的Y为输出,X和Y都可以是高维矩阵(并不是传统概念中的连续数值)。

    不管是传统的机器学习还是基于神经网络的深度学习,都符合上面这一规律,这就是为什么线性代数在机器学习中非常重要的原因。输入输出的格式确定后,不同结构的神经网络输入输出个数(分支)可以不尽相同,归纳起来一共包含四种。

    单输入单输出

    这种输入输出组合比较常见,一般介绍神经网络有关的文章基本都举这种结构作为例子。该结构的网络只包含一个输入分支和一个输出分支,比如我们比较熟悉的识别猫狗、预测房价的例子都属于该类。我们将一张RGB图片作为输入传给卷积神经网络,神经网络输出是猫和狗的概率。我们将某个房子的属性(面积、位置、朝向、厕所个数等)作为输入传给一个全连接神经网络,神经网络输出该房子的价格。我们可以看到这种单输入单输出的神经网络解决的问题比较单一,一个输出分支即可表示预测结果,同时神经网络预测所需要的依据(输入)也比较单一,一个输入分支即可接收全部输入。

    如上图所示,上半部分是经典的猫狗识别问题(分类问题),包含一个输入分支,接收一张RGB三通道图片,包含一个输出分支,输出猫狗概率。下半部分是经典的房价预测问题(回归问题),包含一个输入分支,接收房子的属性特征,包含一个输出分支,输出房子的预测房价。

    如果再深入一点,假设猫狗设别神经网络的输入图片尺寸为224*224,输出采用Softmax激活函数,包含两个节点,每个节点分别表示猫狗概率,加起来和为1(我们也可以使用Sigmoid激活函数来处理二分类问题,那么只有一个节点)。假设房价预测神经网络的输入包含面积(数值)、朝向(东南西北离散值)、楼层(数值)、位置(限定在武汉市6个区,离散值)以及房间数量(限定在1至4之间,离散值),输出采用Liner激活函数,包含一个节点,该节点表示房子的房价。那么我们再来看一下每个输入输出分支的数据格式:

    如上图所示,我们可以看到,虽然输入输出可能包含多个数值,但是这些数值仍然可以组合成一个高维矩阵(向量属于矩阵的一种),被一个输入或输出分支处理,再次证明,线性代数在机器学习中的重要性。尤其在深度学习中,所有的数据都是以矩阵为单位进行传递的,深度学习框架TensorFlow的命名就比较形象:张量流动(张量即矩阵),描述数据在神经网络中的传递过程。

    单输入多输出

    很多时候,我们解决的是一个复杂的问题。比如上面举的猫狗识别的例子中,仅仅识别图中是什么动物,假如现在我们不仅要识别图中是猫还是狗,我们还需要识别猫和狗的毛色,原来的那种网络结构可能不太合适了,因为它只有一个输出分支,该分支只能输出它是猫还是狗。这种情况该如何设计神经网络呢?答案很简单,就是再给神经网络加一个输出分支,该分支用来预测猫狗的毛色:

    如上图,我们新增了一个输出分支,该分支预测动物的毛色。现在对于任意一个输入图片,我们不仅能够识别图中是猫还是狗,我们还能识别它的毛色,神经网络功能强大了许多。我们再深入一点,假设动物毛色限定在黑、白、灰三种之间,那么该网络的输入输出分支的数据格式为:

    如上图,现在有两个输出分支,第一个分支为二分类,输出一个2维向量,它代表预测的动物种类,第二个分支为三分类,输出一个3维向量,它代表动物的毛色。神经网络的输出分支变了,那么训练它需要的数据格式也会改变,之前只需要指定数据的动物分类,现在还需要指定动物的毛色,所以对于任意训练数据trainX,我们需要为它指定标签TrainY1和TrainY2,分别表示TrainX对应的动物分类和毛色分类。

    我们可以看到新增的一个输出分支仍然是在做分类任务,我们是否可以将分类和回归合并到一起呢?当然是可以的。我们再增加一个输出分支,来预测动物的年龄:

    如上图,我们再次新增了一个输出分支,该分支做回归任务,预测动物的年龄,它的输出是一个1维向量,代表动物的年龄。同样网络输出分支变了,训练它的数据格式也需要跟着改变,对于每个训练数据TrainX,我们需要指定对应的TrainY1、TrainY2以及TrainY3,分别代表动物的分类、毛色以及对应的实际年龄。

    注意这里仅仅是为了说明一个神经网络可以包含多个输出分支,所以并没有考虑应用场景的合理性,毕竟通过一张图片来判断图片上猫的年龄确实有点难,猫脸不像人脸,特征不够,恐怕很难告诉你它有几岁了。

    多输入单输出

    前面讨论的都是单输入模式,一个输入分支就可以接收神经网络所需的全部数据。在有些场合一个分支可能处理不了多个不同数据格式的输入,比如神经网络同时包含图片、数值、离散值等作为输入。这里还是举猫为例:通过提供的猫的图片以及猫的年龄以及性别,来预测这只猫的售价。那么这时候神经网络就需要有两个输入分支了,分别接收猫图片和猫龄以及性别:

    如上图所示,神经网络包含两个输入分支,第一个分支接收RGB图片作为输入,第二个分支接收猫龄和性别(数值和离散值)作为输入,最后神经网络输出该只猫的售价。注意这里:由于CNN一般用来处理图片等复杂数据格式,因此图中的两个输入分支分别使用了不同的处理方式,但是最后通过merge等操作将两个Branch的中间特征值合并起来再进一步进行处理,最后得出预测值。这里最后的输出结果受前面两个分支的共同影响。

    我们这次假设输入猫图像的大小为416*416,仍然是RGB彩图,那么这次的每个分支数据格式为:

    如上图,两个输入分支分别有自己的数据格式要求。第一个分支接收一个416*416*3的矩阵,第二个分支接收一个3维向量,最后输出猫的预测售价。神经网络输入分支改变之后,对应训练的数据格式也需要调整,根据前面的内容可知,这次训练的输入包含TrainX1和TrainX2,分别代表猫图片和猫龄及性别,输出为TrainY,即该只猫的实际售价。虽然神经网络中包含两个Branch,但是经过训练后,误差反向传播,两个Branch中的权重均可以得到调整优化。

    多输入多输出 

    这个就不多说了,将前面介绍的组合起来就是多输入多输出。唯一需要注意的就是,输入输出分支结构改变后,对应训练的数据格式也需要做出改变,比如TrainX1、TrainX2 对应 TrainY1和TrainY2。

    常见深度学习框架比如tensorflow、caffe、keras等等都可以很方便的实现以上四种神经网络深入输出结构。 家里蹲2个月,下周终于复工了。如果你对本篇文章有什么问题,欢迎留言。

  • 相关阅读:
    植物大战僵尸游戏内存地址
    Win7如何取消用户登陆界面
    Adobe PS CS6安装详解
    MVC 支持同名路由,不同命名空间
    Session阻塞 读写锁引发的小问题
    GZipStream 压缩和解压
    IIS 工作原理之非托管代码旅程(一)
    Http协议(一)
    Css学习笔记 (一)
    Linq二 LinqToSql
  • 原文地址:https://www.cnblogs.com/xiaozhi_5638/p/12591612.html
Copyright © 2011-2022 走看看