keras - 为什么 CuDNNLSTM 在 keras 中比 LSTM 有更多的参数?
问题描述
我一直在尝试计算 Keras 中 LSTM 单元中的参数数量。我创建了两个模型,一个使用 LSTM,另一个使用 CuDNNLSTM。
模型的部分摘要如下
CuDNNLSTM 模型:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, None, 300) 192000
_________________________________________________________________
bidirectional (Bidirectional (None, None, 600) 1444800
LSTM 模型
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, None, 300) 192000
_________________________________________________________________
bidirectional (Bidirectional (None, None, 600) 1442400
LSTM 中的参数数量遵循互联网上可用的 lstm 参数计算公式。然而,CuDNNLSTM 有 2400 个额外的参数。
这些额外参数的原因是什么?
代码
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.compat.v1.keras.models import Sequential
from tensorflow.compat.v1.keras.layers import CuDNNLSTM, Bidirectional, Embedding, LSTM
model = Sequential()
model.add(Embedding(640, 300))
model.add(Bidirectional(<LSTM type>(300, return_sequences=True)))
解决方案
LSTM 参数可以分为 3 类:输入权重矩阵 (W)、循环权重矩阵 (R)、偏差 (b)。LSTM 单元计算的一部分是W*x + b_i + R*h + b_r
输入b_i
偏差和b_r
循环偏差。
如果你让b = b_i + b_r
,你可以将上面的表达式重写为W*x + R*h + b
。这样一来,您就无需保留两个单独的偏置向量 (b_i
和b_r
),而只需存储一个向量 ( b
)。
cuDNN 坚持原始的数学公式,b_i
并b_r
分别存储。Keras 没有;它只存储b
。这就是为什么 cuDNN 的 LSTM 的参数比 Keras 多的原因。
推荐阅读
- python - 使用 Join 方法组合 FirefoxWebElements 的文本
- mysql - 如何在 Mysql 中获取客户端的当前日期时间
- javascript - React-Native Flatlist 会在状态更改时重新渲染图像
- swift - Firebase 数据库用户 uid
- c# - 在 C# 中单击 DataGridView 中的查看按钮
- java - Netty - 是否需要释放 Unpooled.unreleasesableBuffer 的内存
- javascript - 一个简单的 todoApp 复选框问题
- http - HTTP 请求/响应标头的平均计数是多少?
- python-3.x - 线图的seaborn错误标签
- css - 删除 flexbox 中不需要的空格