tf.keras.layers.TimeDistributed

介绍

本文摘自keras官网中文版,网址:
https://keras.io/zh/layers/wrappers/

这个封装器将一个层应用于输入的每个时间片。

输入数据的形状至少为 3D,输入数据的第1个维度是batch,第2个维度 应该是时间所表示的维度。

例子1

假设 32 个样本( batch是32), 其中每个样本是 10 个 16 维向量的序列。 那么这个 batch 的形状是 (32, 10, 16),其中10表示时间片

而 input_shape(定义输入形状,上面是 输入数据的形状) 不包含样本数量的维度,所以是(10, 16),其中10表示时间片。

可以使用 TimeDistributed 来将 Dense 层独立地应用到 这 10 个时间步的每一个:

# 作为模型第一层
model = Sequential()
model.add(TimeDistributed(Dense(8), input_shape=(10, 16)))
# 现在 model.output_shape == (None, 10, 8)

输出的尺寸为 (32, 10, 8)。

在后续的层中,将不再需要 input_shape:

model.add(TimeDistributed(Dense(32)))
# 现在 model.output_shape == (None, 10, 32)

输出的尺寸为 (32, 10, 32)。

例子2

TimeDistributed 可以应用于任意层,如运用于 Conv2D 层:

model = Sequential()
model.add(TimeDistributed(Conv2D(64, (3, 3)),
                          input_shape=(10, 299, 299, 3)))

例子3

应用于Conv2D层:

from keras.models import Input,Model
from keras.layers import Dense,Conv2D,TimeDistributed

input_ = Input(shape=(12,32,32,3))
out = TimeDistributed(Conv2D(filters=32,kernel_size=(3,3),padding='same'))(input_)
model = Model(inputs=input_,outputs=out)
model.summary()

这里12代表就是时间序列,32,32,3指的是高,宽,通道数。
卷积操作使用TimeDistributed就相当与这12个时间序列共享一个卷积层参数信息,无论时间序列值为多少,参数总量还是一定的。此处一共有896个参数,卷积核weights有3×3×3×32=864个,卷积核bias有32个。

https://blog.csdn.net/zh_JNU/article/details/85160379