在你写下x=Input(shape=(128,128,3))的时候你是习以为常,还是在思考发生了什么?

抱着这样的问题,我做了几个实验,简单记录几个以后可能用到的知识点。

1.Input并非“Input”?

Input的本质是实例化一个Keras Tensor,你可以把Input理解为一个class,你在写下:

x=Input(shape=(128,128,3))

的时候,其实是再创建一个Input实例,千万不要被“Input”的意思迷惑,这里仅仅是声明创建了一个Keras张量。之所以叫“Input”,是因为一般一个模型最开始的第一个张量都是数据本身,即input data,但久而久之,在使用Input的时候,可能会忘记Input的本质。

y=Dense(100,activation='sigmoid')(x)习惯了层结构,站在宏观角度的你,是不是忘了数学本质?

2.Dense下面发生了什么?

2.1先弄懂Dense的操作对象

首先对3D Tensor进行一个实验:

>>> x=Input(shape=(10000,5,20))
>>> y=Dense(1,activation='softmax')(x)
>>> model=Model(x,y)
>>> model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_8 (InputLayer)         (None, 10000, 5, 20)      0
_________________________________________________________________
dense_5 (Dense)              (None, 10000, 5, 1)       21
=================================================================
Total params: 21
Trainable params: 21
Non-trainable params: 0
_________________________________________________________________

再对一个8D Tensor进行一个实验:

