Komponen Pipa TFX Transform

Komponen pipeline Transform TFX melakukan rekayasa fitur pada tf.Examples yang dipancarkan dari komponen ExampleGen , menggunakan skema data yang dibuat oleh komponen SchemaGen , dan memancarkan SavedModel serta statistik pada data pra-transformasi dan pasca-transformasi. Saat dieksekusi, SavedModel akan menerima tf.Examples yang dipancarkan dari komponen ExampleGen dan memancarkan data fitur yang diubah.

  • Menggunakan: tf.Examples dari komponen ExampleGen, dan skema data dari komponen SchemaGen.
  • Memancarkan: SavedModel ke komponen Trainer, statistik pra-transformasi dan pasca-transformasi.

Mengonfigurasi Komponen Transform

Setelah preprocessing_fn Anda ditulis, itu perlu didefinisikan dalam modul python yang kemudian diberikan ke komponen Transform sebagai masukan. Modul ini akan dimuat oleh transform dan fungsi bernama preprocessing_fn akan ditemukan dan digunakan oleh Transform untuk membangun pipa preprocessing.

transform = Transform(
    examples=example_gen.outputs['examples'],
    schema=schema_gen.outputs['schema'],
    module_file=os.path.abspath(_taxi_transform_module_file))

Selain itu, Anda mungkin ingin memberikan opsi untuk penghitungan statistik pratransformasi atau pascatransformasi berbasis TFDV. Untuk melakukannya, tentukan stats_options_updater_fn di dalam modul yang sama.

Transformasi dan Transformasi TensorFlow

Transform menggunakan TensorFlow Transform secara ekstensif untuk melakukan rekayasa fitur pada set data Anda. Transformasi TensorFlow adalah alat yang hebat untuk mengubah data fitur sebelum masuk ke model Anda dan sebagai bagian dari proses pelatihan. Transformasi fitur umum meliputi:

  • Embedding : mengonversi fitur jarang (seperti ID bilangan bulat yang dihasilkan oleh kosakata) menjadi fitur padat dengan menemukan pemetaan bermakna dari ruang berdimensi tinggi ke ruang berdimensi rendah. Lihat unit Penyematan di Kursus Singkat Machine-learning untuk pengantar penyematan.
  • Pembuatan kosakata : mengubah string atau fitur non-numerik lainnya menjadi bilangan bulat dengan membuat kosakata yang memetakan setiap nilai unik ke nomor ID.
  • Nilai normalisasi : mengubah fitur numerik sehingga semuanya berada dalam kisaran yang sama.
  • Bucketization : mengonversi fitur bernilai kontinu menjadi fitur kategorikal dengan menetapkan nilai ke bucket diskrit.
  • Memperkaya fitur teks : menghasilkan fitur dari data mentah seperti token, n-gram, entitas, sentimen, dll., untuk memperkaya kumpulan fitur.

Transformasi TensorFlow menyediakan dukungan untuk ini dan banyak jenis transformasi lainnya:

  • Secara otomatis menghasilkan kosakata dari data terbaru Anda.

  • Lakukan transformasi sewenang-wenang pada data Anda sebelum mengirimkannya ke model Anda. Transformasi TensorFlow membuat transformasi menjadi grafik TensorFlow untuk model Anda sehingga transformasi yang sama dilakukan pada waktu pelatihan dan inferensi. Anda dapat menentukan transformasi yang merujuk ke properti global data, seperti nilai maksimal fitur di semua instance pelatihan.

Anda dapat mengubah data sesuka Anda sebelum menjalankan TFX. Namun jika Anda melakukannya dalam Transformasi TensorFlow, transformasi menjadi bagian dari grafik TensorFlow. Pendekatan ini membantu menghindari pelatihan/penyajian yang miring.

Transformasi di dalam kode pemodelan Anda menggunakan FeatureColumns. Dengan menggunakan FeatureColumns, Anda dapat menentukan bucketisasi, integerisasi yang menggunakan kosakata yang telah ditentukan sebelumnya, atau transformasi lainnya yang dapat ditentukan tanpa melihat data.

