Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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

Transform TFX boru hattı bileşeni gerçekleştirdiği bir yayılan tf.Examples üzerinde mühendisliğini ExampleGen bir tarafından oluşturulan bir veri şemasını kullanarak, bileşen SchemaGen bileşeni ve bir SavedModel yayar. Yürütüldüğünde, SavedModel bir ExampleGen bileşeninden gönderilen tf.Examples'ı kabul edecek ve dönüştürülmüş özellik verilerini yayınlayacaktır.

  • Tüketim: Bir ExampleGen bileşeninden tf. Örnekler ve bir SchemaGen bileşeninden bir veri şeması.
  • Yayınlar: Bir SavedModel'den bir Eğitmen bileşenine

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

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

transform_training = components.Transform(
    examples=examples_gen.outputs['training_examples'],
    schema=infer_schema.outputs['schema'],
    module_file=taxi_pipeline_utils,
    name='transform-training')

transform_eval = components.Transform(
    examples=examples_gen.outputs['eval_examples'],
    schema=infer_schema.outputs['schema'],
    transform_dir=transform_training.outputs['output'],
    name='transform-eval')

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

Dönüşüm, veri kümenizde özellik mühendisliği gerçekleştirmek için TensorFlow Transform'dan kapsamlı bir şekilde yararlanır. TensorFlow Transform, modelinize gitmeden önce ve eğitim sürecinin bir parçası olarak özellik verilerini 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ürme. Düğünlere giriş için Makine Öğrenimi Hızlandırma Kursundaki Gömme ü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ürme.
  • Değerleri normalleştirme : sayısal özellikleri, tümü benzer bir aralıkta olacak şekilde dönüştürmek.
  • Bölümlendirme : ayrı kümelere değerler atayarak sürekli değerli özellikleri kategorik özelliklere dönüştürme.
  • Metin özelliklerini zenginleştirme : özellik setini zenginleştirmek için jetonlar, n-gramlar, varlıklar, duyarlılıklar vb. Gibi ham verilerden özellikler üretmek.

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

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

  • Modelinize göndermeden önce verileriniz üzerinde rastgele dönüşümler gerçekleştirin. TensorFlow Transform, modeliniz için TensorFlow grafiğine dönüşümler oluşturur, böylece eğitim ve çıkarım zamanında aynı dönüşümler 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 Transform içinde yaparsanız, dönüşümler TensorFlow grafiğinin bir parçası olur. Bu yaklaşım, eğitimden / sunum hatalarından kaçınmaya yardımcı olur.

Modelleme kodunuzun içindeki dönüşümler FeatureColumns kullanır. FeatureColumns'u kullanarak, önceden tanımlanmış sözcükleri kullanan kümelendirmeleri, tamsayıları veya verilere bakmadan tanımlanabilen 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 haznesi oluşturma, verilerin tam olarak aktarılmasını gerektirir.

Apache Beam kullanarak değerleri hesaplamaya ek olarak, TensorFlow Transform, kullanıcıların bu değerleri bir TensorFlow grafiğine yerleştirmesine ve daha sonra eğitim grafiğine yüklenmesine 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 temsilini hesaplayacaktır. TensorFlow Transform, sadece istatistik değil, bir TensorFlow grafiği de yayarak, ön işleme ardışık düzeninizin yazım 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, bir eğitim / sunum kaynağı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 inşa edildiği anlamına gelir. Bu grafikte yalnızca TensorFlow işlemleri kullanılmış olsaydı, ardışık düzen, girdi gruplarını kabul eden ve çıktı toplu işlerini döndüren saf bir harita olurdu. Böyle bir ardışık input_fn , tf.Estimator API'sini kullanırken bu grafiği input_fn içine yerleştirmeye eşdeğer olacaktır. Örneğin, TensorFlow Transform miktarlarını işlem olarak tam geçişli işlemler belirtmek amacıyla adı verilen özel fonksiyonları sağlar analyzers TensorFlow ops gibi görünür ancak, aslında a olarak grafiğe dahil Apache Beam tarafından yapılacaktır Ertelenmiş bir hesaplama ve çıkış belirtmek sabit. Sıradan bir TensorFlow operatörü, girdi olarak tek bir partiyi alırken, sadece o partide bir miktar hesaplama yapıp bir partiyi yayınlarken, bir analyzer tüm partilerde global bir azaltma (Apache Beam'de uygulanır) gerçekleştirecek ve sonucu döndürecektir.

