Transform TFX Pipeline Bileşeni

Transform TFX işlem hattı bileşeni, bir SchemaGen bileşeni tarafından oluşturulan bir veri şeması kullanarak tf.Examples üzerinde özellik mühendisliği gerçekleştirir ve hem bir SavedModel'in yanı sıra hem dönüşüm öncesi hem de dönüşüm sonrası verilere ilişkin istatistikler yayınlar. Yürütüldüğünde SavedModel, bir SampleGen bileşeninden yayılan tf.Examples'ı kabul edecek ve dönüştürülmüş özellik verilerini yayınlayacaktır.

  • Şunları tüketir: Bir SampleGen bileşeninden tf.Examples ve bir SchemaGen bileşeninden bir veri şeması.
  • Yayılanlar: Trainer bileşenine bir SavedModel, dönüşüm öncesi ve dönüşüm sonrası istatistikler.

Bir Dönüştürme Bileşenini Yapılandırma

preprocessing_fn yazıldıktan sonra, bunun daha sonra Transform bileşenine girdi olarak sağlanan bir python modülünde tanımlanması gerekir. Bu modül transform tarafından yüklenecek ve preprocessing_fn adlı işlev Transform tarafından bulunacak ve ön işleme hattını oluşturmak için kullanılacaktır.

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

Ek olarak, TFDV tabanlı dönüşüm öncesi veya dönüşüm sonrası istatistik hesaplamalarına seçenekler sunmak isteyebilirsiniz. Bunu yapmak için aynı modül içinde bir stats_options_updater_fn tanımlayın.

Dönüşüm ve TensorFlow Dönüşümü

Transform, veri kümenizde özellik mühendisliği gerçekleştirmek için TensorFlow Transform'u kapsamlı bir şekilde kullanır. TensorFlow Transform, özellik verilerini modelinize gitmeden önce ve eğitim sürecinin bir parçası olarak dönüştürmek için harika bir araçtır. Ortak özellik dönüşümleri şunları içerir:

  • Gömme : Yüksek boyutlu uzaydan düşük boyutlu uzaya anlamlı bir eşleme bularak seyrek özellikleri (bir sözcük dağarcığı tarafından üretilen tamsayı kimlikleri gibi) yoğun özelliklere dönüştürmek. Yerleştirmelere giriş için Makine Öğrenimi Hızlandırılmış Kursu'ndaki Yerleştirmeler ünitesine bakın.
  • Kelime dağarcığı oluşturma : her benzersiz değeri bir kimlik numarasıyla eşleştiren bir kelime dağarcığı oluşturarak dizeleri veya diğer sayısal olmayan özellikleri tam sayılara dönüştürmek.
  • Değerleri normalleştirme : Sayısal özelliklerin hepsinin benzer bir aralığa girecek şekilde dönüştürülmesi.
  • Gruplandırma : sürekli değerli özellikleri, ayrı gruplara değerler atayarak kategorik özelliklere dönüştürmek.
  • Metin özelliklerini zenginleştirme : özellik setini zenginleştirmek için jetonlar, n-gramlar, varlıklar, duyarlılık vb. gibi ham verilerden özellikler üretmek.

TensorFlow Transform, bunlar ve diğer birçok dönüşüm türü için destek sağlar:

  • En son verilerinizden otomatik olarak bir kelime dağarcığı oluşturun.

  • Verilerinizi modelinize göndermeden önce isteğe bağlı dönüşümler gerçekleştirin. TensorFlow Transform, modeliniz için TensorFlow grafiğinde dönüşümler oluşturarak aynı dönüşümlerin eğitim ve çıkarım sırasında gerçekleştirilmesini sağlar. Tüm eğitim örneklerinde bir özelliğin maksimum değeri gibi verilerin genel özelliklerine atıfta bulunan dönüşümleri tanımlayabilirsiniz.

TFX'i çalıştırmadan önce verilerinizi dilediğiniz gibi dönüştürebilirsiniz. Ancak bunu TensorFlow Transform içinde yaparsanız dönüşümler TensorFlow grafiğinin parçası haline gelir. Bu yaklaşım, eğitim/sunum çarpıklığının önlenmesine yardımcı olur.

Modelleme kodunuzdaki dönüşümler, FeatureColumns'u kullanır. FeatureColumns'u kullanarak, önceden tanımlanmış sözcükleri kullanan paketleştirmeleri, tamsayılaştırmaları veya verilere bakmadan tanımlanabilecek diğer dönüşümleri tanımlayabilirsiniz.

