Transform TFX Ardışık Düzen Bileşeni

Transform TFX ardışık düzen bileşeni, bir SchemaGen bileşeni tarafından oluşturulan bir veri şemasını kullanarak bir ExampleGen bileşeninden yayılan tf.Examples üzerinde özellik mühendisliği gerçekleştirir ve hem bir SavedModel hem de hem dönüşüm öncesi hem de dönüşüm sonrası verilerle ilgili istatistikleri yayar. Yürütüldüğünde, SavedModel, bir ExampleGen bileşeninden yayılan tf.Examples'ı kabul edecek ve dönüştürülmüş özellik verilerini yayacaktır.

  • Tüketim: Bir ExampleGen bileşeninden tf.Örnekler ve bir SchemaGen bileşeninden bir veri şeması.
  • Yayar: Bir Eğitmen bileşenine 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, 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 bulunacak ve Transform tarafından ö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 hesaplaması için 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 yapmak 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 kelime dağarcığı tarafından üretilen tamsayı kimlikleri gibi) yoğun özelliklere dönüştürmek. Gömmelere giriş için Makine Öğrenimi Hızlandırılmış Kursunda Gömmeler ünitesine bakın.
  • Kelime oluşturma : Her benzersiz değeri bir kimlik numarasına eşleyen bir sözlük oluşturarak dizeleri veya diğer sayısal olmayan özellikleri tam sayılara dönüştürmek.
  • Değerlerin normalleştirilmesi : sayısal özelliklerin hepsinin benzer bir aralığa girmesi için dönüştürülmesi.
  • Kovalama : ayrık kovalara değerler atayarak sürekli değerli özellikleri kategorik özelliklere dönüştürmek.
  • Metin özelliklerini zenginleştirme : özellik setini zenginleştirmek için belirteçler, n-gramlar, varlıklar, duyarlılık vb. gibi ham verilerden özellikler üretmek.

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

  • En son verilerinizden otomatik olarak bir kelime hazinesi oluşturun.

  • Modelinize göndermeden önce verilerinizde rastgele dönüşümler gerçekleştirin. TensorFlow Transform, modeliniz için TensorFlow grafiğinde dönüşümler oluşturur, böylece aynı dönüşümler eğitim ve çıkarım zamanında gerçekleştirilir. Tüm eğitim örneklerinde bir özelliğin maksimum değeri gibi verilerin genel özelliklerine başvuran dönüşümler tanımlayabilirsiniz.

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

Modelleme kodunuzdaki dönüşümler FeatureColumns kullanır. FeatureColumns'u kullanarak, önceden tanımlanmış sözlükleri kullanan gruplandırmaları, tamsayıları 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 üzerinde tam geçiş gerektiren dönüşümler için tasarlanmıştır. Örneğin, kelime oluşturma, verilerin üzerinden tam bir geçiş gerektirir.

Apache Beam kullanarak değerleri hesaplamaya ek olarak, TensorFlow Transform, kullanıcıların bu değerleri daha sonra eğitim grafiğine yüklenebilecekleri bir TensorFlow grafiğine yerleştirmelerine olanak tanır. Örneğin, özellikleri normalleştirirken, tft.scale_to_z_score işlevi, bir özelliğin ortalamasını ve standart sapmasını ve ayrıca, ortalamayı çıkaran ve standart sapmaya bölen işlevin bir TensorFlow grafiğindeki bir temsilini hesaplayacaktır. TensorFlow Transform, yalnızca istatistik değil, bir TensorFlow grafiği yayarak ön işleme 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 hizmet arasında tutarlı olması garanti edilir. Bu tutarlılık, bir eğitim/servis çarpıklığını ortadan kaldırır.

TensorFlow Transform, kullanıcıların TensorFlow kodunu kullanarak ön işleme ardışık düzenlerini 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ı, ardışık düzen, girdi gruplarını kabul eden ve çıktı gruplarını döndüren saf bir harita olurdu. Böyle bir ardışık düzen, tf.Estimator API'sini kullanırken bu grafiği input_fn içine yerleştirmeye eşdeğer olacaktır. Hesaplama nicelikleri gibi tam geçişli işlemleri belirtmek için, TensorFlow Transform, TensorFlow işlemleri gibi görünen, ancak aslında Apache Beam tarafından yapılacak ertelenmiş bir hesaplamayı ve çıktı olarak grafiğe eklenen analyzers adı verilen özel işlevler sağlar. devamlı. Sıradan bir TensorFlow işlemi, girdisi olarak tek bir toplu iş alırken, yalnızca o toplu iş üzerinde bazı hesaplamalar gerçekleştirir ve bir toplu iş yayarken, bir analyzer tüm gruplar üzerinde genel bir indirgeme (Apache Beam'de uygulanır) gerçekleştirir ve sonucu döndürür.

Kullanıcılar, sıradan TensorFlow operasyonlarını ve TensorFlow Transform analizörlerini birleştirerek, verilerini önceden işlemek için karmaşık boru hatları oluşturabilir. Örneğin, tft.scale_to_z_score işlevi bir giriş tensörü alır ve bu tensörü ortalama 0 ve varyans 1 olacak şekilde normalize eder. Bunu, grafikte giriş tensörünün ortalama ve varyansına eşit sabitleri etkin bir şekilde üretecek olan kaputun altındaki mean ve var analizörlerini çağırarak yapar. Ardından, ortalamayı çıkarmak ve standart sapmaya bölmek için TensorFlow işlemlerini kullanır.

