Package: ml-dataset
datasetsFree software: Apache Software License 2.0Documentation:https://ml-dataset.readthedocs.io.datasets for easy machine learning use
该项目的目的是提供一个简洁方便的dataset封装，使用少量代码即可实现的dataset，用以喂到模型中进行训练:同时支持tensorflow和pytorch支持从本地、HDFS、以及其他网络接口获取数据支持文本、lmdb、tfrecord等数据文件格式【可以大大提高训练时GPU利用率】支持文本、图像、语音等数据的基本处理支持多种数据增强(data agumentation)方法 【TODO 未完成】可以支持直接从输入数据文件，自动检查格式并生成适用于该数据的代码【TODO 未完成】Datasets 重要数据结构DataSchema : 用于描述数据schema的结构体name : 数据名称[每个数据名称不要重复]
processor : 对于该列数据需要使用的数据处理函数,具体参见data_processor_dicts, 包括对于数组、文本、图像、语音等的处理函数
type : 只对于TFDataset有用, 后续考虑去除掉该依赖
dtype : numpy的数据类型
shape : 处理后的数据shape
token_dict_name : 所需的词典【e.g. 】
is_with_len : 对于变长序列，是否需要产出数组变长维度的大小
max_len : 对于定长数组的最大长度设置TFDataset、PTDataset: dataset数据结构generate_dataset() : 用于产出dataset的接口Parser : 数据解析器TextlineParserdata_processor_dictsdata_processor_dicts是数据处理函数的集合词典，这里面包含了很多针对不同数据类型（e.g. 文本、语音、图像、数值等）进行特征提取、数据转换等处理，最终转换成Dataset,用以喂到模型进行训练预测等操作。example datatests/data/raw_datasets/query_float.input format:id\tlabel\tquery\tfloats1  1  面 对 疫 情  0.12 0.34 0.87 0.28
2  0  球 王 马 拉 多 纳 目 前 处 在 隔 离 之 中  0.12 0.34 0.87 0.28针对该数据集，需要新建feature_schema_list和label_schema , 完整代码可参考codetoken_dicts=TokenDicts('tests/data/dicts',{'query':0})data_field_list=[]# param = ["name", "processor", "type", "dtype", "shape", "max_len", "token_dict_name"]data_field_list.append(DataSchema(name='query',processor='to_tokenid',dtype='int32',shape=(None,),is_with_len=True,token_dict_name='query'))"""这里的DataSchema描述数据和处理逻辑如下:- 数据名称为query- 使用to_tokenid的func进行数据处理，处理完成后，数据shape为(None,),数据type为int32，词典名称是query- is_with_len=True意味着对于变长数据，会产出变长维度的具体大小"""data_field_list.append(DataSchema(name='width',processor='to_np',dtype='float32',shape=(4)))"""这里的DataSchema描述数据和处理逻辑如下:- 数据名称为label- 使用to_np的func进行数据处理，处理完成后，数据shape为(,),数据type为int32，词典名称是query"""label_field=DataSchema(name='label',processor='to_np',dtype='float32',shape=(1,))"""这里的DataSchema描述数据和处理逻辑如下:- 数据名称为label- 使用to_np的func进行数据处理，处理完成后，数据shape为(,),数据type为int32，词典名称是query"""#新建一个parser,该parser负责解析处理一般单行的数据输入parser=TextlineParser(token_dicts,data_field_list,label_field)# 新建generator，处理file_path下面，文件后缀是file_suffix的数据generator=TFDataset(parser=parser,file_path='tests/data/raw_datasets',file_suffix='query_float.input')# 产生datasetdataset=generator.generate_dataset(batch_size=12,num_epochs=1,is_shuffle=False)# 遍历datasetfor_inenumerate(dataset):passtests/data/raw_datasets/varnum.input format:id\tlabel\tnums1  2  2 3 4 6 8 23 435 234 12 234 234
1  2  2 3 4 6 8 23 4 2 9 4 5 6 2 4
1  2  2 3 4 6 8 23 45 24 12 234 234针对该数据集，需要新建feature_schema_list和label_schema , 完整代码可以参见codetoken_dicts=Nonedata_field_list=[]data_field_list.append(DataSchema(name='query',processor='to_np',dtype='int32',shape=(None,),is_with_len=True))label_field=DataSchema(name='label',processor='to_np',dtype='float32',shape=(1,),is_with_len=False)parser=TextlineParser(token_dicts,data_field_list,label_field)generator=TFDataset(parser=parser,file_path='tests/data/raw_datasets',file_suffix='varnum.input')# 产生datasetdataset=generator.generate_dataset(batch_size=12,num_epochs=1,is_shuffle=False)# 遍历datasetfor_inenumerate(dataset):passdataset遍历,可以参考pass_datasetdefpass_dataset(self,is_training,weight_fn,dataset):ifweight_fn:ifis_training:forbatch_num,(x,label,weight)inenumerate(dataset):print('x',x)print('weight',weight)fordinx:print('d.shape',d.shape)print('label.shape',label.shape)print('batch_num',batch_num)breakelse:ifis_training:forbatch_num,(x,label)inenumerate(dataset):print('x',x)fordinx:print('d.shape',d.shape)print('label.shape',label.shape)print('batch_num',batch_num)breakelse:forbatch_num,(info,x,label)inenumerate(dataset):print('info',info)print('x',x)fordinx:print('d.shape',d.shape)print('label.shape',label.shape)print('batch_num',batch_num)break交互式的自动代码生成运行 python -m datasets.cli$ python -m datasets.cli
输入代码生成目录 : outputs
请输入输入数据文件的文件路径:tests/data/raw_datasets/
输入数据文件后缀 : header_text_seq2seq.input
label schema: [['to_tokenid', 'text', 'int', [None]]]
feature schema: [['to_tokenid', 'text', 'int', [None]]]
input dict name forlabel :q
input dict name for feature :query :q然后在outputs文件夹下面生成dataset_reader.py，具体内容如下：importtensorflowastffromdatasetsimportTextlineParserfromdatasetsimportTFDatasetfromdatasets.utilsimportTokenDicts,DataSchemafile_path='tests/data/raw_datasets/'file_suffix='header_text_seq2seq.input'batch_size=64num_epochs=1is_shuffle=Truetoken_dicts=TokenDicts('dicts',{'q':0})label_schema_list=[]label_schema_list.append(DataSchema(name='label',processor='to_tokenid',dtype='int',shape=(None,),token_dict_name='q'))feature_schema_list=[]feature_schema_list.append(DataSchema(name='query',processor='to_tokenid',dtype='int',shape=(None,),token_dict_name='q'))parser=TextlineParser(token_dicts,feature_schema_list,label_schema_list)generator=TFDataset(parser=parser,file_path=file_path,file_suffix=file_suffix)dataset=generator.generate_dataset(batch_size=batch_size,num_epochs=num_epochs,is_shuffle=is_shuffle)for_inenumerate(dataset):pass