Komponen Alur Transform TFX

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

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

Mengonfigurasi Komponen Transformasi

Setelah preprocessing_fn Anda ditulis, itu perlu didefinisikan dalam modul python yang kemudian diberikan ke komponen Transform sebagai input. Modul ini akan dimuat oleh transform dan fungsi bernama preprocessing_fn akan ditemukan dan digunakan oleh Transform untuk membangun pipeline 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 pada penghitungan statistik pra-transformasi atau pasca-transformasi berbasis TFDV . Untuk melakukannya, tentukan stats_options_updater_fn dalam modul yang sama.

Transformasi dan Transformasi TensorFlow

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

  • Penyematan : mengubah fitur renggang (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 Pembelajaran Mesin untuk pengenalan penyematan.
  • Pembuatan kosakata : mengubah string atau fitur non-numerik lainnya menjadi bilangan bulat dengan membuat kosakata yang memetakan setiap nilai unik ke nomor ID.
  • Normalisasi nilai : mengubah fitur numerik sehingga semuanya berada dalam rentang yang sama.
  • Bucketization : mengubah fitur bernilai berkelanjutan menjadi fitur kategorikal dengan menetapkan nilai ke keranjang terpisah.
  • Memperkaya fitur teks : menghasilkan fitur dari data mentah seperti token, n-gram, entitas, sentimen, dll., untuk memperkaya kumpulan fitur.

TensorFlow Transform memberikan dukungan untuk hal 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 ke dalam grafik TensorFlow untuk model Anda sehingga transformasi yang sama dilakukan pada waktu pelatihan dan inferensi. Anda dapat menentukan transformasi yang merujuk pada properti global data, seperti nilai maksimum fitur di semua instance pelatihan.

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

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 datanya.

Sebaliknya, Transformasi TensorFlow didesain untuk transformasi yang memerlukan penerusan data secara penuh untuk menghitung nilai yang tidak diketahui sebelumnya. Misalnya, pembuatan kosakata memerlukan penyampaian data secara menyeluruh.

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 melakukan normalisasi fitur, fungsi tft.scale_to_z_score akan menghitung mean dan deviasi standar suatu fitur, dan juga representasi, dalam grafik TensorFlow, dari fungsi yang mengurangkan mean dan membaginya dengan deviasi standar. Dengan menampilkan grafik TensorFlow, bukan hanya statistik, TensorFlow Transform menyederhanakan proses pembuatan pipeline prapemrosesan Anda.

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

Transformasi TensorFlow memungkinkan pengguna menentukan pipeline prapemrosesan menggunakan kode TensorFlow. Artinya, pipeline dibuat dengan cara yang sama seperti grafik TensorFlow. Jika hanya operasi TensorFlow yang digunakan dalam grafik ini, pipeline akan menjadi peta murni yang menerima kumpulan masukan dan mengembalikan kumpulan keluaran. Saluran pipa seperti itu setara dengan menempatkan grafik ini di dalam input_fn Anda saat menggunakan tf.Estimator API. Untuk menentukan operasi full-pass seperti kuantil komputasi, TensorFlow Transform menyediakan fungsi khusus yang disebut analyzers yang tampak seperti operasi TensorFlow, namun sebenarnya menentukan komputasi tertunda yang akan dilakukan oleh Apache Beam, dan outputnya dimasukkan ke dalam grafik sebagai konstan. Meskipun operasi TensorFlow biasa akan mengambil satu batch sebagai masukannya, melakukan beberapa komputasi hanya pada batch tersebut dan mengeluarkan batch, analyzer akan melakukan pengurangan global (diimplementasikan di Apache Beam) pada semua batch dan mengembalikan hasilnya.

Dengan menggabungkan operasi TensorFlow biasa dan penganalisis Transformasi TensorFlow, pengguna dapat membuat pipeline kompleks untuk memproses data mereka terlebih dahulu. Misalnya fungsi tft.scale_to_z_score mengambil tensor masukan dan mengembalikan tensor yang dinormalisasi menjadi mean 0 dan variance 1 . Hal ini dilakukan dengan memanggil penganalisis mean dan var , yang secara efektif akan menghasilkan konstanta dalam grafik yang sama dengan mean dan varians dari tensor masukan. Kemudian akan menggunakan operasi TensorFlow untuk mengurangi mean dan membaginya dengan deviasi standar.

Transformasi TensorFlow preprocessing_fn

Komponen TFX Transform menyederhanakan penggunaan Transform dengan menangani panggilan API yang terkait dengan membaca dan menulis data, dan menulis output SavedModel ke disk. Sebagai pengguna TFX, Anda hanya perlu mendefinisikan satu fungsi yang disebut preprocessing_fn . Di preprocessing_fn Anda mendefinisikan serangkaian fungsi yang memanipulasi dict input tensor untuk menghasilkan dict output tensor. Anda dapat menemukan fungsi pembantu seperti scale_to_0_1 dan compute_and_apply_vocabulary di TensorFlow Transform API atau gunakan fungsi TensorFlow biasa 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 masukan 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. Masukan ke preprocessing_fn ditentukan oleh skema. Proto Schema pada akhirnya diubah menjadi "spesifikasi fitur" (terkadang disebut "spesifikasi parsing") yang digunakan untuk penguraian data, lihat detail selengkapnya tentang logika konversi di sini .

Menggunakan TensorFlow Transform untuk menangani label string

Biasanya seseorang ingin menggunakan TensorFlow Transform untuk menghasilkan kosakata dan menerapkan kosakata tersebut untuk mengonversi string menjadi bilangan bulat. Saat mengikuti alur kerja ini, input_fn yang dibuat dalam model akan menampilkan string integer. Namun label merupakan pengecualian, karena agar model dapat memetakan label keluaran (integer) 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"] harus 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 mendemonstrasikannya 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 prapemrosesan di atas mengambil fitur masukan mentah (yang juga akan dikembalikan sebagai bagian dari keluaran fungsi prapemrosesan) dan memanggil tft.vocabulary di dalamnya. Hal ini menghasilkan kosakata yang dihasilkan untuk education yang dapat diakses dalam model.

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

Dalam kode model, pengklasifikasi harus diberikan kosakata yang dihasilkan oleh tft.vocabulary sebagai argumen label_vocabulary . Hal ini dilakukan dengan terlebih dahulu membaca kosakata ini sebagai daftar dengan fungsi pembantu. Hal ini ditunjukkan dalam cuplikan di bawah ini. Perhatikan bahwa kode contoh menggunakan label transformasi yang dibahas di atas, tetapi di sini kami menampilkan 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 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 kali mendapat manfaat dari pengetahuan tentang kosakata yang digunakan untuk melakukan pra-pemrosesan suatu fitur. Nama kosakata untuk pemetaan jalur diberikan ke StatsOptions (dan karenanya TFDV) untuk setiap kosakata yang dihasilkan TFT. Selain itu, pemetaan untuk kosakata yang dibuat secara eksternal dapat ditambahkan dengan (i) secara langsung memodifikasi kamus vocab_paths dalam StatsOptions atau dengan (ii) menggunakan tft.annotate_asset .