介绍
本文摘自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个。