TensorFlow中TimeDistributed层输出形状解析:为何示例输出为TensorShape([None, 10, 126, 126, 64])?
为什么TimeDistributed包裹Conv2D后得到这样的输出形状?
这问题其实很好理解,咱们一步步拆解每个维度的变化就清楚了:
1. 先明确输入的形状含义
咱们先看输入定义:
inputs = tf.keras.Input(shape=(10, 128, 128, 3))
这里的shape=(10, 128, 128, 3)对应的每个维度含义:
None:代表批量大小(比如一次训练喂多少个样本),这是动态值,所以输出里会保留这个维度10:这是时间步/序列长度,可以理解成我们有10张连续的图像(比如视频中的10帧)128, 128:每一张图像的高度和宽度3:图像的通道数(RGB三通道)
2. 分析Conv2D层的输出变化
接下来看用到的卷积层:
conv_2d_layer = tf.keras.layers.Conv2D(64, (3, 3))
这里的参数和默认行为决定了单张图像的输出形状:
64:卷积后输出的特征图通道数,也就是最终每个位置会有64个特征值(3,3):卷积核的尺寸是3x3- 默认设置:
padding='valid'(不做边缘补零)、strides=(1,1)(卷积核每次移动1步)
根据卷积输出尺寸的计算公式:输出尺寸 = (输入尺寸 - 卷积核尺寸) / 步长 + 1
代入数值计算高和宽:(128 - 3)/1 + 1 = 126
所以单张(128,128,3)的图像经过这个Conv2D后,会变成(126,126,64)。
3. TimeDistributed层的核心作用
最后看TimeDistributed层的作用:它会把包裹的Conv2D层,独立应用到输入序列的每一个时间步上。
也就是说,输入里的10个时间步(10张图像),每一张都会单独过一遍Conv2D,得到10个(126,126,64)的结果。
把这些结果按时间步维度拼接起来,再加上动态的批量维度,就得到了最终的输出形状:
TensorShape([None, 10, 126, 126, 64])
内容的提问来源于stack exchange,提问作者Ng Lok Chun
相关产品推荐
相关产品推荐

