Keras/TF:用于视觉识别的时间分布式 CNN+LSTM

cha*_*lfa 8 python neural-network deep-learning keras tensorflow

在此处输入图片说明

我正在尝试实现文章 ( https://arxiv.org/abs/1411.4389 ) 中的模型,该模型基本上由时间分布的 CNN 和一系列使用 Keras 和 TF 的 LSTM 组成。

但是,我在尝试确定是否应该TimeDirstibuted仅针对卷积和池化层或 LSTM包含该函数时遇到问题?

有没有办法并行运行 CNN 层(基于我要处理的序列中的帧数和我拥有的内核数)?

最后,假设每个条目由“n”帧(按顺序)组成,其中 n 根据当前数据条目而变化,最合适的输入维度是什么?“n”是批量大小吗?有没有办法将 // 中的 CNN 数量限制为例如 4(以便在处理 4 帧后获得输出 Y)?

PS:输入是小视频(即帧序列)

PS:输出维度与我的问题无关,所以这里不讨论

谢谢

ter*_*eru 8

[已编辑]
抱歉,只有一个链接的答案很糟糕。所以我试着一一回答问题。

我是否应该只为我的卷积和池化层或 LSTM 包含 TimeDirstibuted 函数?

仅将 TimeDistributed 函数用于 Conv 和 Pooling 层,不需要 LSTM。

有没有办法并行运行 CNN 层?

不,如果您使用 CPU。如果您使用 GPU,这是可能的。
使用 Keras 在 TensorFlow 上进行透明的多 GPU 训练

什么是最合适的输入维度?

五。(批次、时间、宽度、高度、通道)。

有没有办法将 // 中 CNN 的数量限制为例如 4

您可以在预处理中通过手动将帧对齐到特定数字来完成此操作,而不是在网络中。换句话说,如果你想在处理 4 帧后有输出,“时间”维度应该是 4。

model = Sequential()

model.add(
    TimeDistributed(
        Conv2D(64, (3, 3), activation='relu'), 
        input_shape=(data.num_frames, data.width, data.height, 1)
    )
)
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))))

# extract features and dropout 
model.add(TimeDistributed(Flatten()))
model.add(Dropout(0.5))

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

# classifier with sigmoid activation for multilabel
model.add(Dense(data.num_classes, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)

参考:
PRI-MATRIX 分解 - 基准