Buna karşılık TensorFlow Transform, önceden bilinmeyen değerleri hesaplamak için veriler üzerinden tam geçiş gerektiren dönüşümler için tasarlanmıştır. Örneğin, kelime dağarcığı oluşturma, verilerin tam olarak aktarılmasını gerektirir.

Apache Beam kullanarak değerlerin hesaplanmasına ek olarak TensorFlow Transform, kullanıcıların bu değerleri daha sonra eğitim grafiğine yüklenebilecek bir TensorFlow grafiğine yerleştirmesine olanak tanır. Örneğin, özellikler normalleştirilirken, tft.scale_to_z_score işlevi bir özelliğin ortalamasını ve standart sapmasını hesaplayacak ve ayrıca ortalamayı çıkaran ve standart sapmaya bölen fonksiyonun TensorFlow grafiğindeki temsilini hesaplayacaktır. TensorFlow Transform, yalnızca istatistik değil, bir TensorFlow grafiği de yayınlayarak, ön işleme işlem hattınızı yazma sürecini basitleştirir.

Ön işleme bir grafik olarak ifade edildiğinden sunucuda gerçekleşebilir ve eğitim ile sunum arasında tutarlı olması garanti edilir. Bu tutarlılık, eğitim/sunum çarpıklığının bir kaynağını ortadan kaldırır.

TensorFlow Transform, kullanıcıların TensorFlow kodunu kullanarak ön işleme hatlarını belirlemelerine olanak tanır. Bu, bir boru hattının TensorFlow grafiğiyle aynı şekilde oluşturulduğu anlamına gelir. Bu grafikte yalnızca TensorFlow operasyonları kullanılmış olsaydı, işlem hattı girdi yığınlarını kabul eden ve çıktı yığınlarını döndüren saf bir harita olurdu. Böyle bir işlem hattı, tf.Estimator API'sini kullanırken bu grafiği input_fn içine yerleştirmeye eşdeğer olacaktır. Hesaplama miktarları gibi tam geçişli işlemleri belirtmek için TensorFlow Transform, analyzers adı verilen, TensorFlow operasyonları gibi görünen, ancak aslında Apache Beam tarafından yapılacak ertelenmiş bir hesaplamayı ve çıktıyı grafiğe bir grafik olarak eklenen özel işlevler sağlar. devamlı. Sıradan bir TensorFlow op, girdi olarak tek bir toplu iş alıp, yalnızca o toplu iş üzerinde bazı hesaplamalar gerçekleştirip bir toplu iş yayınlarken, bir analyzer tüm gruplar üzerinde genel bir azaltma (Apache Beam'de uygulanan) gerçekleştirecek ve sonucu döndürecektir.

Kullanıcılar, sıradan TensorFlow operasyonlarını ve TensorFlow Transform analizörlerini birleştirerek, verilerini önceden işlemek için karmaşık işlem hatları oluşturabilir. Örneğin, tft.scale_to_z_score işlevi bir giriş tensörünü alır ve bu tensörün ortalama 0 ve varyans 1 olacak şekilde normalleştirilmiş halini döndürür. Bunu, grafikte giriş tensörünün ortalamasına ve varyansına eşit sabitleri etkili bir şekilde üretecek olan mean ve var analizörlerini başlık altında çağırarak yapar. Daha sonra ortalamayı çıkarmak ve standart sapmaya bölmek için TensorFlow ops'u kullanacaktır.

TensorFlow Dönüşümü preprocessing_fn

TFX Transform bileşeni, veri okuma ve yazmayla ilgili API çağrılarını işleyerek ve SavedModel çıktısını diske yazarak Transform'un kullanımını basitleştirir. Bir TFX kullanıcısı olarak yalnızca preprocessing_fn adı verilen tek bir işlevi tanımlamanız gerekir. preprocessing_fn , tensörlerin çıkış diktesini üretmek için tensörlerin giriş diktesini değiştiren bir dizi fonksiyon tanımlarsınız. Scale_to_0_1 ve compute_and_apply_vocabulary gibi yardımcı işlevleri TensorFlow Transform API'de bulabilir veya aşağıda gösterildiği gibi normal TensorFlow işlevlerini kullanabilirsiniz.

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

Preprocessing_fn'ye girişleri anlama

