すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:PAI-TensorFlowでのデータ変換

最終更新日:Dec 23, 2024

このトピックでは、データをPAI-TensorFlowでサポートされているデータ型に変換する方法について説明します。 これにより、モデルトレーニングの効果と効率が向上します。

警告

GPUアクセラレーションサーバーは段階的に廃止されます。 CPUサーバーで実行されるTensorFlowタスクを送信できます。 モデルトレーニングにGPU高速化インスタンスを使用する場合は、Deep Learning Containers (DLC) に移動してジョブを送信します。 詳細については、「トレーニングジョブの送信」をご参照ください。

Pythonインターフェイス: trans_csv_id2sparse

有効な位置をマークするCSV文字列の配列をスパース行列に変換します。

trans_csv_id2sparse(records, max_id, id_as_value=True, field_delim=",")
  • パラメーターを設定します。 下表に、各パラメーターを説明します。

    パラメーター

    必須 / 任意

    説明

    レコード

    変換するCSV文字列の配列。 このパラメーターの値はSTRING型です。 CSV文字列は区切り文字で区切ります。

    max_id

    出力スパース行列の最大列数。 このパラメーターの値はINT64型です。 このパラメータは、dense_shapeの出力値を指定します。 実際のID値がdense_shapeの値以上の場合、システムはエラーを報告します。

    id_as_value

    不可

    インデックス番号をスパース行列の有効な位置の値として使用するかどうかを指定します。 このパラメーターの値はBOOL型です。 デフォルト値は True です。 有効なポイントの値はINT64タイプです。 特に指定がない限り、このパラメーターをFalseに設定しないことを推奨します。

    field_delim

    不可

    このパラメーターの値はSTRING型です。 デフォルト値はコンマ (,) です。 CSVデータの区切り文字。 区切り文字は、数字、正の記号 (+) 、負の記号 (-) 、小文字のe、大文字のE、ピリオド (.) 、またはマルチバイトの区切り文字にすることはできません。 スペースを区切り文字として使用する場合、連続するスペースは1つの区切り文字と見なされます。

  • 出力: インデックスCSV文字列から変換されたスパーステンソル。 このパラメーターの値はINT64型です。

例: インデックスデータを含む文字列のバッチをスパーステンソルに変換します。

  • 入力:

    ["2,10","7","0,8"]
  • 要件 :

    行列列の幅を20に設定します。 有効なポイントは、変換前のインデックスです。

  • Code:

    outsparse = tf.trans_csv_id2sparse(["2,10","7","0,8"], 20)
  • 結果:

    SparseTensor(
    indices=[[0,2],[0,10],[1,7],[2,0],[2,8]],
    values=[2, 10, 7, 0, 8],
    dense_shape=[3,20])

Pythonインターフェース: trans_csv_kv2dense

有効な位置とその値をマークするCSV文字列のコレクションを密な行列に変換します。 有効な位置とその値は、キーと値のペア形式です。

trans_csv_kv2dense(records, max_id, field_delim=",")
  • パラメーターを設定します。 下表に、各パラメーターを説明します。

    パラメーター

    必須 / 任意

    説明

    レコード

    解析するCSV文字列の配列。 このパラメーターの値はSTRING型です。 CSV文字列は区切り文字で区切ります。 各CSV文字列は、キーと値のペア形式です。 各ペアのキーと値は、コロン (:) で区切る必要があります。 有効化しない場合、システムによりエラーが報告されます。

    max_id

    出力密行列の列の最大数。 このパラメーターの値はINT64型です。 実際のID値が最大列数以上の場合、システムはエラーを報告します。

    field_delim

    不可

    このパラメーターの値はSTRING型です。 デフォルト値はコンマ (,) です。 CSVデータの区切り文字。 区切り文字は、数字、正の記号 (+) 、負の記号 (-) 、小文字のe、大文字のE、ピリオド (.) 、またはマルチバイトの区切り文字にすることはできません。 スペースを区切り文字として使用する場合、連続するスペースは1つの区切り文字と見なされます。

  • 出力: キーと値のペア形式のインデックスCSV文字列から変換された密な行列。 デフォルトの出力はFLOATタイプです。 空白は0.0で埋められます。

例: Index: value形式のキーと値のペアを含む文字列のバッチを密な行列に変換します。

  • 入力:

    ["1:0.1,2:0.2,4:0.4,10:1.0",
    "0:0.22,3:0.33,9:0.99",
    "2:0.24,7:0.84,8:0.96"]
  • 要件 :

    列の幅を12に設定します。

  • Code:

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

    [[0.0, 0.1, 0.2, 0.0, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]
    [0.22, 0.0, 0.0, 0.33, 0.0, 0.0, 0.0, 0.0, 0.0, 0.99, 0.0, 0.0]
    [0.0, 0.0, 0.24, 0.0, 0.0, 0.0, 0.0, 0.84, 0.96, 0.0, 0.0, 0.0]]