Sebaliknya, Transformasi TensorFlow dirancang untuk transformasi yang memerlukan data yang diteruskan sepenuhnya untuk menghitung nilai yang tidak diketahui sebelumnya. Misalnya, pembuatan kosa kata membutuhkan data yang lengkap.

Selain menghitung nilai menggunakan Apache Beam, TensorFlow Transform memungkinkan pengguna menyematkan nilai ini ke dalam grafik TensorFlow, yang kemudian dapat dimuat ke dalam grafik pelatihan. Misalnya saat menormalkan fitur, fungsi tft.scale_to_z_score akan menghitung rata-rata dan standar deviasi fitur, dan juga representasi, dalam grafik TensorFlow, dari fungsi yang mengurangi rata-rata dan membaginya dengan standar deviasi. Dengan menampilkan grafik TensorFlow, bukan hanya statistik, Transformasi TensorFlow menyederhanakan proses pembuatan pipeline prapemrosesan Anda.

Karena prapemrosesan dinyatakan sebagai grafik, ini dapat terjadi di server, dan dijamin konsisten antara pelatihan dan penyajian. Konsistensi ini menghilangkan satu sumber pelatihan/penyajian miring.

Transformasi TensorFlow memungkinkan pengguna menentukan pipeline prapemrosesan mereka menggunakan kode TensorFlow. Artinya, pipeline dibangun dengan cara yang sama seperti grafik TensorFlow. Jika hanya operasi TensorFlow yang digunakan dalam grafik ini, pipeline akan menjadi peta murni yang menerima batch input dan mengembalikan batch output. Pipeline seperti itu akan setara dengan menempatkan grafik ini di dalam input_fn Anda saat menggunakan API tf.Estimator . Untuk menentukan operasi full-pass seperti kuantil komputasi, Transformasi TensorFlow menyediakan fungsi khusus yang disebut analyzers yang tampak seperti operasi TensorFlow, tetapi sebenarnya menentukan komputasi yang ditangguhkan yang akan dilakukan oleh Apache Beam, dan output dimasukkan ke dalam grafik sebagai konstan. Sementara operasi TensorFlow biasa akan mengambil satu batch sebagai inputnya, melakukan beberapa perhitungan hanya pada batch itu dan mengeluarkan batch, analyzer akan melakukan pengurangan global (diimplementasikan dalam Apache Beam) pada semua batch dan mengembalikan hasilnya.

Dengan menggabungkan operasi TensorFlow biasa dan penganalisis Transformasi TensorFlow, pengguna dapat membuat pipeline kompleks untuk melakukan praproses data mereka. Misalnya fungsi tft.scale_to_z_score mengambil tensor input dan mengembalikan tensor yang dinormalisasi menjadi mean 0 dan varians 1 . Hal ini dilakukan dengan memanggil mean dan var analyzer di bawah tenda, yang secara efektif akan menghasilkan konstanta dalam grafik yang sama dengan mean dan varian dari tensor input. Ini kemudian akan menggunakan operasi TensorFlow untuk mengurangi rata-rata dan membaginya dengan standar deviasi.

Preprocessing_fn Transformasi preprocessing_fn

Komponen TFX Transform menyederhanakan penggunaan Transform dengan menangani panggilan API yang terkait dengan membaca dan menulis data, dan menulis keluaran SavedModel ke disk. Sebagai pengguna TFX, Anda hanya perlu mendefinisikan satu fungsi bernama preprocessing_fn . Di preprocessing_fn Anda menentukan serangkaian fungsi yang memanipulasi input dict tensor untuk menghasilkan output dict tensor. Anda dapat menemukan fungsi pembantu seperti scale_to_0_1 dan compute_and_apply_vocabulary pada TensorFlow Transform API atau menggunakan fungsi TensorFlow reguler seperti yang ditunjukkan di bawah ini.

