train_pipeline封装进了data.train.dataset,这种封装是怎么保证按次序进行处理的?
在深度学习框架中,通常是通过一种叫做 "Transformer" 的设计模式来保证数据处理流水线的有序执行。
以 PyTorch 的
torchvision.transforms
模块为例,它就提供了一种Compose
类,用于将多个数据变换操作串联起来,并按照指定的顺序依次应用。
data
配置字典中,train_pipeline
就是使用类似的方式定义的:
train_pipeline = [
dict(type='SomePreprocessor1', ...),
dict(type='SomePreprocessor2', ...),
dict(type='SomePreprocessor3', ...),
...
]
这里的每一个字典元素都代表一个数据预处理操作,它们会被依次应用到输入数据上。
在数据集内部,会使用一个类似于 Compose
的转换器类来管理这个流水线。
这个 Compose 类的实现方式大致如下:
class Compose:
def __init__(self, transforms):
self.transforms = transforms
def __call__(self, data):
for t in self.transforms:
data = t(data)
return data
可以看到,Compose
类接受一个列表形式的数据变换操作列表,在 __call__
方法中依次调用这些变换操作,并将数据在变换操作之间传递。
这样,我们就可以确保 train_pipeline
、val_pipeline
和 test_pipeline
中定义的数据处理操作能够按照指定的顺序执行,从而保证整个数据处理流水线的有序性。
这种设计模式广泛应用于各种深度学习框架中,能够有效地管理复杂的数据处理流程。数据集使用者只需要关注如何配置好数据处理流水线,而无需自己实现复杂的流程控制逻辑。
https://github.com/kennymckormick/pyskl/blob/main/pyskl/datasets/pipelines/compose.py
https://github.com/kennymckormick/pyskl/blob/main/configs/posec3d/slowonly_r50_ntu60_xsub/limb.py