Pythonインターフェイス: trans_csv_kv2sparse

有効な位置とその値をマークするCSV文字列のコレクションをスパース行列に変換します。 有効な位置とその値は、キーと値のペア形式です。

trans_csv_kv2sparse(records, max_id, field_delim=",")
  • パラメーターを設定します。 下表に、各パラメーターを説明します。

    パラメーター

    必須 / 任意

    説明

    レコード

    解析するCSV文字列の配列。 このパラメーターの値はSTRING型です。 CSV文字列は区切り文字で区切ります。 各CSV文字列は、キーと値のペア形式です。 各ペアのキーと値は、コロン (:) で区切る必要があります。 有効化しない場合、システムによりエラーが報告されます。 スペースを区切り文字として使用する場合、連続するスペースは1つの区切り文字と見なされます。

    max_id

    出力スパース行列の最大列数。 このパラメーターの値はINT64型です。 このパラメータは、dense_shapeの出力値を指定します。 実際のID値がdense_shapeの値以上の場合、システムはエラーを報告します。

    field_delim

    不可

    このパラメーターの値はSTRING型です。 デフォルト値はコンマ (,) です。 CSVデータの区切り文字。 区切り文字は、数字、正の記号 (+) 、負の記号 (-) 、小文字のe、大文字のE、ピリオド (.) 、またはマルチバイトの区切り文字にすることはできません。 スペースを区切り文字として使用する場合、連続するスペースは1つの区切り文字と見なされます。

  • 出力: キーと値のペア形式のインデックスCSV文字列から変換されたスパース行列。 デフォルトの出力はFLOATタイプです。

例: インデックス: 値形式のキーと値のペアを含む文字列のバッチをスパース行列に変換します。

  • 入力:

    ["1:0.1,2:0.2,4:0.4,10:1.0",
    "0:0.22,3:0.33,9:0.99",
    "2:0.24,7:0.84,8:0.96"]
  • 要件 :

    スパース行列テンソルを生成するには、列の幅を20に設定します。

  • Code:

    outsparse = tf.trans_csv_kv2sparse(
    ["1:0.1,2:0.2,4:0.4,10:1.0",
     "0:0.22,3:0.33,9:0.99",
     "2:0.24,7:0.84,8:0.96" ] , 20)
  • 結果:

    SparseTensor(
    indices=[[0,1],[0,2],[0,4],[0,10],[1,0],[1,3],[1,9],[2,0],[2,7],[2,8]],
    values=[0.1, 0.2, 0.4, 1.0, 0.22, 0.33, 0.99, 0.24, 0.84, 0.96],
    dense_shape=[3,20])

Pythonインターフェース: trans_csv_id2dense

有効な位置をマークするCSV文字列のコレクションを密な行列に変換します。

trans_csv_id2dense(records, max_id, id_as_value=False, field_delim=",")
  • パラメーターを設定します。 下表に、各パラメーターを説明します。

    パラメーター

    必須 / 任意

    説明

    レコード

    解析するCSV文字列の配列。 このパラメーターの値はSTRING型です。 CSV文字列は区切り文字で区切ります。

    max_id

    出力密行列の列の最大数。 このパラメーターの値はINT64型です。 実際のID値が最大列数以上の場合、システムはエラーを報告します。

    id_as_value

    不可

    INT64型のデータをスパース行列の有効なポイントの値として使用するかどうかを指定します。 このパラメーターの値はBOOL型です。 デフォルト値:False。

    field_delim

    不可

    このパラメーターの値はSTRING型です。 デフォルト値はコンマ (,) です。 CSVデータの区切り文字。 区切り文字は、数字、正の記号 (+) 、負の記号 (-) 、小文字のe、大文字のE、ピリオド (.) 、またはマルチバイトの区切り文字にすることはできません。 スペースを区切り文字として使用する場合、連続するスペースは1つの区切り文字と見なされます。

  • 出力: インデックスCSV文字列から変換された密なテンソル。 空白は0.0で埋められます。

例: インデックスデータを含む文字列のバッチを密行列に変換します。

  • 入力:

    ["2,10","7","0,8"]
  • 要件 :

    列の幅を12に、有効なポイントを1に設定します。

  • Code:

    outmatrix = tf.trans_csv_id2dense(
    ["2,10","7","0,8"], 12)
  • 結果:

    [[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0]
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
    [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]]

