【问题标题】:Using sequences of images for as an input for time distributed conv2d使用图像序列作为时间分布的 conv2d 的输入
【发布时间】:2020-10-26 14:52:24
【问题描述】:

我目前正在尝试构建一个模型,该模型使用图像序列并使用 TF 后端在 Keras 中对序列中的每个项目(不保留序列之间的状态)进行分类;但是,我遇到了第一层输入形状的问题。

模型如下所示:

model.add(TimeDistributed(Conv2D(64, (3, 3), activation='relu'), input_shape=(10, 1, 224, 224, 3)))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(1, 1))))

model.add(TimeDistributed(Conv2D(128, (4,4), activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))

model.add(TimeDistributed(Conv2D(256, (4,4), activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))

model.add(TimeDistributed(Flatten()))
model.add(Dropout(0.5))

model.add(LSTM(256, return_sequences=False, dropout=0.5))

model.add(Dense(num_classes, activation='sigmoid'))

我认为我的问题来自对数组形状缺乏了解,我很可能在这里犯了一个业余错误。每个单独的序列被加载到一个形状为 (10, 1, 224, 224, 3) 的 numpy 数组中,其中第一个轴是序列中的项目数(它们被填充为相同的长度),第二个是批次大小,其他的只是一个 RGB 图像。根据我阅读有关文档(和我的错误)的可用信息的理解,时间分布式包装器内的 conv2D 采用 5D 数组,本质上被格式化为(批量大小、行、列、通道)的正常 conv2D 输入加上添加的时间维度(序列中的每个项目)。这是否接近准确?

继续我面临的问题... 如果我尝试输入形状为 (10, 1, 224, 224, 3) 的图像序列,则会出现错误 “ValueError:输入通道数与过滤器的相应维度不匹配,224!= 3”。任何人都可以对此有所了解吗?我相当确定我没有正确塑造输入数组和 input_shape。

另一个我可能有人能回答的问题是: 一旦解决了这个问题并且我可以使用该序列作为输入,我该如何为模型提供不仅仅是如上所示的单个图像序列,而是使用序列数组?我的数据集由数千个这样的序列组成。我以前在这方面的所有经验都是使用 Caffe,当然没有使用循环模型,所以我不仅不熟悉实际实现循环网络,而且我对 Keras 整体不熟悉(尽管我开始学习,虽然慢慢地哈哈)。根据我的经验和观察,Caffe 在你和数据输入之间提供了一个沉重的抽象层,所以我以前从来没有处理过这个问题。

我希望这个问题和我的问题清晰简洁,非常感谢您提供的任何信息!

【问题讨论】:

    标签: python tensorflow machine-learning neural-network keras


    【解决方案1】:

    根据 Keras 文档,您必须将 input_dim 更新为

    model.add(TimeDistributed(Conv2D(64, (3, 3), activation='relu'), input_shape=(10, 224, 224, 3))) 

    然后使用适合新数据形状的图像生成器。 你可以在gist 中使用调整后的那个。

    它与主要的 Keras ImageDataGenerator 相同,但我添加了一个选项,可以在每次迭代中获取多个图像/帧。这是通过更改参数 frames_per_step 来指定您希望在每次迭代中包含的帧/图像的数量。

    这是如何使用它:

    从tweaked_ImageGenerator_v2 导入ImageDataGenerator
    数据生成 = ImageDataGenerator()
    train_data=datagen.flow_from_directory('path/to/data', target_size=(x, y), batch_size=32, frames_per_step=4)

    【讨论】:

    • 这是否与 ImageDataGenerator() 相同,但用于图像序列?这样就可以将图像用于 CNN+LSTM?不平衡帧作为视频类(图像)的序列呢
    • 是的,相同,但为图像序列添加了该功能。不平衡帧是什么意思?
    • 我的意思是不平衡帧,有些视频有更多的帧,例如classA的video1有200帧,而classA的video2有40帧。因为我猜 frames_per_step 是每一步从每个视频中获取的帧数?
    猜你喜欢
    • 2019-04-05
    • 1970-01-01
    • 2020-11-17
    • 2020-06-30
    • 2020-12-28
    • 1970-01-01
    • 2018-04-18
    • 2018-04-09
    • 2021-06-18
    相关资源
    最近更新 更多