def preprocessing_fn(inputs):
  """tf.transform's callback function for preprocessing inputs.

  Args:
    inputs: map from feature keys to raw not-yet-transformed features.

  Returns:
    Map from string feature key to transformed feature operations.
  """
  outputs = {}
  for key in _DENSE_FLOAT_FEATURE_KEYS:
    # If sparse make it dense, setting nan's to 0 or '', and apply zscore.
    outputs[_transformed_name(key)] = transform.scale_to_z_score(
        _fill_in_missing(inputs[key]))

  for key in _VOCAB_FEATURE_KEYS:
    # Build a vocabulary for this feature.
    outputs[_transformed_name(
        key)] = transform.compute_and_apply_vocabulary(
            _fill_in_missing(inputs[key]),
            top_k=_VOCAB_SIZE,
            num_oov_buckets=_OOV_SIZE)

  for key in _BUCKET_FEATURE_KEYS:
    outputs[_transformed_name(key)] = transform.bucketize(
        _fill_in_missing(inputs[key]), _FEATURE_BUCKET_COUNT)

  for key in _CATEGORICAL_FEATURE_KEYS:
    outputs[_transformed_name(key)] = _fill_in_missing(inputs[key])

  # Was this passenger a big tipper?
  taxi_fare = _fill_in_missing(inputs[_FARE_KEY])
  tips = _fill_in_missing(inputs[_LABEL_KEY])
  outputs[_transformed_name(_LABEL_KEY)] = tf.where(
      tf.is_nan(taxi_fare),
      tf.cast(tf.zeros_like(taxi_fare), tf.int64),
      # Test if the tip was > 20% of the fare.
      tf.cast(
          tf.greater(tips, tf.multiply(taxi_fare, tf.constant(0.2))), tf.int64))

  return outputs

Memahami input ke preprocessing_fn

preprocessing_fn menjelaskan serangkaian operasi pada tensor (yaitu, Tensor s, SparseTensor s, atau RaggedTensor s). Untuk mendefinisikan preprocessing_fn dengan benar, perlu dipahami bagaimana data direpresentasikan sebagai tensor. Input ke preprocessing_fn ditentukan oleh skema. Proto Schema akhirnya diubah menjadi "spesifikasi fitur" (terkadang disebut "spesifikasi parsing") yang digunakan untuk parsing data, lihat detail lebih lanjut tentang logika konversi di sini .

Menggunakan Transformasi TensorFlow untuk menangani label string

Biasanya seseorang ingin menggunakan Transformasi TensorFlow untuk menghasilkan kosa kata dan menerapkan kosa kata tersebut untuk mengonversi string menjadi bilangan bulat. Saat mengikuti alur kerja ini, input_fn yang dibuat dalam model akan menampilkan string bilangan bulat. Namun label adalah pengecualian, karena agar model dapat memetakan label keluaran (bilangan bulat) kembali ke string, model memerlukan input_fn untuk mengeluarkan label string, bersama dengan daftar kemungkinan nilai label. Misalnya, jika labelnya adalah cat dan dog , maka output dari input_fn harus berupa string mentah ini, dan kunci ["cat", "dog"] perlu diteruskan ke estimator sebagai parameter (lihat detail di bawah).

Untuk menangani pemetaan label string ke bilangan bulat, Anda harus menggunakan Transformasi TensorFlow untuk menghasilkan kosakata. Kami mendemonstrasikan ini dalam cuplikan kode di bawah ini:

def _preprocessing_fn(inputs):
  """Preprocess input features into transformed features."""

  ...


  education = inputs[features.RAW_LABEL_KEY]
  _ = tft.vocabulary(education, vocab_filename=features.RAW_LABEL_KEY)

  ...

Fungsi preprocessing di atas mengambil fitur raw input (yang juga akan dikembalikan sebagai bagian dari output dari fungsi preprocessing) dan memanggil tft.vocabulary di atasnya. Ini menghasilkan kosa kata yang dihasilkan untuk education yang dapat diakses dalam model.

Contoh tersebut juga menunjukkan cara mengubah label dan kemudian menghasilkan kosakata untuk label yang diubah. Secara khusus dibutuhkan education label mentah dan mengonversi semua kecuali 5 label teratas (berdasarkan frekuensi) menjadi UNKNOWN , tanpa mengonversi label menjadi bilangan bulat.

Dalam kode model, classifier harus diberi kosakata yang dihasilkan oleh tft.vocabulary sebagai argumen label_vocabulary . Ini dilakukan dengan terlebih dahulu membaca kosakata ini sebagai daftar dengan fungsi pembantu. Ini ditunjukkan dalam cuplikan di bawah ini. Perhatikan kode contoh menggunakan label yang diubah yang dibahas di atas, tetapi di sini kami menunjukkan kode untuk menggunakan label mentah.

