tf.keras.layers.TimeDistributed 作者:马育民 • 2020-06-02 10:37 • 阅读:10327 # 介绍 本文摘自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 原文出处:http://malaoshi.top/show_1EF5dM0Rri6f.html