tf.nn.dynamic_rnn
似乎已被弃用:
警告:不建议使用此功能。它将在将来的版本中删除。更新说明:请使用keras.layers.RNN(cell),它等效于此API
我已经检查了keras.layers.RNN(cell),它说它可以使用掩膜,我认为它可以代替dynamic_rnn
的{{1}}参数吗?
该层支持对具有可变时间步长的输入数据进行屏蔽。要将掩码引入数据,请使用embedding层,其mask_zero参数设置为True。
但是,即使在嵌入文档中也没有关于如何使用sequence_length
来容纳可变序列长度的更多信息。另外,如果我只是使用嵌入层添加蒙版,那么如何防止嵌入更改输入内容并接受训练?
类似于此问题RNN in Tensorflow vs Keras, depreciation of tf.nn.dynamic_rnn(),但我想知道如何使用掩码替换mask_zero=True
答案 0 :(得分:1)
我也需要一个答案,并通过问题底部的链接找出了我需要的东西。
简而言之,您可以按照链接中的答案进行操作,但是如果您不愿意使用嵌入层,则可以“简单地”省去嵌入层。我强烈建议您阅读和理解linked answer,并进一步阅读Masking上的文档,但这是经过修改的版本,它在序列输入上使用掩蔽层来替换“ sequence_length” :
import numpy as np
import tensorflow as tf
pad_value = 0.37
# This is our input to the RNN, in [batch_size, max_sequence_length, num_features] shape
test_input = np.array(
[[[1., 1. ],
[2, 2. ],
[1., 1. ],
[pad_value, pad_value], # <- a row/time step which contains all pad_values will be masked through the masking layer
[pad_value, pad_value]],
[[pad_value, pad_value],
[1., 1. ],
[2, 2. ],
[1., 1. ],
[pad_value, pad_value]]])
# Define the mask layer, telling it to mask all time steps that contain all pad_value values
mask = tf.keras.layers.Masking(mask_value=pad_value)
rnn = tf.keras.layers.GRU(
1,
return_sequences=True,
activation=None, # <- these values and below are just used to initialise the RNN in a repeatable way for this example
recurrent_activation=None,
kernel_initializer='ones',
recurrent_initializer='zeros',
use_bias=True,
bias_initializer='ones'
)
x = tf.keras.layers.Input(shape=test_input.shape[1:])
m0 = tf.keras.Model(inputs=x, outputs=rnn(x))
m1 = tf.keras.Model(inputs=x, outputs=mask(x))
m2 = tf.keras.Model(inputs=x, outputs=rnn(mask(x)))
print('raw inputs\n', test_input)
print('raw rnn output (no mask)\n', m0.predict(test_input).squeeze())
print('masked inputs\n', m1.predict(test_input).squeeze())
print('masked rnn output\n', m2.predict(test_input).squeeze())
退出:
raw inputs
[[[1. 1. ]
[2. 2. ]
[1. 1. ]
[0.37 0.37]
[0.37 0.37]]
[[0.37 0.37]
[1. 1. ]
[2. 2. ]
[1. 1. ]
[0.37 0.37]]]
raw rnn output (no mask)
[[ -6. -50. -156. -272.7276 -475.83362 ]
[ -1.2876 -9.862801 -69.314 -213.94202 -373.54672 ]]
masked inputs
[[[1. 1.]
[2. 2.]
[1. 1.]
[0. 0.]
[0. 0.]]
[[0. 0.]
[1. 1.]
[2. 2.]
[1. 1.]
[0. 0.]]]
masked rnn output
[[ -6. -50. -156. -156. -156.]
[ 0. -6. -50. -156. -156.]]
请注意,在应用遮罩的情况下,如何在激活遮罩的时间步长(即填充序列的时间步)上不执行计算。取而代之的是,将前一个时间步骤的状态继续进行。
需要注意的其他几点:
[0.37, 2]
的时间步长仍将与这些值一起馈送到网络,但是,[0.37, 0.37]
的时间步长将被跳过。