Thành phần đường ống chuyển đổi TFX

Thành phần đường ống Transform TFX thực hiện kỹ thuật tính năng trên tf . Khi được thực thi, SavedModel 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 đã biến đổi.

  • Tiêu dùng: tf. Ví dụ từ một thành phần ExampleGen và một lược đồ dữ liệu từ một thành phần SchemaGen.
  • Phát ra: Một thành phần SavedModel tới một Trainer, thống kê trước khi chuyển đổi và sau khi chuyển đổi.

Cấu hình một thành phần chuyển đổi

Khi preprocessing_fn của bạn được viết, nó cần phải được xác định trong mô-đun python, mô-đun này sau đó được cung cấp cho thành phần Transform dưới dạng đầu vào. Mô-đun này sẽ được tải bằng biến đổi và hàm có tên là preprocessing_fn sẽ được Transform tìm thấy và sử dụng để xây dựng đường ống 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 phép tính 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.

Transform và TensorFlow Transform

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 phép biến đổi tính năng phổ biến bao gồm:

  • Nhúng : chuyển đổi các đối tượng địa lý thưa thớt (như ID số nguyên do từ vựng tạo ra) thành các đối tượng địa lý dày đặc bằng cách tìm ánh xạ có ý nghĩa từ không gian chiều cao sang không gian chiều thấp. Xem đơn vị Nhúng trong Khóa học về sự cố do học máy để biết phần giới thiệu về các thao tác 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ạ mỗi giá trị duy nhất thành một số ID.
  • Chuẩn hóa giá trị : chuyển đổi các đối tượng địa lý số để tất cả chúng nằm trong một phạm vi tương tự.
  • Bucketization : chuyển đổi các đối tượng địa lý có giá trị liên tục thành các đối tượng địa lý phân loại bằng cách gán giá trị cho các nhóm rời rạc.
  • Làm phong phú các tính năng văn bản : tạo 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 biến đổi này và nhiều loại biế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 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 tại thời điểm đà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 đối tượng trong tất cả các trường hợp đào tạo.

Bạn có thể chuyển đổi dữ liệu của mình theo bất kỳ cách nào bạn muốn trước khi chạy TFX. Nhưng nếu bạn làm đ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 / phục vụ lệch.

Các chuyển đổi bên trong mã mô hình của bạn sử dụng FeatureColumns. Sử dụng FeatureColumns, bạn có thể xác định bucketizations, tương tác sử dụng từ vựng được xác định trước hoặc bất kỳ 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 chuyển toàn bộ dữ liệu để tính toán các giá trị chưa được biết trước. Ví dụ, quá trình tạo từ vựng yêu cầu chuyển toàn bộ dữ liệu.

Ngoài các giá trị tính toán 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 các giá trị này vào biểu đồ đào tạo. Ví dụ: khi chuẩn hóa các đối tượng địa lý, 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 địa lý, đồng thời biểu diễn, trong biểu đồ TensorFlow, hàm trừ đi giá trị trung bình và chia cho độ lệch chuẩn. Bằng cách tạo ra biểu đồ TensorFlow, không chỉ là số liệu thống kê, TensorFlow Transform đơn giản hóa quá trình tạo nguồn tiền xử lý của bạn.

Vì quá trình tiền xử lý được biểu thị dưới dạng đồ thị, nó có thể xảy ra trên máy chủ và nó được đảm bảo nhất quán giữa đào tạo và phục vụ. Tính nhất quán này loại bỏ một nguồn đào tạo / lệch khẩu phần.

