基于TFX的MLOps:使用Keras Sequence时如何导入数据?
关于TFX数据导入与CsvExampleGen的问题解答
问题背景
我正在使用一个名为DataGenerator的类,该类继承自tensorflow.keras.utils.Sequence,返回元组(data_array, label_array),代码如下:
from tensorflow.keras.utils import Sequence class DataGenerator(Sequence): """ path_data: the path of the csv files """ ...
该类读取目录下的多个.csv文件(每个文件对应单个实例的大体积数据,文件内容为单列数值),但不清楚如何通过tfx.v1.components.CsvExampleGen在TFX管道中完成数据导入,有两个疑问:
- 是否可以使用TFX进行数据导入,还是需要寻找其他替代方案?
- 能否使用CsvExampleGen读取目录下的批量文件?
问题1解答
完全可以用TFX完成这类数据的导入,不需要立刻更换其他方案。
TFX灵活性很高,虽然默认的CsvExampleGen是按行解析CSV数据为单个实例,但针对你这种“单文件对应单个大体积实例”的场景,有两种适配思路:
- 先做数据预处理:把每个单列CSV的所有数值合并成一行的单个字段(比如用逗号拼接成字符串,后续在TFX的Transform组件里再解析为张量),再用
CsvExampleGen读取处理后的文件。 - 自定义ExampleGen组件:继承TFX的
BaseExampleGen类,参考你现有DataGenerator的逻辑,实现从单个CSV文件生成单个TF Example的逻辑,直接接入TFX管道。
问题2解答
CsvExampleGen可以读取目录下的批量CSV文件,但默认行为是把每个CSV里的每一行当作一个训练实例,和你的“单文件对应单个实例”需求不匹配。
如果要直接用CsvExampleGen,必须先调整数据格式:比如写脚本遍历所有CSV文件,把每个文件的单列数据转换成一行(例如将所有数值用分隔符拼接成一个单元格),同时补充对应的标签字段,生成符合CsvExampleGen预期的CSV文件后再导入。如果不想修改原始数据,更推荐自定义ExampleGen组件来适配你的数据结构。
内容的提问来源于stack exchange,提问作者Alexander Martins
相关产品推荐
相关产品推荐

