【问题标题】:How to use TimeDistributed Layer with Convolutional layer?如何将 TimeDistributed 层与卷积层一起使用?
【发布时间】:2019-10-30 19:06:22
【问题描述】:

我正在尝试构建一个非常基本的自动驾驶汽车转向角预测问题。我有一个以 30fps 拍摄的视频,我已将其转换为大约 50000 的图像(即大约 25 分钟的镜头),我正在尝试预测转向角的目标。

我尝试使用几个基本的卷积层,但我得到的 MSE 非常糟糕。所以,我正在尝试使用 CNN + RNN 来改进我的模型。因为我的数据是时间分布的,所以使用 RNN 很有意义。

我不知道如何使用TimeDistributed LayerLSTM。我基本上在使用下面这样的东西,我有每个形状的图像width, height, channel = (200, 66, 3)

img_height = 66
img_width = 200
channels = 3

input_l = Input(shape=(img_height, img_width, channels))
x = layers.Conv2D(128, kernel_size=(5, 5))(input_l)
x = layers.Conv2D(256, kernel_size=(5, 5))(x)
x = Flatten()(x)
out = Dense(1)(x)
model = Model(inputs=input_l, outputs=out)
model.summary()

据我所知,TimeDistributedLayer 需要 4 个维度才能工作,但我的每个图像都是形状 (200, 66, 3),我如何将每个图像转换为四个维度。我无法弄清楚如何确切地使用它。我已经阅读了几篇文章,但没有一篇文章谈到这一点。

如何将时间分布层与 LSTM 结合到此架构中?任何人都可以提供有关如何实现它的示例代码。

【问题讨论】:

    标签: python python-3.x tensorflow keras conv-neural-network


    【解决方案1】:

    TimeDistributed 层假定维度 1 是时间维度(时间步长),因此您需要在图像数据中添加时间维度。类似的东西:

    from keras import layers
    from keras import models
    
    time_steps = 10
    img_height = 66
    img_width = 200
    channels = 3
    
    input_l = layers.Input(shape=(time_steps, img_height, img_width, channels))
    x = layers.TimeDistributed( layers.Conv2D( 32, kernel_size=(5, 5) ) ) (input_l)
    x = layers.TimeDistributed( layers.Conv2D(256, kernel_size=(5, 5)) ) (x)
    x = layers.Flatten()(x)
    out = layers.Dense(1)(x)
    model = models.Model(inputs=input_l, outputs=out)
    model.summary()
    

    我希望这会有所帮助。

    【讨论】:

    • 但我的输入是图像,并且有 3 维对吗?每个图像是(宽度,高度,通道)。当它需要 4 维输入时,我该如何传递它。我所有的火车图像都在火车文件夹中,测试图像在测试文件夹中。你能提供一些关于如何将数据处理到这个模型中的代码吗?
    • 如果我理解您的处理过程,您从转换为图像的视频开始。根据您计划创建模型的方式,您需要将一些图像帧打包成一个 4 维数组。例如,您可以创建 5 秒的数据 (5*30 fps),这将为您提供 150 个时间步/帧,每个时间步都有一个 3D 图像,并且 150 帧序列将被网络视为一个“样本” .然后,LSTM 将根据 150 个时间步长进行预测。我希望这是有道理的并有所帮助。
    • 这意味着我批次中的每个样本的形状(5(图像),宽度,高度,通道)是正确的。如果我考虑批量大小为 32,那么一批的大小将是(32、5、宽度、高度、通道),这意味着每个样本包含 5 个图像。我说的对吗?
    • 在这里我正在做一个回归问题,所以我的一批的 y 目标将是形状 (32, 5) 不是吗?但在这里我收到一个错误 ValueError: A target array with shape (160, 5) was passed for an output of shape (None, 1) while using as loss mean_squared_error. This loss expects targets to have the same shape as the output.
    • 如果您能提供一个带有虚拟示例数据集的示例,我将不胜感激。所以我可以检查输入的大小。我似乎无法弄清楚目标输入的确切形状。
    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多