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 herfeature
,shape
vedefault_value=None
ile birtf.FixedLenFeature
ile sonuçlanır.presence.min_fraction
olmalı1
aksi ve hata neden olur, varsayılan değer yok ne zamandan beri, birtf.FixedLenFeature
daima mevcut olması özelliğini gerektirir. -
shape
ayarlanmayan herfeature
birVarLenFeature
. - Her
sparse_feature
bir sonuçlanacaktırtf.SparseFeature
olansize
veis_sorted
tarafından belirlenirfixed_shape
veis_sorted
alanlarınıSparseFeature
mesajının. - Bir
sparse_feature
içinindex_feature
veyavalue_feature
olarak kullanılan özelliklerin, özellik spesifikasyonunda oluşturulan kendi girişleri olmayacaktır. - Arasındaki iletişim
type
alanındafeature
(ya da değerleri özelliğisparse_feature
proto) vedtype
ö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,
...)