TensorFlow Transform cho phép người dùng chỉ định đường ống tiền xử lý của họ bằng cách sử dụng mã TensorFlow. Điều này có nghĩa là một đường ống được xây dựng theo cách giống như biểu đồ TensorFlow. Nếu chỉ sử dụng các hoạt động TensorFlow trong biểu đồ này, đường ống 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. Một đường dẫn 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 truyền đầ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 được gọi là analyzers xuất hiện giống như 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. Trong khi một op TensorFlow thông thường sẽ lấy một lô duy nhất làm đầu vào của nó, thực hiện một số tính toán trên chỉ lô đó và tạo ra một lô, một analyzer sẽ thực hiện giảm toàn cục (được thực hiện 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 đường ống phức tạp để xử lý trước dữ liệu của họ. Ví dụ, hàm tft.scale_to_z_score nhận một tensor đầu vào và trả về tensor đó được chuẩn hóa để có 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 meanvar , sẽ tạo ra một cách hiệu quả các hằng số trong biểu đồ bằng giá trị trung bình và phương sai của tensor đầ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.

TensorFlow Transform preprocessing_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 việc đọc và ghi dữ liệu cũng như ghi đầu ra SavedModel vào đĩa. Là người dùng TFX, bạn chỉ phải xác định một chức năng duy nhất được 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 các 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ư scale_to_0_1 và compute_and_apply_vocabulary API TensorFlow Transform hoặc sử dụng các hàm TensorFlow thông thường như được 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 cho preprocessing_fn

Tiền preprocessing_fn mô tả một loạt các hoạt động trên tensor (nghĩa là Tensor s hoặc SparseTensor s) và do đó, để viết preprocessing_fn một cách chính xác, cần phải hiểu cách dữ liệu của bạn được biểu diễn dưới dạng tensors. Đầu vào cho preprocessing_fn được xác định bởi lược đồ. Một proto của Schema chứa danh sách các Feature và Transform chuyển đổi các tính năng này thành "đặc điểm tính năng" (đôi khi được gọi là "thông số phân tích cú pháp") là một mệnh lệnh có các khóa là tên tính năng và có giá trị là một trong FixedLenFeature hoặc VarLenFeature (hoặc khác các tùy chọn không được TensorFlow Transform sử dụng).

Các quy tắc để suy ra một đặc điểm tính năng từ Schema

  • Mỗi feature có tập hợp shape sẽ dẫn đến một tf.FixedLenFeature với hình dạng và default_value=None . Hiện presence.min_fraction phải là 1 nếu không và sẽ xảy ra lỗi, vì khi không có giá trị mặc định, tf.FixedLenFeature yêu cầu tính năng phải luôn hiện diện.
  • Mỗi featureshape không được đặt sẽ dẫn đến một VarLenFeature .
  • Mỗi hệ số phân loại sẽ dẫn tf.SparseFeature sparse_feature sizeis_sorted được xác định bởi các trường fixed_shapeis_sorted của thông báo SparseFeature .
  • Các tính năng được sử dụng làm index_feature hoặc value_feature của một sparse_feature sẽ không có mục nhập riêng được tạo trong đặc điểm kỹ thuật.
  • Sự tương ứng giữa trường type của đối feature địa lý (hoặc đặc điểm giá trị của một sparse_feature ) và dtype của đặc điểm tính năng được đưa ra bởi bảng sau:
type dtype
schema_pb2.INT tf.int64
schema_pb2.FLOAT tf.float32
schema_pb2.BYTES tf.string

Sử dụng TensorFlow Transform để xử lý các 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 tuân theo quy trình làm việc này, input_fn được xây dựng trong mô hình sẽ xuất ra chuỗi được tăng cường. Tuy nhiên, nhãn là một ngoại lệ, vì để mô hình có thể ánh xạ các 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 các nhãn là catdog 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 bộ ước lượng dưới dạng tham số (xem chi tiết bên dưới).

Để xử lý ánh xạ các 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 của đầu ra của hàm tiền xử lý) và gọi tft.vocabulary trên đó. Điều này dẫn đến một từ vựng được tạo ra 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 một nhãn và sau đó tạo từ vựng cho nhãn đã chuyển đổi. Cụ thể, nó lấy education nhãn thô và chuyển đổi tất cả 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, bộ phân loại phải được cung cấp từ vựng được tạo bởi tft.vocabulary làm đối số label_vocabulary . Điều này được thực hiện trước tiên bằng cách đọ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 hiển thị trong đoạn mã dưới đây. Lưu ý rằng mã ví dụ sử dụng nhãn đã chuyển đổi được 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 chuyển đổi và sau chuyển đổi

Như đã đề cập ở trên, thành phần Transform gọi TFDV để tính toán cả số liệu thống kê trước khi chuyển đổi và sau khi chuyển đổi. TFDV nhận đầ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 chuyển đổi thường được hưởng lợi từ kiến ​​thức về từ vựng được sử dụng để xử lý trước một tính năng. Tên từ vựng đến á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. Ngoài ra, ánh xạ cho các từ vựng được tạo bên ngoài có thể được thêm bằng cách (i) sửa đổi trực tiếp từ điển vocab_paths trong StatsOptions hoặc bằng (ii) sử dụng tft.annotate_asset .