欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tf.keras.layers.LSTMCell和tf.keras.layers.LSTM

程序员文章站 2022-03-21 19:49:12
...

tf.keras.layers.LSTMCell 在整个时间序列输入中处理一个步骤,而 tf.keras.layer.LSTM处理整个序列

tf.keras.layers.LSTMCell

API简介:

tf.keras.layers.LSTMCell(
units, activation=‘tanh’, recurrent_activation=‘sigmoid’, use_bias=True,
kernel_initializer=‘glorot_uniform’, recurrent_initializer=‘orthogonal’,
bias_initializer=‘zeros’, unit_forget_bias=True, kernel_regularizer=None,
recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None,
recurrent_constraint=None, bias_constraint=None, dropout=0.0,
recurrent_dropout=0.0, implementation=2, **kwargs
)

units:正整数,输出空间的维数。
activation:要使用的**功能。默认值:双曲正切(tanh)。如果通过None,则不会应用任何**(即“线性”**:)a(x) = x。
recurrent_activation:用于循环步骤的**功能。默认值:S形(sigmoid)。如果通过None,则不会应用任何**(即“线性”**:)a(x) = x。
use_bias:布尔值(默认True),层是否使用偏置向量。
kernel_initializer:kernel权重矩阵的初始化程序,用于输入的线性转换。默认值:glorot_uniform。
recurrent_initializer:recurrent_kernel权重矩阵的初始化程序,用于循环状态的线性转换。默认值:orthogonal。
bias_initializer:偏置矢量的初始化器。默认值:zeros。
unit_forget_bias:布尔值(默认True)。如果为True,则在初始化时将1加到忘记门的偏置上。将其设置为true也将强制执行 bias_initializer=“zeros”。Jozefowicz等人建议使用此方法。
kernel_regularizer:正则化函数应用于kernel权重矩阵。默认值:None。
recurrent_regularizer:正则化函数应用于recurrent_kernel权重矩阵。默认值:None。
bias_regularizer:正则化函数应用于偏差向量。默认值: None。
kernel_constraint:约束函数应用于kernel权重矩阵。默认值:None。
recurrent_constraint:约束函数应用于recurrent_kernel 权重矩阵。默认值:None。
bias_constraint:约束函数应用于偏差向量。默认值: None。
dropout:在0到1之间浮动。为输入的线性转换而下降的单位的分数。默认值:0
recurrent_dropout:在0到1之间浮动。用于递归状态线性转换的单位小数。默认值:0
implementation:实施模式1或2。模式1将其操作构造为大量较小的点乘积和加法运算,而模式2(默认)将它们分为较少的较大操作。这些模式在不同的硬件和不同的应用程序上将具有不同的性能配置文件。默认值:2
调用参数:
inputs一个2D张量,形状为[batch, feature]
states:对应于单元单位的2张量的列表。它们都具有形状[batch, units],第一个张量是前一个时间步长的记忆状态,第二个tesnor是前一个时间步长的进位状态。对于时间步0,用户提供的初始状态将被馈送到单元。
training:Python布尔值,指示该层是应在训练模式下还是在推理模式下运行。仅在使用dropout或 时相关recurrent_dropout

tf.keras.layers.LSTMCell 输入输出

1、使用for循环调用
由于是cell类,所以需要自行初始化向量 的状态变量 List 有两
个,即[ ????, ????????],需要分别初始化,其中 List 第一个元素为 ????,第二个元素为????????。调用 cell 完成前向运算时,返回两个元素,第一个元素为 cell 的输出,也就是 ????,第二个元素为cell 的更新后的状态 List:[ ????, ????????]。首先新建一个状态向量长度ℎ = 64的 LSTM Cell,其中状态向量????????和输出向量 ????的长度都为ℎ,代码如下:

x = tf.random.normal([2,80,100])
xt = x[:,0,:] # 得到一个时间戳的输入11 章 循环神经网络 26
cell = layers.LSTMCell(64) # 创建 LSTM Cell
# 初始化状态和输出 List,[h,c]
state = [tf.zeros([2,64]),tf.zeros([2,64])]
out, state = cell(xt, state) # 前向计算
# 查看返回元素的 id
id(out),id(state[0]),id(state[1])
Out[18]: (1537587122408, 1537587122408, 1537587122728)
可以看到,返回的输出 out 和 List 的第一个元素 ????的 id 是相同的,这与基础的 RNN 初衷
一致,都是为了格式的统一。
通过在时间戳上展开循环运算,即可完成一次层的前向传播,写法与基础的 RNN 一
样。例如:
# 在序列长度维度上解开,循环送入 LSTM Cell 单元
for xt in tf.unstack(x, axis=1): 
 # 前向计算
 out, state = cell(xt, state)
输出可以仅使用最后一个时间戳上的输出,也可以聚合所有时间戳上的输出向量。

2、使用 tf.keras.layer.RNN调用

inputs = np.random.random([32, 10, 8]).astype(np.float32)
rnn = tf.keras.layers.RNN(tf.keras.layers.LSTMCell(4))

output = rnn(inputs)  # The output has shape `[32, 4]`.

rnn = tf.keras.layers.RNN(
    tf.keras.layers.LSTMCell(4),
    return_sequences=True,
    return_state=True)

# whole_sequence_output has shape `[32, 10, 4]`.
# final_memory_state and final_carry_state both have shape `[32, 4]`.
whole_sequence_output, final_memory_state, final_carry_state = rnn(inputs)

tf.keras.layers.LSTM

tf.keras.layers.LSTM(
units, activation=‘tanh’, recurrent_activation=‘sigmoid’, use_bias=True,
kernel_initializer=‘glorot_uniform’, recurrent_initializer=‘orthogonal’,
bias_initializer=‘zeros’, unit_forget_bias=True, kernel_regularizer=None,
recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None,
kernel_constraint=None, recurrent_constraint=None, bias_constraint=None,
dropout=0.0, recurrent_dropout=0.0, implementation=2, return_sequences=False,
return_state=False, go_backwards=False, stateful=False, time_major=False,
unroll=False, **kwargs
)

基于可用的运行时硬件和约束,该层将选择不同的实现(基于cuDNN或纯TensorFlow)以最大化性能。如果有GPU,并且该层的所有参数都满足CuDNN内核的要求(请参阅下文以了解详细信息),则该层将使用快速cuDNN实现。

使用cuDNN实现的要求是

activation == tanh (默认值)
recurrent_activation == sigmoid (默认值)
recurrent_dropout == 0 (默认值)
unroll 是 False (默认值)
use_bias 是 True (默认值)
输入不会被屏蔽或严格右填充。

API:(讲解几个比较重要的)

return_sequences:布尔值。是否返回最后的输出。在输出序列或完整序列中。默认值:False。
return_state:布尔值。除输出外,是否返回最后一个状态,且返回值是二维的。默认值:False
mask:形状的二进制张量,[batch, timesteps]指示是否应屏蔽给定的时间步长(可选,默认为None)。
training:Python布尔值,指示该层是应在训练模式下还是在推理模式下运行。该参数在调用时传递给单元格。仅在使用dropout或 时才有意义recurrent_dropout(可选,默认为None)。
initial_state:初始状态张量的列表,该初始张量将传递给单元格的第一个调用(可选,默认情况下None会导致创建零填充的初始状态张量)。