Keras中TimeDistributed层的作用是什么?

p1iqtdky  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(308)

我试图理解TimeDistributed Package 器在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层之间的区别?

7eumitmz

7eumitmz1#

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)的输出),因此在本例中,DenseTimeDistributed(Dense)是等效的。

ljo96ir5

ljo96ir52#

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层将包裹在其中的层应用于每个时间步,因此包裹在内部的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

  • 不带TimeDistributedDenseBatch计算
  • TimeDistributedDenseTimestep计算

相关问题