Keras TimeDistributed 层实际上做了什么?

What does a Keras TimeDistributed layer actually do?

给定一个时间序列,我有一个多步预测任务,我想在给定的时间序列序列中预测与时间步长相同的次数。 如果我有以下型号:

input1 = Input(shape=(n_timesteps, n_channels))
lstm = LSTM(units=100, activation='relu')(input1)
outputs = Dense(n_timesteps, activation="softmax")(lstm)
model = Model(inputs=input1, outputs=outputs)
model.compile(loss="mse", optimizer="adam",
              metrics=["accuracy"])

密集层上的n_timesteps意味着我将有n_timesteps个预测。但是,如果我将密集层包裹在 TimeDistributed 中(或等效地在 LSTM 层中设置 return_sequences=True),单位数是否仍必须为 n_timesteps 还是 1,因为使用 TimeDistributed我会将致密层应用于序列中的所有时间步骤。

根据您发布的示例,TimeDistributed 实质上将对每个时间步应用具有 softmax 激活函数的 Dense 层:

import tensorflow as tf

n_timesteps = 10
n_channels = 30
input1 = tf.keras.layers.Input(shape=(n_timesteps, n_channels))
lstm = tf.keras.layers.LSTM(units=100, activation='relu', return_sequences=True)(input1)
outputs = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(n_channels, activation="softmax"))(lstm)
model = tf.keras.Model(inputs=input1, outputs=outputs)

请注意,每个全连接层都等于 n_channels 的大小,以便为每个通道提供在时间步长 n 时被预测的公平机会。

如果您正在处理 multi-label 问题,您可以尝试这样的事情:

import tensorflow as tf

n_timesteps = 10
features = 3
input1 = tf.keras.layers.Input(shape=(n_timesteps, features))
lstm = tf.keras.layers.LSTM(units=100, activation='relu', return_sequences=False)(input1)
outputs = tf.keras.layers.Dense(n_timesteps, activation="sigmoid")(lstm)
model = tf.keras.Model(inputs=input1, outputs=outputs)

x = tf.random.normal((1, n_timesteps, features))
y = tf.random.uniform((1, n_timesteps), dtype=tf.int32, maxval=2)

print(x)
print(y)
model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(x, y, epochs=2)