Sıradan TensorFlow operasyonlarını ve TensorFlow Transform analizörlerini birleştirerek, kullanıcılar verilerini önceden işlemek için karmaşık ardışık düzenler oluşturabilir. Örneğin, tft.scale_to_z_score işlevi bir girdi tensörü alır ve ortalama 0 ve varyans 1 olacak şekilde normalleştirilmiş tensörü döndürür. Bunu, başlık altındaki mean ve var analizörlerini çağırarak yapar, bu da grafikte giriş tensörünün ortalama ve varyansına eşit sabitleri etkin bir şekilde üretecektir. Daha sonra ortalamayı çıkarmak ve standart sapmaya bölmek için TensorFlow işlemlerini kullanacaktır.

TensorFlow Dönüşümü preprocessing_fn

TFX Transform bileşeni, verilerin okunması ve yazılmasıyla ilgili API çağrılarını işleyerek ve SavedModel çıktısını diske yazarak Transform kullanımını basitleştirir. Bir TFX kullanıcısı olarak, yalnızca preprocessing_fn adında tek bir işlevi tanımlamanız gerekir. Gelen preprocessing_fn Eğer tensörlerinin çıktı dicti üretmek için tensörlerinin giriş dicti manipüle fonksiyonları bir dizi tanımlar. Scale_to_0_1 ve compute_and_apply_vocabulary gibi TensorFlow Transform API gibi yardımcı işlevleri 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:
    # Preserve this feature as a dense float, setting nan's to the mean.
    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 girdilerinin anlaşılması

preprocessing_fn (olduğunu tansörleri üzerinde bir dizi işlemi anlatmaktadır Tensor ler veya SparseTensor ler) ve bu yüzden yazmak için preprocessing_fn sizin veri tensörlerin olarak temsil edilir anlamak gerekir doğru. 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 başka bir TensorFlow Transform tarafından kullanılmayan seçenekler).

Bir özellik spec çıkarım kuralları Schema vardır

  • shape setine sahip her feature , shape ve default_value=None ile bir tf.FixedLenFeature ile sonuçlanır. presence.min_fraction olmalı 1 aksi ve hata neden olur, varsayılan değer yok ne zamandan beri, bir tf.FixedLenFeature daima mevcut olması özelliğini gerektirir.
  • shape ayarlanmayan her feature bir VarLenFeature .
  • Her sparse_feature bir sonuçlanacaktır tf.SparseFeature olan size ve is_sorted tarafından belirlenir fixed_shape ve is_sorted alanlarını SparseFeature mesajının.
  • Bir sparse_feature için index_feature veya value_feature olarak kullanılan özelliklerin, özellik spesifikasyonunda oluşturulan kendi girişleri olmayacaktır.
  • Arasındaki iletişim type alanında feature (ya da değerleri özelliği sparse_feature proto) ve dtype özelliği spec aşağıdaki tabloda verilmektedir:
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, TensorFlow Transform'u hem bir kelime haznesi oluşturmak hem de dizeleri tamsayılara dönüştürmek için bu kelime dağarcığını uygulamak için kullanmak ister. Bu iş akışını takip zaman input_fn modeli irade çıkışı integerized dize inşa. Bununla birlikte, etiketler bir istisnadır, çünkü modelin çıktı (tamsayı) etiketlerini dizelere geri input_fn için modelin, etiketin olası değerlerinin bir listesiyle birlikte bir dize etiketi input_fn 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 parametre olarak tahmin input_fn gerekir (aşağıdaki ayrıntılara bakın).

Dize etiketlerinin tamsayılarla eşlenmesini işlemek için, bir kelime haznesi oluşturmak için TensorFlow Transform'u kullanmalısınız. Bunu aşağıdaki kod pasajında ​​gösteriyoruz:

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

  ...


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

  ...

Yukarıdaki ön işleme işlevi ham girdi özelliğini alır (bu aynı zamanda önişleme işlevinin çıktısının bir parçası olarak döndürülür) ve tft.uniques üzerinde tft.uniques ç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 haznesi oluşturmayı gösterir. Özellikle ham etiket education alır ve ilk 5 etiketi (sıklığa göre) hariç tümünü etiketi bir tam sayıya dönüştürmeden UNKNOWN dönüştürür.

Model kodunda, sınıflandırıcı tarafından üretilen kelime verilmelidir tft.uniques olarak label_vocabulary argüman. Bu, önce bu kelime dağarcığını yardımcı işlevi olan bir liste olarak okuyarak yapılır. Bu, aşağıdaki ön bilgide gösterilmektedir. Örnek kodun yukarıda tartışılan dönüştürülmüş etiketi kullandığına dikkat edin, ancak burada ham etiketi kullanmak için 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,
      ...)