Thành phần kỹ thuật tính năng của TensorFlow Extended (TFX)
Sổ tay chuyên mục ví dụ này cung cấp một ví dụ rất đơn giản về cách TensorFlow Transform ( tf.Transform
) có thể được sử dụng để xử lý trước dữ liệu bằng cách sử dụng chính xác cùng một mã cho cả việc đào tạo mô hình và cung cấp các suy luận trong sản xuất.
TensorFlow Transform là một thư viện để xử lý trước dữ liệu đầu vào cho TensorFlow, bao gồm việc tạo các tính năng yêu cầu chuyển toàn bộ tập dữ liệu đào tạo. Ví dụ: sử dụng TensorFlow Transform, bạn có thể:
- Chuẩn hóa giá trị đầu vào bằng cách sử dụng giá trị trung bình và độ lệch chuẩn
- Chuyển đổi chuỗi thành số nguyên bằng cách tạo từ vựng trên tất cả các giá trị đầu vào
- Chuyển đổi float thành số nguyên bằng cách gán chúng vào nhóm, dựa trên phân phối dữ liệu quan sát được
TensorFlow có hỗ trợ tích hợp cho các thao tác trên một ví dụ hoặc một loạt ví dụ. tf.Transform
mở rộng các khả năng này để hỗ trợ chuyển toàn bộ qua toàn bộ tập dữ liệu đào tạo.
Đầu ra của tf.Transform
được xuất dưới dạng biểu đồ TensorFlow mà bạn có thể sử dụng cho cả đào tạo và phục vụ. Việc sử dụng cùng một biểu đồ cho cả quá trình luyện tập và phục vụ có thể ngăn chặn sự sai lệch, vì các phép biến đổi giống nhau được áp dụng trong cả hai giai đoạn.
Nâng cấp Pip
Để tránh nâng cấp Pip trong hệ thống khi chạy cục bộ, hãy kiểm tra để đảm bảo rằng chúng tôi đang chạy trong Colab. Hệ thống cục bộ tất nhiên có thể được nâng cấp riêng.
try:
import colab
!pip install --upgrade pip
except:
pass
Cài đặt TensorFlow Transform
pip install -q -U tensorflow_transform
Bạn có khởi động lại thời gian chạy không?
Nếu bạn đang sử dụng Google Colab, lần đầu tiên bạn chạy ô ở trên, bạn phải khởi động lại thời gian chạy (Runtime> Restart runtime ...). Điều này là do cách Colab tải các gói.
Nhập khẩu
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
Dữ liệu: Tạo một số dữ liệu giả
Chúng tôi sẽ tạo một số dữ liệu giả đơn giản cho ví dụ đơn giản của chúng tôi:
-
raw_data
là dữ liệu thô ban đầu mà chúng tôi sẽ xử lý trước -
raw_data_metadata
chứa lược đồ cho chúng ta biết kiểu của từng cột trongraw_data
. Trong trường hợp này, nó rất đơn giản.
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),
}))
Chuyển đổi: Tạo một chức năng tiền xử lý
Hàm tiền xử lý là khái niệm quan trọng nhất của tf.Transform. Chức năng tiền xử lý là nơi mà việc chuyển đổi tập dữ liệu thực sự xảy ra. Nó chấp nhận và trả về một từ điển các tensor, trong đó tensor có nghĩa là Tensor
hoặcSparseTensor
. Có hai nhóm lệnh gọi API chính thường tạo thành trung tâm của một hàm tiền xử lý:
- TensorFlow Ops: Bất kỳ hàm nào chấp nhận và trả về tensor, thường có nghĩa là hoạt động TensorFlow. Các thao tác này thêm các hoạt động TensorFlow vào biểu đồ để biến đổi dữ liệu thô thành dữ liệu đã biến đổi, từng vectơ đặc trưng tại một thời điểm. Chúng sẽ chạy cho mọi ví dụ, trong cả quá trình đào tạo và phục vụ.
- Tensorflow Transform Analyzers / Mappers: Bất kỳ thiết bị phân tích / ánh xạ nào do tf.Transform cung cấp. Chúng cũng chấp nhận và trả về các tensor, và thường chứa sự kết hợp giữa các hoạt động Tensorflow và tính toán Beam, nhưng không giống như các hoạt động TensorFlow, chúng chỉ chạy trong đường ống Beam trong quá trình phân tích yêu cầu chuyển toàn bộ qua toàn bộ tập dữ liệu đào tạo. Tính toán Beam chỉ chạy một lần, trong quá trình đào tạo và thường thực hiện toàn bộ toàn bộ tập dữ liệu đào tạo. Chúng tạo ra các hằng số tensor, được thêm vào đồ thị của bạn. Ví dụ: tft.min tính toán giá trị tối thiểu của tensor trên tập dữ liệu huấn luyện trong khi tft.scale_by_min_max trước tiên tính toán giá trị tối thiểu và tối đa của tensor trên tập dữ liệu huấn luyện và sau đó chia tỉ lệ tensor trong phạm vi do người dùng chỉ định, [output_min, output_max]. tf.Transform cung cấp một tập hợp cố định gồm các trình phân tích / lập bản đồ như vậy, nhưng điều này sẽ được mở rộng trong các phiên bản tương lai.
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,
}
Để tất cả chúng cùng nhau
Bây giờ chúng tôi đã sẵn sàng để chuyển đổi dữ liệu của mình. Chúng tôi sẽ sử dụng Apache Beam với một người chạy trực tiếp và cung cấp ba đầu vào:
-
raw_data
- Dữ liệu đầu vào thô mà chúng tôi đã tạo ở trên -
raw_data_metadata
- Lược đồ cho dữ liệu thô -
preprocessing_fn
- Hàm mà chúng tôi đã tạo để thực hiện chuyển đổi
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()
WARNING: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}]
Đây có phải là câu trả lời đúng?
Trước đây, chúng tôi đã sử dụng tf.Transform
để thực hiện việc này:
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
Với đầu vào là [1, 2, 3]
giá trị trung bình của x là 2 và chúng ta lấy x trừ đi để căn giữa các giá trị x của chúng ta bằng 0. Vì vậy, kết quả của [-1.0, 0.0, 1.0]
là đúng.
y_normalized
Chúng tôi muốn chia tỷ lệ các giá trị y của mình trong khoảng từ 0 đến 1. Đầu vào của chúng tôi là [1, 2, 3]
vì vậy kết quả [0.0, 0.5, 1.0]
của chúng tôi là chính xác.
s_integerized
Chúng tôi muốn ánh xạ các chuỗi của mình thành các chỉ mục trong một từ vựng và chỉ có 2 từ trong từ vựng của chúng tôi ("xin chào" và "thế giới"). Vì vậy, với đầu vào là ["hello", "world", "hello"]
kết quả [0, 1, 0]
của chúng tôi là chính xác. Vì "xin chào" xuất hiện thường xuyên nhất trong dữ liệu này nên nó sẽ là mục nhập đầu tiên trong từ vựng.
x_centered_times_y_normalized
Chúng tôi muốn tạo một tính năng mới bằng cách x_centered
và y_normalized
bằng phép nhân. Lưu ý rằng điều này nhân kết quả, không phải giá trị ban đầu và kết quả mới của chúng tôi là [-0.0, 0.0, 1.0]
là chính xác.