>>> x=Input(shape=(10,20,30,40,50,60,70,20))
>>> y=Dense(1,activation='softmax')(x)
>>> model=Model(x,y)
>>> model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_9 (InputLayer)         (None, 10, 20, 30, 40, 50 0
_________________________________________________________________
dense_6 (Dense)              (None, 10, 20, 30, 40, 50 81
=================================================================
Total params: 21
Trainable params: 21
Non-trainable params: 0
_________________________________________________________________

我们发现,无论对一个几维张量,这里为了叙述方便,设输入nD Tensor

Dense层总是把前 (n-1)D Tensor作为一个样本点,把第n维作为描述前(n-1)D Tensor样本点的个数

这句话是什么意思呢,大白话来讲,可以通过举例来这样理解:

对于一个1D Tensor,也就是形如{1,2,5,4,7,...,6,7}这样的数据

,我们记作
每个样本
都是标量。Dense层在神经元个数为1的情况下,本身相当于在做
,这里w就是权重weights,b就是偏置量bias,这n个w外加1个b一共n+1个参数parameters,就是我们要让神经网络学习的参数。

对于一个2D Tensor,也就是形如{{4,5,8},{8,4,3},{8,1,6},...,{4,2,2}}这样的数据

,我们也记作

但是这里,每个样本

都是

向量。Dense层在神经元个数为1的情况下,本身相当于在做

,所以参数

仍是n+1个parameters

由此我们知道,

对1D Tensor,相当于n个0维标量,Dense操作的对象是每个标量。

对2D Tensor,相当于n个1维向量,Dense操作的对象是每个向量。

对3D Tensor,相当于n个2维矩阵,Dense操作的对象是每个矩阵。

对4D Tensor,相当于n个3D Tensor,Dense操作的对象是每个3D Tensor。

对4D Tensor这种高维空间想象不来的朋友,可以把他理解成一段视频。一段视频由若干张照片也就是我们常说的帧Frame连接构成,每个Frame照片是(R,G,B)的3D Tensor,加上时间,视频就是(R,G,B,t)的4D Tensor了。

对4D Tensor,Dense操作的对象是每个3D Tensor。也就是说,当你把视频送入Dense,在神经元个数为1的情况下,Dense在进行

操作,每个操作对象都是一张Frame照片。

2.2神经元个数不为1时发生了什么?

Dense(2)实际是指units=2,我们先考虑Dense(2)的情况,2.1中讲过,Dense(1)对应的运算是

,也就是说,一个神经元的工作任务就是对n个样本求权重并加上bias。Dense(2)就很好理解了,就是有两个神经元各自在做这个任务。

对于Dense(2),我们给第一个神经元起名叫A神经元,第二个叫B神经元,那么我们可以写出这两个神经元的工作:

对于神经元A来说:

对于神经元B来说:

对A写成向量形式:

对B写成向量形式:

观察到这两个神经元做的事情是一样的,各自在并行地进行一样的工作。这就好像矩阵的分块乘法,分块矩阵A和分块矩阵B各自进行各自的运算,互不干扰。

那么继续改写成分块矩阵形式:

为了从矩阵角度观察,我们将其不分块,看看公式是什么样:

到此为止,我们可以很清晰的看到一个Dense(2)的数学本质是什么了,是矩阵乘法

Dense(2)也就是声明了一个权重矩阵

和一个偏置向量
,产生了2*(n+1)个parameters,操作对象是

那么对于一个具有m个神经元的Dense(m),其数学本质就是

,此时若

操作对象(注意说的不是输入对象)不是1-D Tensor而是d-D Tensor,那么最终的推广形式就是:

这就是我们熟知的全连接层,Fully Connection Layer,A.K.A. FC只不过在Keras里面叫成了Dense,pytorch里面叫成了Linear,猫里面叫了个咪。

2.3关于增广形式(待更)

2.4关于你们最喜欢的FC的图片表示(待更)

拿到input输入的时间_【Keras 笔记】Input/Dense层的数学本质相关推荐

  1. python3中input输入浅谈_详解Python3中的 input() 函数

    详解Python3中的 input() 函数 一.知识介绍: 1.input() 函数,接收任意输入,将所有输入默认为字符串处理,并返回字符串类型: 2.可以用作文本输入,如用户名,密码框的值输入: ...

  2. print('两数之和为 %.1f' %(float(input('输入第一个数字:'))+float(input('输入第二个数字:'))))...

    There seems to be a syntax error in the code you provided. You can use the following code to print t ...

  3. matlab中input输入多个数_你可能不知道的MATLAB操作技巧#第二话

    回顾链接  这是#第一话#的超链接,让大家对MATLAB有一个感性认识. 第二话 1-梳理一下MATLAB中的字符char.符号变量symbol和数值型变量double等的区别.经过图图长时间调研,发 ...

  4. input 起止时间_几种常用的控件(下拉框 可选框 起止日期 在HTML页面直接读取当前时间)...

    下拉框 状态 ----请选择---- 制单 已提交 已审核 可选框 value="Y" checked="checked" id="isValid&q ...

  5. input 起止时间_完整的时间(开始和结束时间)输入框验证js

    1.html (1)时间输入框 当使用时间插件改变时间时,会触发onchange()事件 起始时间: οnfοcus="WdatePicker({dateFmt:'yyyy-MM-dd HH ...

  6. input 起止时间_给表单验证控件添加结束时间不得小于开始时间的验证方法

    //引入验证控件JS function getDate(strDate) { var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$) ...

  7. Python限制input输入时间

    ZACKZHOU 秋二 最近遇到一个python的需求,大概的意思就是限制input输入的时间. 我们先来了解一下python的input函数,它主要是接受一个标准输入数据,返回为 string 类型 ...

  8. 《UnityAPI.Input输入》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Input+anyKey+gyro+GetAxis+GetKey+立钻哥哥++OK++)

    <UnityAPI.Input输入> 版本 作者 参与者 完成日期 备注 UnityAPI_Input_V01_1.0 严立钻 2020.06.18 #<UnityAPI.Input ...

  9. Keras中dense层原理及用法解释

    文章目录 一.全连接层Fully Connection作用 二.API解释 2.1 示例1:dense层为输入层 2.2 示例2:dense层为中间层 2.3 示例3:dense层为输出层 三.实现过 ...

最新文章

  1. html 简单机器人对话页面,简单的js聊天机器人框架BotUI
  2. 12、HTML DOM
  3. return,break,continue三者区别
  4. 函数进阶学习之二 声明 定义
  5. 旷视:深度学习框架开源
  6. windows的php如何安装目录结构,禅道的目录结构
  7. python3精要(64)-Python命名风格规范-google版
  8. 27 | 案例篇:为什么我的磁盘I/O延迟很高?
  9. 移动应用ios和网页应用_如何在iOS上一次移动多个应用
  10. TCP建立连接与断开连接的过程
  11. java中String相等问题
  12. 1.10 编程基础之简单排序 04 奖学金 7分 python
  13. 插件安装失败_贴片保险丝额定电流应用电路为什么会安装失败?
  14. linux磁盘划分注意,划分磁盘阵列注意问题
  15. C语言解析Ini格式文件
  16. tuning-primer.sh 性能调试工具的使用
  17. Mono 的Virtual PC 虚拟机
  18. python 任务计划_python任务计划
  19. CSS font-family 属性值大全
  20. stm32软件模拟i2c通讯读取lm75a温度

热门文章

  1. jsp中空格字符怎么写_驰骋职场多年,如何对付Excel中的空格字符?
  2. python怎么判断是不是列表_python判断变量是否为int、字符串、列表、元组、字典等方法...
  3. 合种侧柏、云杉专车2-3天领证
  4. java string与integer_Java中Integer和String浅谈
  5. Python裁剪图片(Crop an Image)
  6. R语言日期函数weekdays, months, quarters julian实战(星期几、那个月、那个季度、时间差)
  7. 基于关联规则(Variational Autoencoders)疾病预测系统实战:(pyspark FPGrowth实现频繁项集挖掘、最后给出预测模型topK准确率和召回率)
  8. 特征工程之MinMaxScaler、StandardScaler、Normalizer、Binarizer
  9. matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
  10. itmz文件如何打开_如何使用proteus8打开低版本proteus7的仿真文件?