preprocessing_fn tensörler (yani Tensor , SparseTensor veya RaggedTensor ) üzerindeki bir dizi işlemi açıklar. preprocessing_fn doğru bir şekilde tanımlamak için verilerin tensör olarak nasıl temsil edildiğini anlamak gerekir. preprocessing_fn girişi şema tarafından belirlenir. Bir Schema protokolü, sonunda veri ayrıştırma için kullanılan bir "özellik spesifikasyonuna" (bazen "ayrıştırma spesifikasyonu" olarak da adlandırılır) dönüştürülür; dönüşüm mantığı hakkında daha fazla ayrıntıya buradan bakın.

Dize etiketlerini işlemek için TensorFlow Transform'u kullanma

Genellikle TensorFlow Transform'u hem bir kelime dağarcığı oluşturmak hem de dizeleri tam sayılara dönüştürmek için bu kelime dağarcığını uygulamak için kullanmak ister. Bu iş akışını takip ederken, modelde oluşturulan input_fn , tamsayılaştırılmış dizenin çıktısını alacaktır. Ancak etiketler bir istisnadır, çünkü modelin çıktı (tamsayı) etiketlerini tekrar dizelere eşleyebilmesi için modelin, etiketin olası değerlerinin bir listesiyle birlikte bir dize etiketi çıktısı alması için input_fn ihtiyacı vardır. Örneğin, etiketler cat ve dog ise, input_fn çıktısı bu ham dizeler olmalıdır ve ["cat", "dog"] anahtarlarının tahmin aracına parametre olarak aktarılması gerekir (aşağıdaki ayrıntılara bakın).

Dize etiketlerinin tamsayılarla eşlenmesini gerçekleştirmek için bir sözcük dağarcığı oluşturmak üzere TensorFlow Transform'u kullanmalısınız. Bunu aşağıdaki kod parçacığında gösteriyoruz:

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)

  ...

Yukarıdaki ön işleme işlevi ham girdi özelliğini alır (bu da ön işleme işlevinin çıktısının bir parçası olarak döndürülür) ve bunun üzerinde tft.vocabulary çağırır. Bu, modelde erişilebilen education için bir kelime dağarcığının oluşturulmasıyla sonuçlanır.

Örnek aynı zamanda bir etiketin nasıl dönüştürüleceğini ve ardından dönüştürülen etiket için bir sözcük dağarcığının nasıl oluşturulacağını da gösterir. Özellikle ham etiket education alır ve etiketi bir tam sayıya dönüştürmeden, ilk 5 etiket (frekansa göre) dışındaki tüm etiketleri UNKNOWN dönüştürür.

Model kodunda, sınıflandırıcıya label_vocabulary argümanı olarak tft.vocabulary tarafından oluşturulan kelime dağarcığı verilmelidir. Bu, ilk önce bu kelime dağarcığının yardımcı işlevi olan bir liste olarak okunmasıyla yapılır. Bu, aşağıdaki kod parçasında gösterilmektedir. Örnek kodun yukarıda tartışılan dönüştürülmüş etiketi kullandığını unutmayın, ancak burada ham etiketin kullanımına ilişkin kodu gösteriyoruz.

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,
      ...)

Dönüşüm öncesi ve dönüşüm sonrası istatistikleri yapılandırma

Yukarıda belirtildiği gibi, Transform bileşeni hem dönüşüm öncesi hem de dönüşüm sonrası istatistikleri hesaplamak için TFDV'yi çağırır. TFDV girdi olarak isteğe bağlı bir StatsOptions nesnesini alır. Kullanıcılar bu nesneyi belirli ek istatistikleri (örn. NLP istatistikleri) etkinleştirmek veya doğrulanan eşikleri (örn. minimum / maksimum belirteç frekansı) ayarlamak için yapılandırmak isteyebilir. Bunu yapmak için modül dosyasında bir stats_options_updater_fn tanımlayın.

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

Dönüşüm sonrası istatistikler genellikle bir özelliğin ön işlenmesi için kullanılan kelime bilgisinden yararlanır. Yol eşlemenin sözcük adı, TFT tarafından oluşturulan her sözcük için StatsOptions'a (ve dolayısıyla TFDV'ye) sağlanır. Ek olarak, harici olarak oluşturulan sözlüklere yönelik eşlemeler, (i) StatsOptions içindeki vocab_paths sözlüğünü doğrudan değiştirerek veya (ii) tft.annotate_asset kullanılarak eklenebilir.