TensorFlow Dönüşümü preprocessing_fn

TFX Transform bileşeni, veri okuma ve yazma ve SavedModel çıktısını diske yazma ile ilgili API çağrılarını işleyerek Transform kullanımını basitleştirir. Bir TFX kullanıcısı olarak, yalnızca preprocessing_fn adlı tek bir işlev tanımlamanız gerekir. preprocessing_fn , tensörlerin çıkış diktini üretmek için tensörlerin giriş diktini manipüle eden bir dizi fonksiyon tanımlarsınız. Scale_to_0_1 ve hesap_and_apply_vocabulary gibi yardımcı işlevleri TensorFlow Transform API'sini 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

önişleme_fn girdilerini anlama

preprocessing_fn , tensörler (yani, Tensor s veya SparseTensor s) üzerinde bir dizi işlemi açıklar ve bu nedenle preprocessing_fn doğru yazmak için verilerinizin tensörler olarak nasıl temsil edildiğini anlamak gerekir. preprocessing_fn girdisi şema tarafından belirlenir. Bir Schema protokolü, Feature bir listesini içerir ve Dönüştür, bunları, anahtarları özellik adları olan ve değerleri FixedLenFeature veya VarLenFeature (veya diğer TensorFlow Transform tarafından kullanılmayan seçenekler).

Schema bir özellik spesifikasyonu çıkarmaya yönelik kurallar şunlardır:

  • Şekil kümesine sahip her feature , shape ve default_value=None ile bir tf.FixedLenFeature ile sonuçlanacaktır. presence.min_fraction 1 olmalıdır, aksi takdirde hata oluşur, çünkü varsayılan değer olmadığında tf.FixedLenFeature özelliğin her zaman mevcut olmasını gerektirir.
  • shape ayarlanmayan her feature bir VarLenFeature ile sonuçlanacaktır.
  • Her sparse_feature , size ve is_sorted SparseFeature mesajının fixed_shape ve is_sorted alanları tarafından belirlenen bir tf.SparseFeature ile sonuçlanacaktır.
  • Bir sparse_feature index_feature veya value_feature olarak kullanılan özellikler, özellik belirtiminde oluşturulan kendi girişlerine sahip olmayacaktır.
  • feature type alanı (veya bir sparse_feature protokolünün değerler özelliği) ile özellik belirtiminin türü arasındaki dtype aşağıdaki tabloda verilmiştir:
type dtype
schema_pb2.INT tf.int64
schema_pb2.FLOAT tf.float32
schema_pb2.BYTES tf.string

Dize etiketlerini işlemek için TensorFlow Dönüşümünü kullanma

Genellikle, hem bir kelime hazinesi oluşturmak hem de bu kelimeleri dizeleri tam sayılara dönüştürmek için uygulamak için TensorFlow Transform'u kullanmak istenir. Bu iş akışını takip ederken, modelde oluşturulan input_fn , tamsayılı dizeyi çıkaracaktır. Bununla birlikte, etiketler bir istisnadır, çünkü modelin çıktı (tamsayı) etiketlerini tekrar dizgelere eşleyebilmesi için, modelin, etiketin olası değerlerinin bir listesiyle birlikte bir dizge etiketi çıktısı vermesi 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 bir parametre olarak tahmin ediciye iletilmesi gerekir (aşağıdaki ayrıntılara bakın).

Dize etiketlerinin tamsayılarla eşleştirilmesini işlemek için, bir sözlük oluşturmak için TensorFlow Transform'u kullanmalısınız. Bunu aşağıdaki kod parçası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 önişleme işlevi, ham giriş özelliğini alır (önişleme işlevinin çıktısının bir parçası olarak da döndürülür) ve bunun üzerinde tft.vocabulary çağırır. Bu, modelde erişilebilen education için oluşturulan bir kelime dağarcığı ile sonuçlanır.

Örnek ayrıca bir etiketin nasıl dönüştürüleceğini ve ardından dönüştürülen etiket için bir kelime dağarcığının nasıl oluşturulacağını gösterir. Özellikle ham etiket education alır ve ilk 5 etiket dışında (frekansa göre) etiketi bir tam sayıya dönüştürmeden UNKNOWN dönüştürür.

Model kodunda, sınıflandırıcıya label_vocabulary argümanı olarak tft.vocabulary tarafından üretilen kelime bilgisi verilmelidir. Bu, ilk önce bu sözlüğü yardımcı işlevli bir liste olarak okuyarak yapılır. Bu, aşağıdaki snippet'te gösterilmiştir. Örnek kodun yukarıda tartışılan dönüştürülmüş etiketi kullandığını unutmayın, ancak burada ham etiketi kullanma kodunu 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 bahsedildiği gibi, Dönüştür bileşeni, hem dönüşüm öncesi hem de dönüşüm sonrası istatistikleri hesaplamak için TFDV'yi çağırır. TFDV, isteğe bağlı bir StatsOptions nesnesini girdi olarak alır. Kullanıcılar, belirli ek istatistikleri (örn. NLP istatistikleri) etkinleştirmek veya doğrulanan eşikleri (örn. min / maks jeton frekansı) ayarlamak için bu nesneyi 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şlemesi için kullanılan kelime bilgisinden yararlanır. Yol eşleme için 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şturulmuş sözlükler için eşlemeler, (i) StatsOptions içindeki vocab_paths sözlüğünü doğrudan değiştirerek veya (ii) tft.annotate_asset kullanılarak eklenebilir.