def create_estimator(pipeline_inputs, hparams):

  ...

  tf_transform_output = trainer_util.TFTransformOutput(
      pipeline_inputs.transform_dir)

  # vocabulary_by_name() returns a Python list.
  label_vocabulary = tf_transform_output.vocabulary_by_name(
      features.RAW_LABEL_KEY)

  return tf.contrib.learn.DNNLinearCombinedClassifier(
      ...
      n_classes=len(label_vocab),
      label_vocabulary=label_vocab,
      ...)

Mengonfigurasi statistik pra-transformasi dan pasca-transformasi

Seperti disebutkan di atas, komponen Transform memanggil TFDV untuk menghitung statistik pra-transformasi dan pasca-transformasi. TFDV mengambil sebagai input objek StatsOptions opsional. Pengguna mungkin ingin mengonfigurasi objek ini untuk mengaktifkan statistik tambahan tertentu (misalnya statistik NLP) atau untuk menetapkan ambang batas yang divalidasi (misalnya frekuensi token min/maks). Untuk melakukannya, tentukan stats_options_updater_fn di file modul.

def stats_options_updater_fn(stats_type, stats_options):
  ...
  if stats_type == stats_options_util.StatsType.PRE_TRANSFORM:
    # Update stats_options to modify pre-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  if stats_type == stats_options_util.StatsType.POST_TRANSFORM
    # Update stats_options to modify post-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  return stats_options

Statistik pasca-transformasi sering mendapat manfaat dari pengetahuan tentang kosa kata yang digunakan untuk memproses fitur terlebih dahulu. Nama kosakata untuk pemetaan jalur disediakan untuk StatsOptions (dan karenanya TFDV) untuk setiap kosakata yang dihasilkan TFT. Selain itu, pemetaan untuk kosakata yang dibuat secara eksternal dapat ditambahkan dengan (i) memodifikasi kamus vocab_paths secara langsung di dalam StatsOptions atau dengan (ii) menggunakan tft.annotate_asset .

,

Komponen pipeline Transform TFX melakukan rekayasa fitur pada tf.Examples yang dipancarkan dari komponen ExampleGen , menggunakan skema data yang dibuat oleh komponen SchemaGen , dan memancarkan SavedModel serta statistik pada data pra-transformasi dan pasca-transformasi. Saat dieksekusi, SavedModel akan menerima tf.Examples yang dipancarkan dari komponen ExampleGen dan memancarkan data fitur yang diubah.

  • Menggunakan: tf.Examples dari komponen ExampleGen, dan skema data dari komponen SchemaGen.
  • Memancarkan: SavedModel ke komponen Trainer, statistik pra-transformasi dan pasca-transformasi.

Mengonfigurasi Komponen Transform

Setelah preprocessing_fn Anda ditulis, itu perlu didefinisikan dalam modul python yang kemudian diberikan ke komponen Transform sebagai masukan. Modul ini akan dimuat oleh transform dan fungsi bernama preprocessing_fn akan ditemukan dan digunakan oleh Transform untuk membangun pipa preprocessing.

transform = Transform(
    examples=example_gen.outputs['examples'],
    schema=schema_gen.outputs['schema'],
    module_file=os.path.abspath(_taxi_transform_module_file))

Selain itu, Anda mungkin ingin memberikan opsi untuk penghitungan statistik pratransformasi atau pascatransformasi berbasis TFDV. Untuk melakukannya, tentukan stats_options_updater_fn di dalam modul yang sama.

Transformasi dan Transformasi TensorFlow

