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

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會導致創建零填充的初始狀態張量)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章