在之前使用Tensorflow来做音乐识别时,LSTM给出了非常让人惊喜的学习能力。当时在进行Tuning的时候,有一个参数叫做num_units,字面看来是LTSM单元的个数,但最近当我试图阅读Tensorflow源代码时,和我们最初的认知大不相同,以此博文来记录。

先看当初我们是如何设置的:

rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=300)

看起来像是,为Hidden Layer设置了300个单独的LSTM单元,然后并行工作最终输出300个值。但实际上,我们来看一下Tensorflow的源码:(github地址),从line 326,开始定义BasicLSTMCell类,在line 374行开始定义BasicLSTMCell的核心方法call方法:

 def call(self, inputs, state):
"""Long short-term memory cell (LSTM)."""
sigmoid = math_ops.sigmoid
# Parameters of gates are concatenated into one multiply for efficiency.
if self._state_is_tuple:
c, h = state
else:
c, h = array_ops.split(value=state, num_or_size_splits=2, axis=1) concat = _linear([inputs, h], 4 * self._num_units, True) # i = input_gate, j = new_input, f = forget_gate, o = output_gate
i, j, f, o = array_ops.split(value=concat, num_or_size_splits=4, axis=1) new_c = (
c * sigmoid(f + self._forget_bias) + sigmoid(i) * self._activation(j))
new_h = self._activation(new_c) * sigmoid(o) if self._state_is_tuple:
new_state = LSTMStateTuple(new_c, new_h)
else:
new_state = array_ops.concat([new_c, new_h], 1)
return new_h, new_state

注意13行,改行的作用是,根据当前时刻的输入inputs,以及前一时刻的输出值h,去计算4个gates在经过activation function之前的线性组合值。而后15-17两行,我们使用四个gates去计算了新的LSTM Cell状态c,以及新的输出值h。

是的,无论num_units设置为多少,这是一个LSTM Cell!如果我们查看_linear这个函数,可以看到第二个参数是output_size,也就是说num_units和LSTM Cell的输出大小有关。事实上,Tensorflow的LSTMCell表征了整个一层Hidden Layer。而num_units则表示State Cell的存储能力,或者说维度Dimension。试想在一个LSTM Neural Network中,输入tensor X的维度是确定的,输出值Y的维度也是确定的,而LSTM各个时刻间的中间状态c,以及抽象输出h,则可以为任意维度。因为h可以经过dense层(fully-connected layer)去压缩成Y所需的维度。

所以c和h的维度越高,其蕴含的time series data细节越多,当然越容易去拟合training set。但是,容易Overfitting呀,所以tuning时平衡training set的拟合程度,以及cv set的预测精度,来达到trade off咯。

Attribute 'num_units' in Tensorflow BasicLSTMCell blocks的更多相关文章

  1. AttributeError: module 'tensorflow' has no attribute 'enable_eager_execution'

    Traceback (most recent call last): File "linear_regression_eager_api.py", line 15, in < ...

  2. Sphinx 2.2.11-release reference manual

    1. Introduction 1.1. About 1.2. Sphinx features 1.3. Where to get Sphinx 1.4. License 1.5. Credits 1 ...

  3. 转:用AutoCAD 系统变量编程

    Autocad的系统变量, 我们可以通过如下得到: Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable(/*MSG0* ...

  4. ubuntu14.04 安装 tensorflow9.0

    ubuntu14.04 安装 tensorflow9.0 文章目录 ubuntu14.04 安装 tensorflow9.0 安装pip(笔者的版本为9.0) 仅使用 CPU 的版本的tensorfl ...

  5. chattr lsattr linux file system attributes - linux 文件系统扩展属性

    我们使用 linux 文件系统扩展属性,能够对linux文件系统进行进一步保护:从而给文件 赋予一些额外的限制:在有些情况下,能够对我们的系统提供保护: chattr命令用来改变文件属性.这项指令可改 ...

  6. 关于tensorflow里面的tf.contrib.rnn.BasicLSTMCell 中num_units参数问题

    这里的num_units参数并不是指这一层油多少个相互独立的时序lstm,而是lstm单元内部的几个门的参数,这几个门其实内部是一个神经网络,答案来自知乎: class TRNNConfig(obje ...

  7. tensorflow源码分析——BasicLSTMCell

    BasicLSTMCell 是最简单的LSTMCell,源码位于:/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py.BasicLSTMC ...

  8. 'tensorflow' has no attribute 'sub'

    在学习tensorflow的时候,照到官方的例子做,发现了一个 Traceback (most recent call last): File , in <module> sub = tf ...

  9. 【pycharm】pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法

    pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法 解决方法: 在pycharm的安装目 ...

随机推荐

  1. BZOJ 3252题解(贪心+dfs序+线段树)

    题面 传送门 分析 此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根 ...

  2. utf-8 bom头问题 thinkphp 报错 Namespace declaration statement has to be the very first statement in the script

    先看百度百科上的解释---- BOM —— Byte Order Mark,中文名译作“字节顺序标记”.在这里找到一段关于 BOM 的说明: 在UCS 编码中有一个叫做 "Zero Widt ...

  3. go中基本数据类型转换为string类型的方法

    代码 // 基本数据类型转换为string类型 package main import ( "fmt" "strconv" ) func main() { // ...

  4. sqoop简单使用

    一,通过sqoop将MySQL里面的数据加载到HDFS 先查看有哪些数据库 查看表person sqoop list-databases --connect jdbc:mysql://ly-p2p4: ...

  5. [书接上一回]在Oracle Enterprise Linux (v5.7) 中安装DB - (1/4)

    在上一回中,我们安装了OEL了,现在就要安装Oracle数据. 首先登录root用户,输入账号密码或,输入命令行:startx,启动图形界面. 先将虚拟机中插入光碟(Enterprise-R5-U7- ...

  6. Centos7 配置rsyslog客户端接收远程日志

    rsyslog 因为路由器我设定每天重启,但是日志一重启就会清除,并且路由器最多只能保存1024条记录,所以我想把路由器的日志记录到一台服务器上,发现路由器包含远程日志功能 于是我就在我的centos ...

  7. 同步请求与异步请求Json

    同步请求的返回值类型 : void : 啥也不返回 String :表示逻辑视图名 ModelAndView:该对象既有逻辑视图名,还可以携带去页面要展示的数据 同步请求:如何将controller层 ...

  8. JSP学习(2)

    JSP学习(2) JSP简介 Java Server Page,其根本是一个简单Servlet设计. 常用的动态网站开发技术 JSP:安全性高,适合开发大型的,企业级或分布式的Web应用程序. Asp ...

  9. 2019ICPC网赛南京站B题 super_log(欧拉降幂

    https://nanti.jisuanke.com/t/41299 题意:让算a^(a^(a^(...))),一共b个a, (mod p)的结果. 思路:这是个幂塔函数,用欧拉降幂公式递归求解. # ...

  10. glDrawArrays 和 glDrawElements

     在openGL中,所有图形都是通过分解成三角形的方式进行绘制.(一个矩形分解成两个三角形进行绘制) glDrawArrays 和 glDrawElements 的作用都是从一个数据数组中提取数据渲染 ...