Transform menggunakan TensorFlow Transform secara ekstensif untuk melakukan rekayasa fitur pada set data Anda. Transformasi TensorFlow adalah alat yang hebat untuk mengubah data fitur sebelum masuk ke model Anda dan sebagai bagian dari proses pelatihan. Transformasi fitur umum meliputi:

  • Embedding : mengonversi fitur jarang (seperti ID bilangan bulat yang dihasilkan oleh kosakata) menjadi fitur padat dengan menemukan pemetaan bermakna dari ruang berdimensi tinggi ke ruang berdimensi rendah. Lihat unit Penyematan di Kursus Singkat Machine-learning untuk pengantar penyematan.
  • Pembuatan kosakata : mengubah string atau fitur non-numerik lainnya menjadi bilangan bulat dengan membuat kosakata yang memetakan setiap nilai unik ke nomor ID.
  • Nilai normalisasi : mengubah fitur numerik sehingga semuanya berada dalam kisaran yang sama.
  • Bucketization : mengonversi fitur bernilai kontinu menjadi fitur kategorikal dengan menetapkan nilai ke bucket diskrit.
  • Memperkaya fitur teks : menghasilkan fitur dari data mentah seperti token, n-gram, entitas, sentimen, dll., untuk memperkaya kumpulan fitur.

Transformasi TensorFlow menyediakan dukungan untuk ini dan banyak jenis transformasi lainnya:

  • Secara otomatis menghasilkan kosakata dari data terbaru Anda.

  • Lakukan transformasi sewenang-wenang pada data Anda sebelum mengirimkannya ke model Anda. Transformasi TensorFlow membuat transformasi menjadi grafik TensorFlow untuk model Anda sehingga transformasi yang sama dilakukan pada waktu pelatihan dan inferensi. Anda dapat menentukan transformasi yang merujuk ke properti global data, seperti nilai maksimal fitur di semua instance pelatihan.

Anda dapat mengubah data sesuka Anda sebelum menjalankan TFX. Namun jika Anda melakukannya dalam Transformasi TensorFlow, transformasi menjadi bagian dari grafik TensorFlow. Pendekatan ini membantu menghindari pelatihan/penyajian yang miring.

Transformasi di dalam kode pemodelan Anda menggunakan FeatureColumns. Dengan menggunakan FeatureColumns, Anda dapat menentukan bucketisasi, integerisasi yang menggunakan kosakata yang telah ditentukan sebelumnya, atau transformasi lainnya yang dapat ditentukan tanpa melihat data.

Sebaliknya, Transformasi TensorFlow dirancang untuk transformasi yang memerlukan data yang diteruskan sepenuhnya untuk menghitung nilai yang tidak diketahui sebelumnya. Misalnya, pembuatan kosa kata membutuhkan data yang lengkap.

Selain menghitung nilai menggunakan Apache Beam, TensorFlow Transform memungkinkan pengguna menyematkan nilai ini ke dalam grafik TensorFlow, yang kemudian dapat dimuat ke dalam grafik pelatihan. Misalnya saat menormalkan fitur, fungsi tft.scale_to_z_score akan menghitung rata-rata dan standar deviasi fitur, dan juga representasi, dalam grafik TensorFlow, dari fungsi yang mengurangi rata-rata dan membaginya dengan standar deviasi. Dengan menampilkan grafik TensorFlow, bukan hanya statistik, Transformasi TensorFlow menyederhanakan proses pembuatan pipeline prapemrosesan Anda.

Karena prapemrosesan dinyatakan sebagai grafik, ini dapat terjadi di server, dan dijamin konsisten antara pelatihan dan penyajian. Konsistensi ini menghilangkan satu sumber pelatihan/penyajian miring.

Transformasi TensorFlow memungkinkan pengguna menentukan pipeline prapemrosesan mereka menggunakan kode TensorFlow. Artinya, pipeline dibangun dengan cara yang sama seperti grafik TensorFlow. Jika hanya operasi TensorFlow yang digunakan dalam grafik ini, pipeline akan menjadi peta murni yang menerima batch input dan mengembalikan batch output. Pipeline seperti itu akan setara dengan menempatkan grafik ini di dalam input_fn Anda saat menggunakan API tf.Estimator . Untuk menentukan operasi full-pass seperti kuantil komputasi, Transformasi TensorFlow menyediakan fungsi khusus yang disebut analyzers yang tampak seperti operasi TensorFlow, tetapi sebenarnya menentukan komputasi yang ditangguhkan yang akan dilakukan oleh Apache Beam, dan output dimasukkan ke dalam grafik sebagai konstan. Sementara operasi TensorFlow biasa akan mengambil satu batch sebagai inputnya, melakukan beberapa perhitungan hanya pada batch itu dan mengeluarkan batch, analyzer akan melakukan pengurangan global (diimplementasikan dalam Apache Beam) pada semua batch dan mengembalikan hasilnya.

