这篇文章的标题比较奇怪,网上可能很少类似专门介绍神经网络的输入输出相关文章。在我实际工作和学习过程中,发现很有必要对神经网络的输入和输出做一个比较全面地介绍。跟之前博客一样,本篇文章不会出现相关代码或者公式之类的,还是希望用更直观的图文来说明问题,读者不太可能通过阅读文章来获取代码或者解决方案从而直接应用到实际项目中。由于我主要做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个月,下周终于复工了。如果你对本篇文章有什么问题,欢迎留言。

[AI开发]零代码公式让你明白神经网络的输入输出的更多相关文章

  1. [AI开发]零代码分析视频结构化类应用结构设计

    视频结构化类应用涉及到的技术栈比较多,而且每种技术入门门槛都较高,比如视频接入存储.编解码.深度学习推理.rtmp流媒体等等.每个环节的水都非常深,单独拿出来可以写好几篇文章,如果没有个几年经验基本很 ...

  2. [AI开发]零数学公式告诉你什么是(卷积)神经网络

    大部分介绍神经网络的文章中概念性的东西太多,而且夹杂着很多数学公式,读起来让人头疼,尤其没什么基础的人完全get不到作者想要表达的思想.本篇文章尝试零公式(但有少量数学知识)说清楚什么是神经网络,并且 ...

  3. "零代码”开发B/S企业管理软件之一 :怎么创建数据库表

    声明:该软件为本人原创作品,多年来一直在使用该软件做项目,软件本身也一直在改善,在增加新的功能.但一个人总是会有很多考虑不周全的地方,希望能找到做同类软件的同行一起探讨. 本人文笔不行,能把意思表达清 ...

  4. 银弹谷零代码开发V百科|使用技巧:你已经是个成熟的系统了,该学会无网络升级了

    银弹谷零代码开发V百科|使用技巧:你已经是个成熟的系统了,该学会无网络升级了 伴随网络时代的发展,当今越来越多用户家庭的日常生活已经离不开网络.它就像是一张巨大的蛛网,连接起我们每一户人家.虽然网络不 ...

  5. 银弹谷零代码开发V百科|使用技巧:OMG!这些时间日期函数太好用了吧,盘它

    银弹谷零代码开发V百科|使用技巧:OMG!这些时间日期函数太好用了吧,盘它 Hello~everybody!小V又来咯!这次小V给大家带来的是零代码开发V平台常用的时间日期函数.小V知道我们平时常常会 ...

  6. 银弹谷零代码开发V百科|使用技巧:Vbase技巧二则之二

    银弹谷零代码开发V百科|使用技巧:Vbase技巧二则之二 结构树设置 Vbase系统提供机构树默认展开层级和加载模式的设置. sa账号登录,默认密码8. 打开机构与权限管理—机构初始化设置菜单,选择“ ...

  7. 教你如何使用零代码开发的Foreach循环功能代替for循环

    使用技巧:Foreach循环功能! 项目中为了避免将同样的语句重复写很多次,相信大家在编程过程中肯定用过循环语句.其中For循环作为基础中的基础,大家一定不会陌生.不过今天小V要讲的可不是For循环, ...

  8. crudapi零代码开发平台应用场景和成功案例

    应用场景 在前面文章中,已经介绍了crudapi主要功能和使用方式,本文主要介绍crudapi应用场景以及具体的使用方式. 概要 crudapi属于产品级的零代码平台,无需编程,通过配置自动生成cru ...

  9. [Lua游戏AI开发指南] 笔记零 - 框架搭建

    一.图书详情 <Lua游戏AI开发指南>,原作名: Learning Game AI Programming with Lua. 豆瓣:https://book.douban.com/su ...

随机推荐

  1. 大忙人的jdk8,比出生晚了好几个激情的夏天

    写给大忙人的jdk8到手了,第一件事情就蒙蔽了,mac装的jdk7,切换jdk的功能要整出来才行,下好jdk8up101安装,假装几行代码搞定目标在命令行下,可以通过命令'jdk6', 'jdk7', ...

  2. appium使用相对坐标定位元素

    最近在用appium做自动化时发现,有一些元素无法通过uiautomatorviewer进行定位,这样就只能通过相对坐标来进行定位了.但是,问题又来了:如何获取元素的坐标呢? 在网上找了半天也没找到相 ...

  3. Activity源码解析 - 读书笔记

    1. Activity启动 Activity是一个比较好的模板方法模式.在Android系统启动时,第一个启动的进程是zygote进程,然后由zygote启动SystemServer,再后就是启动AW ...

  4. CSS——NO.6(盒模型)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  5. C/C++ 存储类别

    table { margin: auto; } 本文介绍 C/C++ 中的存储类别.所谓的"存储类别"究竟是什么意思? 存储类别主要指在内存中存储数据的方式,其大致牵涉到变量的三个 ...

  6. swoole(2)swoole进程结构

    一:进程基本概念 系统中正在运行的一个程序,程序一旦运行就是进程 一个进程可以拥有多个线程 核心内容分为两部分:内存(进程创建时从系统分配的,它所创建的变量都会存储在这一块内存中).上下文环境 二:s ...

  7. Maven项目中的packaging标签

    <packaging>XXX</packaging> 项目的打包类型xxx:pom.jar.war.(packing默认是jar类型). pom是最简单的打包类型,pom 项目 ...

  8. https信任库采坑记

    最近在客户现场遇到一个棘手的http问题,现象很直接,访问某https的时候报错: javax.net.ssl.SSLPeerUnverifiedException: peer not authent ...

  9. (27)ASP.NET Core .NET标准REST库Refit

    1.简介 Refit是一个受到Square的Retrofit库(Java)启发的自动类型安全REST库.通过HttpClient网络请求(POST,GET,PUT,DELETE等封装)把REST AP ...

  10. React-Hooks 学习概览

     React-Hooks的函数 组件方式代替原来的类继承,简化代码风格,好处是大大的: 1.useState  用来声明状态变量.要从三方面掌握:声明.读取.使用.(注意:useStae是不能进行条件 ...