我正在尝试实现一个LRCN/C(LSTM)RNN来对视频中的情绪进行分类。我的数据集结构分为两个文件夹 - "train_set"和"valid_set"。打开它们中的任何一个,您都可以找到3个文件夹,"positive"、"negative"和"surprise"。最后,这3个文件夹中的每一个都有视频文件夹,每个视频文件夹都是一个以.jpg格式呈现的视频帧集合。由于视频长度不同,因此一个视频文件夹可能有200帧,而紧挨着它的那个可能有1200、700等!为了加载数据集,我使用flow_from_directory。在这里,我需要澄清几点:
- 在我的情况下,
flow_from_directory
会顺序逐一地加载视频吗?它们的帧? - 如果我批量加载,
flow_from_directory
是否会根据视频图像的顺序按批次加载? - 如果我有一个包含5张图像的video_1文件夹和一个包含3个视频的video_2文件夹,并且批处理大小为7,
flow_from_directory
会选择两个批次,分别为5和3个视频,还是会重叠视频,从第一个文件夹中取出所有5个图像+第二个文件夹中的2个图像?它会混合我的视频吗? - 数据集加载是否是线程安全的?Worker 1按顺序从文件夹1中获取视频帧,Worker 2从文件夹2中获取等等...或者每个Worker都可以从任何位置和任何文件夹中获取帧,这可能会破坏我的顺序读取吗?
- 如果我启用
shuffle
,它会打乱读取视频文件夹的顺序,还是会随机从随机文件夹中开始获取帧? TimeDistributed
层是做什么的?从文档中我真的无法想象。如果我将其应用于CNN的密集层或CNN的每一层,会发生什么?
(1, frames, height, width, channels)
在TimeDistributed(Conv2D(...))
中,或者是(1, frames, features)
在RNN
或Dense
中。没有可见的迭代,每个层都会按照其应有的方式完成工作。(关于frames
,迭代在 RNN 内部不可见地发生)。 - Daniel Möllerreturn_sequences=True
以保留帧直到结尾 - 最后一层将对每个帧进行分类。或者您可以在最后一个RNN层中不选择它,以消除帧维度并获得“视频分类”。 - Daniel MöllerTimeDistributed(Conv2D())
,您的形状应为(batch, frames, height, width, channels)
,对于RNN和Dense
,则应为(batch, frames, allTheRest)
。 - Daniel Möllerbatch = movies
,每个电影都是一个样本/示例。不幸的是,没有自动文件夹读取功能。Keras没有标准的电影生成器。您必须在自定义生成器中控制文件夹结构和图像加载。因此,无论您的文件夹结构如何,只要您加载并分离哪些帧属于哪些电影即可。 - Daniel Möller