Dengan menggabungkan operasi TensorFlow biasa dan penganalisis Transformasi TensorFlow, pengguna dapat membuat pipeline kompleks untuk melakukan praproses data mereka. Misalnya fungsi tft.scale_to_z_score mengambil tensor input dan mengembalikan tensor yang dinormalisasi menjadi mean 0 dan varians 1 . Hal ini dilakukan dengan memanggil mean dan var analyzer di bawah tenda, yang secara efektif akan menghasilkan konstanta dalam grafik yang sama dengan mean dan varian dari tensor input. Ini kemudian akan menggunakan operasi TensorFlow untuk mengurangi rata-rata dan membaginya dengan standar deviasi.

Preprocessing_fn Transformasi preprocessing_fn

Komponen TFX Transform menyederhanakan penggunaan Transform dengan menangani panggilan API yang terkait dengan membaca dan menulis data, dan menulis keluaran SavedModel ke disk. Sebagai pengguna TFX, Anda hanya perlu mendefinisikan satu fungsi bernama preprocessing_fn . Di preprocessing_fn Anda menentukan serangkaian fungsi yang memanipulasi input dict tensor untuk menghasilkan output dict tensor. Anda dapat menemukan fungsi pembantu seperti scale_to_0_1 dan compute_and_apply_vocabulary pada TensorFlow Transform API atau menggunakan fungsi TensorFlow reguler seperti yang ditunjukkan di bawah ini.

def preprocessing_fn(inputs):
  """tf.transform's callback function for preprocessing inputs.

  Args:
    inputs: map from feature keys to raw not-yet-transformed features.

  Returns:
    Map from string feature key to transformed feature operations.
  """
  outputs = {}
  for key in _DENSE_FLOAT_FEATURE_KEYS:
    # If sparse make it dense, setting nan's to 0 or '', and apply zscore.
    outputs[_transformed_name(key)] = transform.scale_to_z_score(
        _fill_in_missing(inputs[key]))

  for key in _VOCAB_FEATURE_KEYS:
    # Build a vocabulary for this feature.
    outputs[_transformed_name(
        key)] = transform.compute_and_apply_vocabulary(
            _fill_in_missing(inputs[key]),
            top_k=_VOCAB_SIZE,
            num_oov_buckets=_OOV_SIZE)

  for key in _BUCKET_FEATURE_KEYS:
    outputs[_transformed_name(key)] = transform.bucketize(
        _fill_in_missing(inputs[key]), _FEATURE_BUCKET_COUNT)

  for key in _CATEGORICAL_FEATURE_KEYS:
    outputs[_transformed_name(key)] = _fill_in_missing(inputs[key])

  # Was this passenger a big tipper?
  taxi_fare = _fill_in_missing(inputs[_FARE_KEY])
  tips = _fill_in_missing(inputs[_LABEL_KEY])
  outputs[_transformed_name(_LABEL_KEY)] = tf.where(
      tf.is_nan(taxi_fare),
      tf.cast(tf.zeros_like(taxi_fare), tf.int64),
      # Test if the tip was > 20% of the fare.
      tf.cast(
          tf.greater(tips, tf.multiply(taxi_fare, tf.constant(0.2))), tf.int64))

  return outputs

Memahami input ke preprocessing_fn

preprocessing_fn menjelaskan serangkaian operasi pada tensor (yaitu, Tensor s, SparseTensor s, atau RaggedTensor s). Untuk mendefinisikan preprocessing_fn dengan benar, perlu dipahami bagaimana data direpresentasikan sebagai tensor. Input ke preprocessing_fn ditentukan oleh skema. Proto Schema akhirnya diubah menjadi "spesifikasi fitur" (terkadang disebut "spesifikasi parsing") yang digunakan untuk parsing data, lihat detail lebih lanjut tentang logika konversi di sini .

Menggunakan Transformasi TensorFlow untuk menangani label string

