全部产品
云市场

PAI-TF数据转换方法

更新时间:2020-02-25 11:55:17

1. trans_csv_id2sparse Python接口

将标记有效位置的CSV字符串集合转换成为稀疏矩阵。

trans_csv_id2sparse(records, max_id, id_as_value=True, field_delim=”,”)

  • 接收输入参数:records:

    必填参数,类型string数组待解析CSV字符串数组(列表),以CSV格式由分隔符分隔

    max_id:

    必填参数,类型int64稀疏矩阵的最大列数,用于设定输出中的dense_shape值,若实际检出的ID有大于或等于该值的,则报错

    id_as_value:

    选填参数,类型bool,默认为True,将index编号作为稀疏矩阵中有效点的值,类型为int64无特殊情况不建议更改为False

    field_delim:

    选填参数,类型string,默认为’,’CSV格式数据的分隔符不支持数字、正负号、大小写’E’、小数点’.’和多字节分隔符当使用空格’ ‘做为分隔符时,多个连续空格将被视作一个分隔符

  • 输出:由Index CSV序列转换而得的Sparse Tensor,value类型为int64。

示例: 将一个batch的存有Index数据的String转换成一个sparse tensor:

  • Input:

    [“2,10”,“7”,“0,8”]

    • 需求:矩阵列宽度为20,有效点填入原Index。
  • 代码:

    1. outsparse = tf.trans_csv_id2sparse([“2,10”,“7”,“0,8”], 20)
  • 返回结果:
    1. SparseTensor(
    2. indices=[[0,2],[0,10],[1,7],[2,0],[2,8]],
    3. values=[2, 10, 7, 0, 8],
    4. dense_shape=[3,20])

2. trans_csv_kv2dense Python接口

将以Key/Value形式标记有效位置和值的CSV字符串集合转换成为稠密矩阵

trans_csv_kv2dense(records, max_id, field_delim=”,”)

  • 接收输入参数:records:

    必填参数,类型string数组待解析CSV字符串数组(列表),以CSV格式由分隔符分隔每一个数据项均为以’:’分隔的Key/Value形式数据,否则报错

    max_id:

    必填参数,类型int64输出的稠密矩阵的列数,若实际检测到ID值大于或等于该值,则报错

    field_delim:

    选填参数,类型string,默认为’,’CSV格式数据的分隔符不支持数字、正负号、大小写’E’、小数点’.’、冒号’:’和多字节分隔符当使用空格’ ‘做为分隔符时,多个连续空格将被视作一个分隔符

  • 输出:由K/V形式CSV序列转换而得的稠密矩阵,默认输出类型为float,空白处以0.0填充。

示例: 将一个batch以kv形式(Index: Value)存储的String转换成为一个稠密矩阵:

  • Input:
    1. [“1:0.1,2:0.2,4:0.4,10:1.0”,
    2. 0:0.22,3:0.33,9:0.99”,
    3. 2:0.24,7:0.84,8:0.96 ]
  • 需求:

    列宽设置为12

  • 代码:

    1. outmatrix = tf.trans_csv_kv2dense(
    2. [“1:0.1,2:0.2,4:0.4,10:1.0”,
    3. 0:0.22,3:0.33,9:0.99”,
    4. 2:0.24,7:0.84,8:0.96 ] , 12)
  • Output:
    1. [[0.0, 0.1, 0.2, 0.0, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]
    2. [0.22, 0.0, 0.0, 0.33, 0.0, 0.0, 0.0, 0.0, 0.0, 0.99, 0.0, 0.0]
    3. [0.0, 0.0, 0.24, 0.0, 0.0, 0.0, 0.0, 0.84, 0.96, 0.0, 0.0, 0.0]]

3. trans_csv_kv2sparse Python接口

将以Key/Value形式标记有效位置和值的CSV字符串集合转换成为稀疏矩阵。

trans_csv_kv2sparse(records, max_id, field_delim=”,”)

  • 接收输入参数:records:

    必填参数,类型string数组待解析CSV字符串数组(列表),以CSV格式由分隔符分隔每一个数据项均为以’:’分隔的Key/Value形式数据,否则报错当使用空格’ ‘做为分隔符时,多个连续空格将被视作一个分隔符

    max_id:

    必填参数,类型int64稀疏矩阵的最大列数,用于设定输出中的dense_shape值,若实际检出的ID有大于或等于该值的,则报错

    field_delim:

    选填参数,类型string,默认为’,’CSV格式数据的分隔符不支持数字、正负号、大小写’E’、小数点’.’和多字节分隔符**当使用空格’ ‘做为分隔符时,多个连续空格将被视作一个分隔符

  • 输出:由K/V形式CSV序列转换而得的稀疏矩阵,默认输出类型为float。

示例: 将一个batch以kv形式(Index: Value)存储的String转换成为一个稀疏矩阵:

  • Input:
    1. [“1:0.1,2:0.2,4:0.4,10:1.0”,
    2. 0:0.22,3:0.33,9:0.99”,
    3. 2:0.24,7:0.84,8:0.96 ]
  • 需求:

    列宽设置为20,生成稀疏矩阵Tensor

  • 代码:

    1. outsparse = tf.trans_csv_kv2sparse(
    2. [“1:0.1,2:0.2,4:0.4,10:1.0”,
    3. 0:0.22,3:0.33,9:0.99”,
    4. 2:0.24,7:0.84,8:0.96 ] , 20)
  • Output:
    1. SparseTensor(
    2. indices=[[0,1],[0,2],[0,4],[0,10],[1,0],[1,3],[1,9],[2,0],[2,7],[2,8]],
    3. values=[0.1, 0.2, 0.4, 1.0, 0.22, 0.33, 0.99, 0.24, 0.84, 0.96],
    4. dense_shape=[3,20])

