TensorFlow Extended'ın (TFX) Özellik Mühendisliği Bileşeni
Bu örnek ortak çalışma not defteri, TensorFlow Transform'un ( tf.Transform
) hem bir modeli eğitmek hem de üretimde çıkarımlar sunmak için tamamen aynı kodu kullanarak verileri önceden işlemek için nasıl kullanılabileceğine dair çok basit bir örnek sağlar.
TensorFlow Transform, eğitim veri kümesi üzerinde tam geçiş gerektiren özelliklerin oluşturulması da dahil olmak üzere, TensorFlow için giriş verilerini ön işlemeye yönelik bir kitaplıktır. Örneğin, TensorFlow Transform kullanarak şunları yapabilirsiniz:
- Ortalama ve standart sapmayı kullanarak bir giriş değerini normalleştirin
- Tüm giriş değerleri üzerinde bir sözlük oluşturarak dizeleri tam sayılara dönüştürün
- Gözlenen veri dağılımına dayalı olarak, kayan noktaları kovalara atayarak tam sayılara dönüştürün
TensorFlow, tek bir örnek veya bir grup örnek üzerinde manipülasyonlar için yerleşik desteğe sahiptir. tf.Transform
, tüm eğitim veri kümesi üzerinde tam geçişleri desteklemek için bu yetenekleri genişletir.
tf.Transform
çıktısı, hem eğitim hem de sunum için kullanabileceğiniz bir TensorFlow grafiği olarak dışa aktarılır. Her iki aşamada da aynı dönüşümler uygulandığından, hem eğitim hem de servis için aynı grafiğin kullanılması çarpıklığı önleyebilir.
Pip'i Yükselt
Yerel olarak çalışırken bir sistemde Pip'i yükseltmekten kaçınmak için Colab'da çalıştığımızdan emin olun. Yerel sistemler elbette ayrı ayrı yükseltilebilir.
try:
import colab
!pip install --upgrade pip
except:
pass
TensorFlow Transform'u yükleyin
pip install -q -U tensorflow_transform
Çalışma zamanını yeniden başlattınız mı?
Google Colab kullanıyorsanız, yukarıdaki hücreyi ilk kez çalıştırdığınızda, çalışma zamanını yeniden başlatmanız gerekir (Çalışma Zamanı > Çalışma zamanını yeniden başlat...). Bunun nedeni Colab'ın paketleri yükleme şeklidir.
ithalat
import pprint
import tempfile
import tensorflow as tf
import tensorflow_transform as tft
import tensorflow_transform.beam as tft_beam
from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import schema_utils
Veri: Bazı yapay veriler oluşturun
Basit örneğimiz için bazı basit yapay veriler oluşturacağız:
-
raw_data
, önceden işleyeceğimiz ilk ham veridir. -
raw_data_metadata
,raw_data
içindeki her bir sütunun türünü bize söyleyen şemayı içerir. Bu durumda, çok basit.
raw_data = [
{'x': 1, 'y': 1, 's': 'hello'},
{'x': 2, 'y': 2, 's': 'world'},
{'x': 3, 'y': 3, 's': 'hello'}
]
raw_data_metadata = dataset_metadata.DatasetMetadata(
schema_utils.schema_from_feature_spec({
'y': tf.io.FixedLenFeature([], tf.float32),
'x': tf.io.FixedLenFeature([], tf.float32),
's': tf.io.FixedLenFeature([], tf.string),
}))
Dönüştür: Bir ön işleme işlevi oluşturun
Önişleme işlevi , tf.Transform'un en önemli kavramıdır. Bir ön işleme işlevi, veri kümesinin dönüşümünün gerçekten gerçekleştiği yerdir. Bir tensörün bir Tensor
veyaSparseTensor
anlamına geldiği bir tensör sözlüğünü kabul eder ve döndürür. Genellikle bir ön işleme işlevinin kalbini oluşturan iki ana API çağrısı grubu vardır:
- TensorFlow Ops: Genellikle TensorFlow ops anlamına gelen, tensörleri kabul eden ve döndüren herhangi bir işlev. Bunlar, ham verileri dönüştürülmüş verilere her seferinde bir özellik vektörü dönüştüren grafiğe TensorFlow işlemlerini ekler. Bunlar, hem antrenman hem de servis sırasında her örnek için çalışacaktır.
- Tensorflow Dönüşüm Çözümleyicileri/Eşleştiricileri: tf.Transform tarafından sağlanan çözümleyicilerden/eşleştiricilerden herhangi biri. Bunlar ayrıca tensörleri kabul eder ve döndürür ve tipik olarak Tensorflow ops ve Beam hesaplamasının bir kombinasyonunu içerir, ancak TensorFlow ops'un aksine, bunlar yalnızca tüm eğitim veri kümesi üzerinde tam bir geçiş gerektiren analiz sırasında Beam ardışık düzeninde çalışırlar. Işın hesaplaması, eğitim sırasında yalnızca bir kez çalışır ve tipik olarak tüm eğitim veri kümesi üzerinde tam bir geçiş yapar. Grafiğinize eklenen tensör sabitleri oluştururlar. Örneğin, tft.min, eğitim veri kümesi üzerindeki minimum tensörü hesaplarken tft.scale_by_min_max, önce eğitim veri kümesi üzerindeki bir tensörün minimum ve maksimum değerini hesaplar ve ardından tensörü, kullanıcı tarafından belirtilen bir aralık içinde olacak şekilde ölçekler, [output_min, çıktı_maks]. tf.Transform, bu tür çözümleyicilerin/eşleyicilerin sabit bir kümesini sağlar, ancak bu, gelecek sürümlerde genişletilecektir.
def preprocessing_fn(inputs):
"""Preprocess input columns into transformed columns."""
x = inputs['x']
y = inputs['y']
s = inputs['s']
x_centered = x - tft.mean(x)
y_normalized = tft.scale_to_0_1(y)
s_integerized = tft.compute_and_apply_vocabulary(s)
x_centered_times_y_normalized = (x_centered * y_normalized)
return {
'x_centered': x_centered,
'y_normalized': y_normalized,
's_integerized': s_integerized,
'x_centered_times_y_normalized': x_centered_times_y_normalized,
}
Hepsini bir araya koy
Artık verilerimizi dönüştürmeye hazırız. Apache Beam'i doğrudan bir koşucu ile kullanacağız ve üç girdi sağlayacağız:
-
raw_data
- Yukarıda oluşturduğumuz ham girdi verileri -
raw_data_metadata
- Ham veriler için şema -
preprocessing_fn
- Dönüşümümüzü yapmak için oluşturduğumuz fonksiyon
def main():
# Ignore the warnings
with tft_beam.Context(temp_dir=tempfile.mkdtemp()):
transformed_dataset, transform_fn = ( # pylint: disable=unused-variable
(raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
preprocessing_fn))
transformed_data, transformed_metadata = transformed_dataset # pylint: disable=unused-variable
print('\nRaw data:\n{}\n'.format(pprint.pformat(raw_data)))
print('Transformed data:\n{}'.format(pprint.pformat(transformed_data)))
if __name__ == '__main__':
main()
tutucu6 l10n-yerWARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features. WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch). WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch). WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_transform/tf_utils.py:289: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version. Instructions for updating: Use ref() instead. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_transform/tf_utils.py:289: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version. Instructions for updating: Use ref() instead. WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch). WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch). WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py', '-f', '/tmp/tmp8aif_7w8.json', '--HistoryManager.hist_file=:memory:'] WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets 2022-02-03 10:18:41.378629: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets INFO:tensorflow:tensorflow_text is not available. INFO:tensorflow:tensorflow_text is not available. INFO:tensorflow:tensorflow_decision_forests is not available. INFO:tensorflow:tensorflow_decision_forests is not available. INFO:tensorflow:struct2tensor is not available. INFO:tensorflow:struct2tensor is not available. INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets INFO:tensorflow:tensorflow_text is not available. INFO:tensorflow:tensorflow_text is not available. INFO:tensorflow:tensorflow_decision_forests is not available. INFO:tensorflow:tensorflow_decision_forests is not available. INFO:tensorflow:struct2tensor is not available. INFO:tensorflow:struct2tensor is not available. Raw data: [{'s': 'hello', 'x': 1, 'y': 1}, {'s': 'world', 'x': 2, 'y': 2}, {'s': 'hello', 'x': 3, 'y': 3}] Transformed data: [{'s_integerized': 0, 'x_centered': -1.0, 'x_centered_times_y_normalized': -0.0, 'y_normalized': 0.0}, {'s_integerized': 1, 'x_centered': 0.0, 'x_centered_times_y_normalized': 0.0, 'y_normalized': 0.5}, {'s_integerized': 0, 'x_centered': 1.0, 'x_centered_times_y_normalized': 1.0, 'y_normalized': 1.0}]
Bu doğru cevap mı?
Önceden, bunu yapmak için tf.Transform
kullanıyorduk:
x_centered = x - tft.mean(x)
y_normalized = tft.scale_to_0_1(y)
s_integerized = tft.compute_and_apply_vocabulary(s)
x_centered_times_y_normalized = (x_centered * y_normalized)
x_centered
[1, 2, 3]
girişi ile x'in ortalaması 2'dir ve x değerlerimizi 0'da ortalamak için onu x'ten çıkarırız. Dolayısıyla [-1.0, 0.0, 1.0]
sonucumuz doğrudur.
y_normalize
Y değerlerimizi 0 ile 1 arasında ölçeklendirmek istedik. Girdimiz [1, 2, 3]
idi, dolayısıyla [0.0, 0.5, 1.0]
sonucumuz doğru.
s_integerized
Dizelerimizi bir sözlükteki dizinlere eşlemek istedik ve kelime dağarcığımızda sadece 2 kelime vardı ("merhaba" ve "dünya"). Yani ["hello", "world", "hello"]
girdisiyle [0, 1, 0]
sonucumuz doğrudur. "Merhaba" en sık bu verilerde geçtiğinden, kelime dağarcığındaki ilk giriş olacaktır.
x_centered_times_y_normalized
x_centered
ve y_normalized
çarpımını kullanarak yeni bir özellik oluşturmak istedik. Bunun orijinal değerleri değil sonuçları çarptığını ve yeni [-0.0, 0.0, 1.0]
doğru olduğunu unutmayın.