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ık 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ı verecektir. Bununla birlikte, etiketler bir istisnadır, çünkü modelin çıkış (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 bahsedildiğ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.