Thành phần đường dẫn Transform TFX thực hiện kỹ thuật tính năng trên tf.Examples được phát ra từ thành phần SampleGen , sử dụng lược đồ dữ liệu được tạo bởi thành phần SchemaGen và phát ra cả SavingModel cũng như số liệu thống kê về cả dữ liệu trước và sau chuyển đổi. Khi được thực thi, SavingModel sẽ chấp nhận tf.Examples được phát ra từ một thành phần exampleGen và phát ra dữ liệu tính năng đã được chuyển đổi.
- Tiêu thụ: tf.Examples từ thành phần exampleGen và lược đồ dữ liệu từ thành phần SchemaGen.
- Phát ra: Một SavingModel cho thành phần Trainer, số liệu thống kê trước và sau chuyển đổi.
Cấu hình một thành phần chuyển đổi
Sau khi preprocessing_fn
của bạn được viết, nó cần được xác định trong mô-đun python, sau đó được cung cấp cho thành phần Transform làm đầu vào. Mô-đun này sẽ được tải bằng Transform và hàm có tên preprocessing_fn
sẽ được Transform tìm thấy và sử dụng để xây dựng quy trình tiền xử lý.
transform = Transform(
examples=example_gen.outputs['examples'],
schema=schema_gen.outputs['schema'],
module_file=os.path.abspath(_taxi_transform_module_file))
Ngoài ra, bạn có thể muốn cung cấp các tùy chọn cho tính toán thống kê trước hoặc sau chuyển đổi dựa trên TFDV . Để làm như vậy, hãy xác định stats_options_updater_fn
trong cùng một mô-đun.
Biến đổi và biến đổi TensorFlow
Transform sử dụng rộng rãi TensorFlow Transform để thực hiện kỹ thuật tính năng trên tập dữ liệu của bạn. TensorFlow Transform là một công cụ tuyệt vời để chuyển đổi dữ liệu tính năng trước khi chuyển sang mô hình của bạn và là một phần của quá trình đào tạo. Các chuyển đổi tính năng phổ biến bao gồm:
- Nhúng : chuyển đổi các đối tượng thưa thớt (như ID số nguyên do từ vựng tạo ra) thành các đối tượng dày đặc bằng cách tìm ánh xạ có ý nghĩa từ không gian có chiều cao sang không gian có chiều thấp. Xem phần Nhúng trong Khóa học cấp tốc về máy học để biết phần giới thiệu về phần nhúng.
- Tạo từ vựng : chuyển đổi chuỗi hoặc các tính năng không phải số khác thành số nguyên bằng cách tạo từ vựng ánh xạ từng giá trị duy nhất thành số ID.
- Chuẩn hóa các giá trị : chuyển đổi các đặc điểm số để tất cả chúng đều nằm trong một phạm vi tương tự.
- Nhóm hóa : chuyển đổi các tính năng có giá trị liên tục thành các tính năng phân loại bằng cách gán giá trị cho các nhóm riêng biệt.
- Làm phong phú thêm các tính năng văn bản : tạo ra các tính năng từ dữ liệu thô như mã thông báo, n-gram, thực thể, tình cảm, v.v., để làm phong phú thêm bộ tính năng.
TensorFlow Transform cung cấp hỗ trợ cho những loại chuyển đổi này và nhiều loại chuyển đổi khác:
Tự động tạo từ vựng từ dữ liệu mới nhất của bạn.
Thực hiện các phép biến đổi tùy ý trên dữ liệu của bạn trước khi gửi nó đến mô hình của bạn. TensorFlow Transform xây dựng các phép biến đổi thành biểu đồ TensorFlow cho mô hình của bạn để các phép biến đổi tương tự được thực hiện trong thời gian đào tạo và suy luận. Bạn có thể xác định các phép biến đổi tham chiếu đến các thuộc tính chung của dữ liệu, chẳng hạn như giá trị tối đa của một tính năng trên tất cả các phiên bản đào tạo.
Bạn có thể chuyển đổi dữ liệu của mình theo cách bạn muốn trước khi chạy TFX. Nhưng nếu bạn thực hiện điều đó trong TensorFlow Transform, các phép biến đổi sẽ trở thành một phần của biểu đồ TensorFlow. Cách tiếp cận này giúp tránh việc đào tạo/giao bóng sai lệch.
Các chuyển đổi bên trong mã mô hình hóa của bạn sử dụng FeatureColumns. Bằng cách sử dụng FeatureColumns, bạn có thể xác định các nhóm, số nguyên hóa sử dụng từ vựng được xác định trước hoặc bất kỳ phép biến đổi nào khác có thể được xác định mà không cần xem dữ liệu.
Ngược lại, TensorFlow Transform được thiết kế cho các phép biến đổi yêu cầu truyền toàn bộ dữ liệu để tính toán các giá trị chưa được biết trước. Ví dụ: việc tạo từ vựng yêu cầu phải truyền toàn bộ dữ liệu.
Ngoài việc tính toán các giá trị bằng Apache Beam, TensorFlow Transform cho phép người dùng nhúng các giá trị này vào biểu đồ TensorFlow, sau đó có thể tải biểu đồ này vào biểu đồ huấn luyện. Ví dụ: khi chuẩn hóa các đối tượng, hàm tft.scale_to_z_score
sẽ tính giá trị trung bình và độ lệch chuẩn của một đối tượng, đồng thời cũng là biểu diễn trong biểu đồ TensorFlow của hàm trừ giá trị trung bình và chia cho độ lệch chuẩn. Bằng cách phát ra biểu đồ TensorFlow, không chỉ số liệu thống kê, TensorFlow Transform đơn giản hóa quá trình soạn thảo quy trình tiền xử lý của bạn.
Vì quá trình tiền xử lý được biểu thị dưới dạng biểu đồ nên nó có thể diễn ra trên máy chủ và được đảm bảo tính nhất quán giữa đào tạo và phân phối. Tính nhất quán này giúp loại bỏ một nguồn sai lệch về đào tạo/phục vụ.
TensorFlow Transform cho phép người dùng chỉ định quy trình tiền xử lý của họ bằng mã TensorFlow. Điều này có nghĩa là một đường ống được xây dựng theo cách tương tự như biểu đồ TensorFlow. Nếu chỉ sử dụng các hoạt động TensorFlow trong biểu đồ này thì đường dẫn sẽ là một bản đồ thuần túy chấp nhận các lô đầu vào và trả về các lô đầu ra. Quy trình như vậy sẽ tương đương với việc đặt biểu đồ này bên trong input_fn
của bạn khi sử dụng API tf.Estimator
. Để chỉ định các hoạt động vượt qua đầy đủ chẳng hạn như lượng tử tính toán, TensorFlow Transform cung cấp các chức năng đặc biệt gọi là analyzers
trông giống như các hoạt động của TensorFlow, nhưng trên thực tế chỉ định một tính toán trì hoãn sẽ được thực hiện bởi Apache Beam và đầu ra được chèn vào biểu đồ dưới dạng không thay đổi. Mặc dù hoạt động TensorFlow thông thường sẽ lấy một lô làm đầu vào, thực hiện một số tính toán chỉ trên lô đó và phát ra một lô, nhưng analyzer
sẽ thực hiện giảm tổng thể (được triển khai trong Apache Beam) trên tất cả các lô và trả về kết quả.
Bằng cách kết hợp các hoạt động TensorFlow thông thường và máy phân tích TensorFlow Transform, người dùng có thể tạo các quy trình phức tạp để xử lý trước dữ liệu của họ. Ví dụ: hàm tft.scale_to_z_score
lấy một tenxơ đầu vào và trả về tenxơ đó được chuẩn hóa thành giá trị trung bình 0
và phương sai 1
. Nó thực hiện điều này bằng cách gọi các bộ phân tích mean
và var
dưới mui xe, điều này sẽ tạo ra các hằng số trong biểu đồ một cách hiệu quả bằng giá trị trung bình và phương sai của tenxơ đầu vào. Sau đó, nó sẽ sử dụng các hoạt động TensorFlow để trừ giá trị trung bình và chia cho độ lệch chuẩn.
preprocessing_fn
biến đổi TensorFlow_fn
Thành phần TFX Transform đơn giản hóa việc sử dụng Transform bằng cách xử lý các lệnh gọi API liên quan đến đọc và ghi dữ liệu cũng như ghi đầu ra SavingModel vào đĩa. Là người dùng TFX, bạn chỉ phải xác định một hàm duy nhất gọi là preprocessing_fn
. Trong preprocessing_fn
bạn xác định một loạt các hàm thao tác lệnh đầu vào của tensor để tạo ra lệnh đầu ra của tensor. Bạn có thể tìm thấy các hàm trợ giúp như test_to_0_1 và tính toán_and_apply_vocabulary API biến đổi TensorFlow hoặc sử dụng các hàm TensorFlow thông thường như hiển thị bên dưới.
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
Hiểu các đầu vào của preprocessing_fn
preprocessing_fn
mô tả một loạt các thao tác trên tensor (nghĩa là Tensor
s, SparseTensor
s hoặc RaggedTensor
s). Để xác định chính xác preprocessing_fn
cần phải hiểu cách dữ liệu được biểu diễn dưới dạng tensor. Đầu vào của preprocessing_fn
được xác định bởi lược đồ. Nguyên Schema
cuối cùng được chuyển đổi thành "thông số tính năng" (đôi khi được gọi là "thông số phân tích cú pháp") được sử dụng để phân tích cú pháp dữ liệu, xem thêm chi tiết về logic chuyển đổi tại đây .
Sử dụng TensorFlow Transform để xử lý nhãn chuỗi
Thông thường, người ta muốn sử dụng TensorFlow Transform để vừa tạo từ vựng vừa áp dụng từ vựng đó để chuyển đổi chuỗi thành số nguyên. Khi làm theo quy trình công việc này, input_fn
được xây dựng trong mô hình sẽ xuất ra chuỗi số nguyên. Tuy nhiên, nhãn là một ngoại lệ, vì để mô hình có thể ánh xạ nhãn đầu ra (số nguyên) trở lại chuỗi, mô hình cần input_fn
để xuất nhãn chuỗi, cùng với danh sách các giá trị có thể có của nhãn. Ví dụ: nếu nhãn là cat
và dog
thì đầu ra của input_fn
phải là các chuỗi thô này và các khóa ["cat", "dog"]
cần được chuyển vào công cụ ước tính dưới dạng tham số (xem chi tiết bên dưới).
Để xử lý việc ánh xạ nhãn chuỗi thành số nguyên, bạn nên sử dụng TensorFlow Transform để tạo từ vựng. Chúng tôi chứng minh điều này trong đoạn mã dưới đây:
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)
...
Hàm tiền xử lý ở trên lấy tính năng đầu vào thô (cũng sẽ được trả về như một phần đầu ra của hàm tiền xử lý) và gọi tft.vocabulary
trên đó. Điều này dẫn đến việc tạo ra một vốn từ vựng dành cho education
có thể được truy cập trong mô hình.
Ví dụ này cũng cho thấy cách chuyển đổi nhãn và sau đó tạo từ vựng cho nhãn được chuyển đổi. Cụ thể, nó yêu cầu education
về nhãn thô và chuyển đổi tất cả ngoại trừ 5 nhãn hàng đầu (theo tần suất) thành UNKNOWN
mà không chuyển đổi nhãn thành số nguyên.
Trong mã mô hình, trình phân loại phải được cung cấp từ vựng do tft.vocabulary
tạo ra làm đối label_vocabulary
. Điều này được thực hiện bằng cách trước tiên đọc từ vựng này dưới dạng danh sách có chức năng trợ giúp. Điều này được thể hiện trong đoạn trích dưới đây. Lưu ý mã ví dụ sử dụng nhãn đã chuyển đổi đã thảo luận ở trên nhưng ở đây chúng tôi hiển thị mã để sử dụng nhãn thô.
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,
...)
Định cấu hình thống kê trước và sau chuyển đổi
Như đã đề cập ở trên, thành phần Biến đổi gọi TFDV để tính toán cả số liệu thống kê trước và sau chuyển đổi. TFDV lấy đầu vào là một đối tượng StatsOptions tùy chọn. Người dùng có thể muốn định cấu hình đối tượng này để kích hoạt một số thống kê bổ sung nhất định (ví dụ: thống kê NLP) hoặc đặt các ngưỡng được xác thực (ví dụ: tần suất mã thông báo tối thiểu / tối đa). Để làm như vậy, hãy xác định stats_options_updater_fn
trong tệp mô-đun.
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
Số liệu thống kê sau biến đổi thường được hưởng lợi từ kiến thức về từ vựng được sử dụng để tiền xử lý một tính năng. Tên từ vựng để ánh xạ đường dẫn được cung cấp cho StatsOptions (và do đó là TFDV) cho mọi từ vựng do TFT tạo ra. Ngoài ra, có thể thêm ánh xạ cho các từ vựng được tạo bên ngoài bằng cách (i) sửa đổi trực tiếp từ điển vocab_paths
trong StatsOptions hoặc bằng cách (ii) sử dụng tft.annotate_asset
.