我正在尝试了解 TimeDistributed 包装器在 Keras 中的作用。
我知道 TimeDistributed“将一个层应用于输入的每个时间切片。”
但是我做了一些实验并得到了我无法理解的结果。
简而言之,对于 LSTM 层,TimeDistributed 和 Dense 层具有相同的结果。
model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add(TimeDistributed(Dense(1)))
print(model.output_shape)
model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add((Dense(1)))
print(model.output_shape)
对于这两个模型,我得到的输出形状为 (None, 10, 1)。
任何人都可以解释 RNN 层之后的 TimeDistributed 层和 Dense 层之间的区别吗?
在
keras
中 - 在构建顺序模型时 - 通常是第二个维度(样本维度之后的一个) - 与 time
维度相关。这意味着,例如,如果您的数据是 5-dim
和 (sample, time, width, length, channel)
,您可以沿时间维度使用 TimeDistributed
(适用于 4-dim
和 (sample, width, length, channel)
)应用卷积层(将同一层应用于每个时间片)以获得5-d
输出。
Dense
的情况是,在2.0版本的keras
中,Dense
默认仅应用于最后一个维度(例如,如果您将Dense(10)
应用于形状为(n, m, o, p)
的输入,您将获得形状为的输出(n, m, o, 10)
)所以在你的情况下 Dense
和 TimeDistributed(Dense)
是等价的。
B = 2 # number of batches
d_model = 8 # embedding dimension
T = 3 # number of timesteps
dense_layer = tf.keras.layers.Dense(16)
inp = np.random.randn(B, T, d_model)
# using TimeDistributed layer
inputs = tf.keras.Input(shape=(T, d_model)) # (B, T, d_model)
outputs = tf.keras.layers.TimeDistributed(dense_layer)(inputs) # (B, T, 16)
model1 = keras.Model(inputs, outputs)
otpt1 = model1(inp)
TimeDistributed
Layer 将包裹在其内部的层应用到每个时间步
因此,包裹在其中的 dense_layer
的输入形状是 (B, d_model)
,因此在应用具有形状 dense_layer
权重的 (d_model, 16)
后,输出是 (B, 16)
,在所有时间步骤中执行此操作,我们得到形状 的输出(B, T, 16)
。
# Without using TimeDistributed layer
inputs = tf.keras.Input(shape=(T, d_model)) # (B, T, d_model)
outputs = dense_layer(inputs) # (B, T, 16)
model2 = keras.Model(inputs, outputs)
otpt2 = model2(inp)
在不使用
TimeDistributed
的情况下,dense_layer
的输入形状为 (B, T, d_model)
,因此权重维度为 (d_model, 16)
,适用于所有批次 B
以给出输出形状 (B, T, 16)
np.all(otpt1.numpy() == otpt2.numpy()) # True
Dense
没有 TimeDistributed
计算每个Batch
TimeDistributed
与 Dense
计算每个 Timestep