Biasanya seseorang ingin menggunakan Transformasi TensorFlow untuk menghasilkan kosa kata dan menerapkan kosa kata tersebut untuk mengonversi string menjadi bilangan bulat. Saat mengikuti alur kerja ini, input_fn yang dibuat dalam model akan menampilkan string bilangan bulat. Namun label adalah pengecualian, karena agar model dapat memetakan label keluaran (bilangan bulat) kembali ke string, model memerlukan input_fn untuk mengeluarkan label string, bersama dengan daftar kemungkinan nilai label. Misalnya, jika labelnya adalah cat dan dog , maka output dari input_fn harus berupa string mentah ini, dan kunci ["cat", "dog"] perlu diteruskan ke estimator sebagai parameter (lihat detail di bawah).

Untuk menangani pemetaan label string ke bilangan bulat, Anda harus menggunakan Transformasi TensorFlow untuk menghasilkan kosakata. Kami mendemonstrasikan ini dalam cuplikan kode di bawah ini:

def _preprocessing_fn(inputs):
  """Preprocess input features into transformed features."""

  ...


  education = inputs[features.RAW_LABEL_KEY]
  _ = tft.vocabulary(education, vocab_filename=features.RAW_LABEL_KEY)

  ...

Fungsi preprocessing di atas mengambil fitur raw input (yang juga akan dikembalikan sebagai bagian dari output dari fungsi preprocessing) dan memanggil tft.vocabulary di atasnya. Ini menghasilkan kosa kata yang dihasilkan untuk education yang dapat diakses dalam model.

Contoh tersebut juga menunjukkan cara mengubah label dan kemudian menghasilkan kosakata untuk label yang diubah. Secara khusus dibutuhkan education label mentah dan mengonversi semua kecuali 5 label teratas (berdasarkan frekuensi) menjadi UNKNOWN , tanpa mengonversi label menjadi bilangan bulat.

Dalam kode model, classifier harus diberi kosakata yang dihasilkan oleh tft.vocabulary sebagai argumen label_vocabulary . Ini dilakukan dengan terlebih dahulu membaca kosakata ini sebagai daftar dengan fungsi pembantu. Ini ditunjukkan dalam cuplikan di bawah ini. Perhatikan kode contoh menggunakan label yang diubah yang dibahas di atas, tetapi di sini kami menunjukkan kode untuk menggunakan label mentah.

def create_estimator(pipeline_inputs, hparams):

  ...

  tf_transform_output = trainer_util.TFTransformOutput(
      pipeline_inputs.transform_dir)

  # vocabulary_by_name() returns a Python list.
  label_vocabulary = tf_transform_output.vocabulary_by_name(
      features.RAW_LABEL_KEY)

  return tf.contrib.learn.DNNLinearCombinedClassifier(
      ...
      n_classes=len(label_vocab),
      label_vocabulary=label_vocab,
      ...)

Mengonfigurasi statistik pra-transformasi dan pasca-transformasi

Seperti disebutkan di atas, komponen Transform memanggil TFDV untuk menghitung statistik pra-transformasi dan pasca-transformasi. TFDV mengambil sebagai input objek StatsOptions opsional. Pengguna mungkin ingin mengonfigurasi objek ini untuk mengaktifkan statistik tambahan tertentu (misalnya statistik NLP) atau untuk menetapkan ambang batas yang divalidasi (misalnya frekuensi token min/maks). Untuk melakukannya, tentukan stats_options_updater_fn di file modul.

def stats_options_updater_fn(stats_type, stats_options):
  ...
  if stats_type == stats_options_util.StatsType.PRE_TRANSFORM:
    # Update stats_options to modify pre-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  if stats_type == stats_options_util.StatsType.POST_TRANSFORM
    # Update stats_options to modify post-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  return stats_options

Statistik pasca-transformasi sering mendapat manfaat dari pengetahuan tentang kosa kata yang digunakan untuk memproses fitur terlebih dahulu. Nama kosakata untuk pemetaan jalur disediakan untuk StatsOptions (dan karenanya TFDV) untuk setiap kosakata yang dihasilkan TFT. Selain itu, pemetaan untuk kosakata yang dibuat secara eksternal dapat ditambahkan dengan (i) memodifikasi kamus vocab_paths secara langsung di dalam StatsOptions atau dengan (ii) menggunakan tft.annotate_asset .