4. trans_csv_id2dense Python接口

将标记有效位置的CSV字符串集合转换成为稠密矩阵。

trans_csv_id2dense(records, max_id, id_as_value=False, field_delim=”,”)

  • 接收输入参数:records:

    必填参数,类型string数组待解析CSV字符串数组(列表),以CSV格式由分隔符分隔

    max_id:

    必填参数,类型int64输出的稠密矩阵的列数,若实际检测到ID值大于或等于该值,则报错

    id_as_value:

    选填参数,类型bool,默认为False,稀疏矩阵中有效点的值将会填入int64(1)

    field_delim:

    选填参数,类型string,默认为’,’CSV格式数据的分隔符不支持数字、正负号、大小写’E’、小数点’.’、冒号’:’和多字节分隔符当使用空格’ ‘做为分隔符时,多个连续空格将被视作一个分隔符

  • 输出:由Index CSV序列转换而得的稠密矩阵,类型为int64,空白处以0值填充。

示例: 将一个batch的存有Index数据的String转换成一个稠密矩阵:

  • Input:

    [“2,10”,“7”,“0,8”]

    • 需求:列宽设置为12,有效点填入1
  • 代码:

    1. outmatrix = tf.trans_csv_id2dense(
    2. [“2,10”,“7”,“0,8”], 12)
  • Output:
    1. [[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0]
    2. [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
    3. [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]]

5. trans_csv_to_dense Python接口

将由数值组成的CSV字符串集合转换成为稠密矩阵

trans_csv_to_dense(records, max_id, field_delim=”,”)

  • 接收输入参数:records:

    必填参数,类型string数组待解析CSV字符串数组(列表),以CSV格式由分隔符分隔

    max_id:

    必填参数,类型int64输出的稠密矩阵的列数,若实际检测到CSV字符串的列数大于或等于该值,则报错

    field_delim:

    选填参数,类型string,默认为’,’CSV格式数据的分隔符不支持数字、正负号、大小写’E’、小数点’.’、和多字节分隔符当使用空格’ ‘做为分隔符时,多个连续空格将被视作一个分隔符

  • 输出:由CSV序列转换而得的稠密矩阵,默认类型为float,空白处以0.0填充。

示例: 将一个batch的CSV格式String转换成为一个稠密矩阵:

  • Input:
    1. [“0.1,0.2,0.4,1.0”,
    2. 0.22,0.33,0.99”,
    3. 0.24,0.84,0.96 ]
  • 需求:

    列宽设置为6

  • 代码:

    1. outmatrix = tf.trans_csv_to_dense(
    2. [“0.1,0.2,0.4,1.0”,
    3. 0.22,0.33,0.99”,
    4. 0.24,0.84,0.96 ] , 6)
  • Output:
    1. [[0.1, 0.2, 0.4, 1.0, 0.0, 0.0]
    2. [0.22, 0.33, 0.99, 0.0, 0.0, 0.0]
    3. [0.24, 0.84, 0.96, 0.0, 0.0, 0.0]]

6. 代码实例

以下这段代码利用TensorFlow从存放于Odps的数据表中读取数据,数据共有6列,第1列为ID,第2列为Key/Value格式的Csv数据,后4列为Index格式的Csv数据。数据读出后调用TransCsv的Op将这5列数据分别转换为1个稠密矩阵和4个稀疏矩阵,用于模型训练

  1. import tensorflow as tf
  2. import numpy as np
  3. def read_table(filename_queue):
  4. batch_size = 128
  5. reader = tf.TableRecordReader(csv_delimiter=';', num_threads=8, capacity=8*batch_size)
  6. key, value = reader.read_up_to(filename_queue, batch_size)
  7. values = tf.train.batch([value], batch_size=batch_size, capacity=8*capacity, enqueue_many=True, num_threads=8)
  8. record_defaults = [[1.0], [""], [""], [""], [""], [""]]
  9. feature_size = [1322,30185604,43239874,5758226,41900998]
  10. col1, col2, col3, col4, col5, col6 = tf.decode_csv(values, record_defaults=record_defaults, field_delim=';')
  11. col2 = tf.trans_csv_kv2dense(col2, feature_size[0])
  12. col3 = tf.trans_csv_id2sparse(col3, feature_size[1])
  13. col4 = tf.trans_csv_id2sparse(col4, feature_size[2])
  14. col5 = tf.trans_csv_id2sparse(col5, feature_size[3])
  15. col6 = tf.trans_csv_id2sparse(col6, feature_size[4])
  16. return [col1, col2, col3, col4, col5, col6]
  17. if __name__ == '__main__':
  18. tf.app.flags.DEFINE_string("tables", "", "tables")
  19. tf.app.flags.DEFINE_integer("num_epochs", 1000, "number of epoches")
  20. FLAGS = tf.app.flags.FLAGS
  21. table_pattern = FLAGS.tables
  22. num_epochs = FLAGS.num_epochs
  23. filename_queue = tf.train.string_input_producer(table_pattern, num_epochs)
  24. train_data = read_table(filename_queue)
  25. init_global = tf.global_variables_initializer()
  26. init_local = tf.local_variables_initializer()
  27. with tf.Session() as sess:
  28. sess.run(init_global)
  29. sess.run(init_local)
  30. coord = tf.train.Coordinator()
  31. threads = tf.train.start_queue_runners(sess=sess, coord=coord)
  32. for i in range(1000):
  33. sess.run(train_data)
  34. coord.request_stop()
  35. coord.join(threads)