Pythonインターフェース: trans_csv_to_dense

数値を含むCSV文字列のコレクションを密な行列に変換します。

trans_csv_to_dense(records, max_id, field_delim=",")
  • パラメーターを設定します。 下表に、各パラメーターを説明します。

    パラメーター

    必須 / 任意

    説明

    レコード

    変換するCSV文字列の配列。 このパラメーターの値はSTRING型です。 CSV文字列は区切り文字で区切ります。

    max_id

    出力密行列の列の最大数。 このパラメーターの値はINT64型です。 CSV文字列の最大列数がこのパラメーターの値以上の場合、システムはエラーを報告します。

    field_delim

    不可

    このパラメーターの値はSTRING型です。 デフォルト値はコンマ (,) です。 CSVデータの区切り文字。 区切り文字は、数字、正の記号 (+) 、負の記号 (-) 、小文字のe、大文字のE、ピリオド (.) 、またはマルチバイトの区切り文字にすることはできません。 スペースを区切り文字として使用する場合、連続するスペースは1つの区切り文字と見なされます。

  • 出力: キーと値のペア形式のインデックスCSV文字列から変換された密な行列。 デフォルトの出力はFLOATタイプです。 空白は0.0で埋められます。

例: インデックスデータを含むCSV文字列のバッチを密行列に変換します。

  • 入力:

    ["0.1,0.2,0.4,1.0",
    "0.22,0.33,0.99",
    "0.24,0.84,0.96"] 
  • 要件 :

    列の幅を6に設定します。

  • Code:

    outmatrix = tf.trans_csv_to_dense(
    ["0.1,0.2,0.4,1.0",
     "0.22,0.33,0.99",
     "0.24,0.84,0.96" ] , 6)
  • 結果:

    [[0.1, 0.2, 0.4, 1.0, 0.0, 0.0]
    [0.22, 0.33, 0.99, 0.0, 0.0, 0.0]
    [0.24, 0.84, 0.96, 0.0, 0.0, 0.0]]

サンプルコード

次のサンプルコードでは、TensorFlowを使用してMaxComputeに格納されているデータテーブルからデータを読み取ります。 テーブルは6つの列を含む。 最初の列はIDを含みます。 2番目の列には、キーと値のペア形式のCSVデータが含まれます。 最後の4つの列には、インデックス形式のCSVデータが含まれます。 システムがデータを読み取った後、TransCSVのODPSを呼び出して、5列のCSVデータをモデルトレーニング用の密行列と4つの疎行列に変換します。

import tensorflow as tf
import numpy as np
def read_table(filename_queue):
    batch_size = 128
    reader = tf.TableRecordReader(csv_delimiter=';', num_threads=8, capacity=8*batch_size)
    key, value = reader.read_up_to(filename_queue, batch_size)
    values = tf.train.batch([value], batch_size=batch_size, capacity=8*capacity, enqueue_many=True, num_threads=8)
    record_defaults = [[1.0], [""], [""], [""], [""], [""]]
    feature_size = [1322,30185604,43239874,5758226,41900998]
    col1, col2, col3, col4, col5, col6 = tf.decode_csv(values, record_defaults=record_defaults, field_delim=';')
    col2 = tf.trans_csv_kv2dense(col2, feature_size[0])
    col3 = tf.trans_csv_id2sparse(col3, feature_size[1])
    col4 = tf.trans_csv_id2sparse(col4, feature_size[2])
    col5 = tf.trans_csv_id2sparse(col5, feature_size[3])
    col6 = tf.trans_csv_id2sparse(col6, feature_size[4])
    return [col1, col2, col3, col4, col5, col6]
if __name__ == '__main__':
    tf.app.flags.DEFINE_string("tables", "", "tables")
    tf.app.flags.DEFINE_integer("num_epochs", 1000, "number of epoches")
    FLAGS = tf.app.flags.FLAGS
    table_pattern = FLAGS.tables
    num_epochs = FLAGS.num_epochs
    filename_queue = tf.train.string_input_producer(table_pattern, num_epochs)
    train_data = read_table(filename_queue)
    init_global = tf.global_variables_initializer()
    init_local = tf.local_variables_initializer()
    with tf.Session() as sess:
      sess.run(init_global)
      sess.run(init_local)
      coord = tf.train.Coordinator()
      threads = tf.train.start_queue_runners(sess=sess, coord=coord)
      for i in range(1000):
        sess.run(train_data)
      coord.request_stop()
      coord.join(threads)