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
vedefault_value=None
ile birtf.FixedLenFeature
ile sonuçlanacaktır.presence.min_fraction
1
olmalıdır, aksi takdirde hata oluşur, çünkü varsayılan değer olmadığındatf.FixedLenFeature
özelliğin her zaman mevcut olmasını gerektirir. -
shape
ayarlanmayan herfeature
birVarLenFeature
ile sonuçlanacaktır. - Her
sparse_feature
,size
veis_sorted
SparseFeature
mesajınınfixed_shape
veis_sorted
alanları tarafından belirlenen birtf.SparseFeature
ile sonuçlanacaktır. - Bir
sparse_feature
index_feature
veyavalue_feature
olarak kullanılan özellikler, özellik belirtiminde oluşturulan kendi girişlerine sahip olmayacaktır. -
feature
type
alanı (veya birsparse_feature
protokolünün değerler özelliği) ile özellik belirtiminin türü arasındakidtype
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.