Trả lời cho sự kiện TensorFlow Everywhere tại địa phương của bạn ngay hôm nay!
Trang này được dịch bởi Cloud Translation API.
Switch to English

Bắt đầu với TensorFlow Transform

Hướng dẫn này giới thiệu các khái niệm cơ bản về tf.Transform và cách sử dụng chúng. Nó sẽ:

  • Xác định một chức năng tiền xử lý , một mô tả logic về đường ống chuyển đổi dữ liệu thô thành dữ liệu được sử dụng để đào tạo một mô hình học máy.
  • Hiển thị triển khai Apache Beam được sử dụng để chuyển đổi dữ liệu bằng cách chuyển đổi chức năng tiền xử lý thành một đường ống Beam .
  • Hiển thị các ví dụ sử dụng bổ sung.

Xác định một chức năng tiền xử lý

Chức năng 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à một mô tả logic về sự chuyển đổi của tập dữ liệu. Hàm tiền xử lý chấp nhận và trả về từ điển các tensor, trong đó tensor có nghĩa là Tensor hoặc SparseTensor . Có hai loại hàm được sử dụng để xác định hàm tiền xử lý:

  1. Bất kỳ hàm nào chấp nhận và trả về tensors. 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 đã chuyển đổi.
  2. Bất kỳ máy phân tích nào do tf.Transform cung cấp. Các trình phân tích cũng chấp nhận và trả về các tensor, nhưng không giống như các hàm TensorFlow, chúng không thêm các phép toán vào biểu đồ. Thay vào đó, các bộ phân tích khiến tf.Transform tính toán hoạt động vượt qua toàn bộ bên ngoài TensorFlow. Họ sử dụng các giá trị tensor đầu vào trên toàn bộ tập dữ liệu để tạo ra tensor không đổi được trả về dưới dạng đầu ra. Ví dụ: tft.min tính toán giá trị nhỏ nhất của một tensor trên tập dữ liệu. tf.Transform cung cấp một bộ phân tích cố định, nhưng điều này sẽ được mở rộng trong các phiên bản tương lai.

Ví dụ về chức năng tiền xử lý

Bằng cách kết hợp máy phân tích và các chức năng TensorFlow thông thường, người dùng có thể tạo các đường ống linh hoạt để chuyển đổi dữ liệu. Hàm tiền xử lý sau chuyển đổi từng tính năng trong số ba tính năng theo những cách khác nhau và kết hợp hai trong số các tính năng:

import tensorflow as tf
import tensorflow_transform as tft
import tensorflow_transform.beam as tft_beam

def preprocessing_fn(inputs):
  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,
      'x_centered_times_y_normalized': x_centered_times_y_normalized,
      's_integerized': s_integerized
  }

Ở đây, x , ysTensor đại diện cho các tính năng đầu vào. Tensor mới đầu tiên được tạo, x_centered , được xây dựng bằng cách áp dụng tft.mean cho x và trừ nó cho x . tft.mean(x) trả về một tensor đại diện cho giá trị trung bình của tensor x . x_centered là tensor x với giá trị trung bình bị trừ.

Tensor mới thứ hai, y_normalized , được tạo theo cách tương tự nhưng sử dụng phương thức tiện lợi tft.scale_to_0_1 . Phương pháp này thực hiện một cái gì đó tương tự như tính toán x_centered , cụ thể là tính toán tối đa và tối thiểu và sử dụng chúng để chia tỷ lệ y .

Tensor s_integerized cho thấy một ví dụ về thao tác chuỗi. Trong trường hợp này, chúng tôi lấy một chuỗi và ánh xạ nó thành một số nguyên. Điều này sử dụng hàm tiện lợitft.compute_and_apply_vocabulary . Hàm này sử dụng bộ phân tích để tính toán các giá trị duy nhất được lấy bởi các chuỗi đầu vào, sau đó sử dụng các phép toán TensorFlow để chuyển đổi các chuỗi đầu vào thành các chỉ số trong bảng các giá trị duy nhất.

Cột cuối cùng cho thấy rằng có thể sử dụng các phép toán TensorFlow để tạo các tính năng mới bằng cách kết hợp các tensor.

Chức năng tiền xử lý xác định một chuỗi hoạt động trên một tập dữ liệu. Để áp dụng đường ống, chúng tôi dựa vào triển khai cụ thể của API tf.Transform . Việc triển khai Apache Beam cung cấp PTransform áp dụng chức năng tiền xử lý của người dùng cho dữ liệu. Quy trình công việc điển hình của người dùng tf.Transform sẽ xây dựng một chức năng tiền xử lý, sau đó kết hợp chức năng này vào một đường ống Beam lớn hơn, tạo ra dữ liệu để đào tạo.

Hàng loạt

Batch là một phần quan trọng của TensorFlow. Vì một trong những mục tiêu của tf.Transform là cung cấp đồ thị TensorFlow để tiền xử lý có thể được kết hợp vào đồ thị phục vụ (và, tùy chọn, đồ thị đào tạo), nên việc phân phối cũng là một khái niệm quan trọng trong tf.Transform .

Mặc dù không rõ ràng trong ví dụ trên, nhưng chức năng tiền xử lý do người dùng xác định được chuyển qua các tensors đại diện cho các lô chứ không phải các trường hợp riêng lẻ, như xảy ra trong quá trình đào tạo và phục vụ với TensorFlow. Mặt khác, các bộ phân tích thực hiện tính toán trên toàn bộ tập dữ liệu trả về một giá trị duy nhất chứ không phải một loạt giá trị. xTensor có hình dạng là (batch_size,) , trong khi tft.mean(x)Tensor có hình dạng là () . Phép trừ x - tft.mean(x) phát trong đó giá trị của tft.mean(x) bị trừ khỏi mọi phần tử của lô được đại diện bởi x .

Triển khai Apache Beam

Trong khi chức năng tiền xử lý được dự định như một mô tả logic của một đường ống tiền xử lý được thực hiện trên nhiều khung xử lý dữ liệu, tf.Transform cung cấp một triển khai chuẩn được sử dụng trên Apache Beam. Triển khai này thể hiện chức năng cần thiết từ một triển khai. Không có API chính thức cho chức năng này, do đó, mỗi triển khai có thể sử dụng một API có tính thành ngữ cho khung xử lý dữ liệu cụ thể của nó.

Việc triển khai Apache Beam cung cấp hai PTransform được sử dụng để xử lý dữ liệu cho một chức năng tiền xử lý. Sau đây là cách sử dụng cho PTransform AnalyzeAndTransformDataset tổng hợp:

raw_data = [
    {'x': 1, 'y': 1, 's': 'hello'},
    {'x': 2, 'y': 2, 's': 'world'},
    {'x': 3, 'y': 3, 's': 'hello'}
]

raw_data_metadata = ...
transformed_dataset, transform_fn = (
    (raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
        preprocessing_fn))
transformed_data, transformed_metadata = transformed_dataset

Nội dung dữ liệu được transformed_data được hiển thị bên dưới và chứa các cột được biến đổi có cùng định dạng với dữ liệu thô. Đặc biệt, các giá trị của s_integerized[0, 1, 0] —các giá trị này phụ thuộc vào cách các từ helloworld được ánh xạ thành các số nguyên, có tính xác định. Đối với cột x_centered , chúng tôi đã trừ giá trị trung bình để các giá trị của cột x , là [1.0, 2.0, 3.0] , trở thành [-1.0, 0.0, 1.0] . Tương tự, phần còn lại của các cột khớp với giá trị mong đợi của chúng.

[{u's_integerized': 0,
  u'x_centered': -1.0,
  u'x_centered_times_y_normalized': -0.0,
  u'y_normalized': 0.0},
 {u's_integerized': 1,
  u'x_centered': 0.0,
  u'x_centered_times_y_normalized': 0.0,
  u'y_normalized': 0.5},
 {u's_integerized': 0,
  u'x_centered': 1.0,
  u'x_centered_times_y_normalized': 1.0,
  u'y_normalized': 1.0}]

Cả dữ liệu raw_data và dữ liệu được transformed_data đều là tập dữ liệu. Hai phần tiếp theo cho thấy cách triển khai Beam đại diện cho các tập dữ liệu và cách đọc và ghi dữ liệu vào đĩa. Giá trị trả về khác, transform_fn , đại diện cho phép biến đổi được áp dụng cho dữ liệu, được trình bày chi tiết bên dưới.

AnalyzeAndTransformDataset là thành phần của hai biến đổi cơ bản được cung cấp bởi việc triển khai AnalyzeDatasetTransformDataset . Vì vậy, hai đoạn mã sau đây là tương đương:

transformed_data, transform_fn = (
    my_data | tft_beam.AnalyzeAndTransformDataset(preprocessing_fn))
transform_fn = my_data | tft_beam.AnalyzeDataset(preprocessing_fn)
transformed_data = (my_data, transform_fn) | tft_beam.TransformDataset()

transform_fn là một hàm thuần túy đại diện cho một hoạt động được áp dụng cho mỗi hàng của tập dữ liệu. Đặc biệt, các giá trị của máy phân tích đã được tính toán và được coi là hằng số. Trong ví dụ, transform_fn chứa các hằng số là giá trị trung bình của cột x , giá trị nhỏ nhất và tối đa của cột y , và từ vựng được sử dụng để ánh xạ các chuỗi thành số nguyên.

Một tính năng quan trọng của tf.Transformtransform_fn đại diện cho một bản đồ trên hàng -đó là một chức năng thuần túy áp dụng cho mỗi hàng riêng biệt. Tất cả các tính toán để tổng hợp các hàng được thực hiện trong AnalyzeDataset . Hơn nữa, transform_fn được biểu diễn dưới dạng một TensorFlow Graph có thể được nhúng vào đồ thị phục vụ.

AnalyzeAndTransformDataset được cung cấp để tối ưu hóa trong trường hợp đặc biệt này. Đây là cùng một khuôn mẫu được sử dụng trong scikit-học , cung cấp fit , transform , và fit_transform phương pháp.

Định dạng dữ liệu và lược đồ

Triển khai TFT Beam chấp nhận hai định dạng dữ liệu đầu vào khác nhau. Định dạng "instance dict" (như trong ví dụ trên và trong simple_example.py ) là một định dạng trực quan và phù hợp với các tập dữ liệu nhỏ trong khi định dạng TFXIO ( Apache Arrow ) cung cấp hiệu suất được cải thiện và phù hợp với các tập dữ liệu lớn.

Việc triển khai Beam cho biết PCollection đầu vào sẽ ở định dạng nào bằng "siêu dữ liệu" đi kèm với PCollection:

(raw_data, raw_data_metadata) | tft.AnalyzeDataset(...)
  • Nếu raw_data_metadatadataset_metadata.DatasetMetadata (xem bên dưới, phần "Định dạng 'instance dict'"), thì raw_data phải ở định dạng "instance dict".
  • Nếu raw_data_metadatatfxio.TensorAdapterConfig (xem bên dưới, phần "Định dạng TFXIO"), thì raw_data được mong đợi ở định dạng TFXIO.

Định dạng "instance dict"

Trong các ví dụ mã trước đó, mã xác định raw_data_metadata bị bỏ qua. Siêu dữ liệu chứa lược đồ xác định bố cục của dữ liệu để nó được đọc và ghi sang các định dạng khác nhau. Ngay cả định dạng trong bộ nhớ được hiển thị trong phần cuối cùng cũng không tự mô tả và yêu cầu lược đồ để được hiểu là tensor.

Đây là định nghĩa của lược đồ cho dữ liệu ví dụ:

from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import schema_utils

raw_data_metadata = dataset_metadata.DatasetMetadata(
      schema_utils.schema_from_feature_spec({
        's': tf.io.FixedLenFeature([], tf.string),
        'y': tf.io.FixedLenFeature([], tf.float32),
        'x': tf.io.FixedLenFeature([], tf.float32),
    }))

Lớp dataset_schema.Schema chứa thông tin cần thiết để phân tích cú pháp dữ liệu từ định dạng trên đĩa hoặc trong bộ nhớ của nó thành tensor. Nó thường được xây dựng bằng cách gọi schema_utils.schema_from_feature_spec với các phím tính năng ánh xạ dict tới các giá trị tf.io.FixedLenFeature , tf.io.VarLenFeaturetf.io.SparseFeature . Xem tài liệu cho tf.parse_example để biết thêm chi tiết.

Ở trên, chúng tôi sử dụng tf.io.FixedLenFeature để chỉ ra rằng mỗi đối tượng chứa một số giá trị cố định, trong trường hợp này là một giá trị vô hướng duy nhất. Vì tf.Transform các trường hợp theo lô, Tensor thực tế đại diện cho đối tượng địa lý sẽ có hình dạng (None,) trong đó kích thước không xác định là kích thước lô.

Định dạng TFXIO

Với định dạng này, dữ liệu dự kiến ​​sẽ được chứa trong một pyarrow.RecordBatch . Đối với dữ liệu dạng bảng, triển khai Apache Beam của chúng tôi chấp nhận Arrow RecordBatch es bao gồm các cột thuộc các loại sau:

  • pa.list_(<primitive>) , trong đó <primitive>pa.int64() , pa.float32() pa.binary() hoặc pa.large_binary() .

  • pa.large_list(<primitive>)

Tập dữ liệu đầu vào đồ chơi mà chúng tôi đã sử dụng ở trên, khi được biểu diễn dưới dạng RecordBatch , trông giống như sau:

raw_data = [
    pa.record_batch([
        pa.array([[1], [2], [3]], pa.list_(pa.float32())),
        pa.array([[1], [2], [3]], pa.list_(pa.float32())),
        pa.array([['hello'], ['world'], ['hello']], pa.list_(pa.binary())),
    ], ['x', 'y', 's'])
]

Tương tự như DatasetMetadata cần đi kèm với định dạng "instance dict", cần có tfxio.TensorAdapterConfig để đi kèm với RecordBatch es. Nó bao gồm lược đồ Mũi tên của RecordBatch es và TensorRepresentations để xác định duy nhất cách các cột trong RecordBatch es có thể được hiểu là TensorFlow Tensors (bao gồm nhưng không giới hạn ở tf.Tensor, tf.SparseTensor).

TensorRepresentations là một Dict[Text, TensorRepresentation] thiết lập mối quan hệ giữa Tensor mà preprocessing_fn chấp nhận và các cột trong RecordBatch es. Ví dụ:

tensor_representation = {
    'x': text_format.Parse(
        """dense_tensor { column_name: "col1" shape { dim { size: 2 } } }"""
        schema_pb2.TensorRepresentation())
}

Có nghĩa là inputs['x'] trong preprocessing_fn phải là một tf.Tensor dày đặc, có giá trị đến từ cột tên 'col1' trong đầu vào RecordBatch es và hình dạng (theo lô) của nó phải là [batch_size, 2] .

TensorRepresentation là một Protobuf được định nghĩa trong Siêu dữ liệu TensorFlow .

Đầu vào và đầu ra với Apache Beam

Cho đến nay, chúng tôi đã thấy dữ liệu đầu vào và đầu ra trong danh sách python (của RecordBatch es hoặc từ điển phiên bản). Đây là một sự đơn giản hóa dựa vào khả năng của Apache Beam để làm việc với các danh sách cũng như biểu diễn dữ liệu chính của nó, PCollection .

PCollection là một biểu diễn dữ liệu tạo thành một phần của đường ống chùm. Đường ống Beam được hình thành bằng cách áp dụng các PTransform khác nhau, bao gồm AnalyzeDatasetTransformDataset , và chạy đường ống. PCollection không được tạo trong bộ nhớ của nhị phân chính, mà thay vào đó được phân phối giữa các PCollection (mặc dù phần này sử dụng chế độ thực thi trong bộ nhớ).

Nguồn PCollection đóng hộp PCollection ( TFXIO )

Định dạng RecordBatch mà triển khai của chúng tôi chấp nhận là định dạng phổ biến mà các thư viện TFX khác chấp nhận. Do đó, TFX cung cấp các "nguồn" thuận tiện (hay còn gọi là TFXIO ) đọc các tệp ở nhiều định dạng khác nhau trên đĩa và tạo ra các bản RecordBatch và cũng có thể cung cấp TensorAdapterConfig , bao gồm các TensorRepresentations suy luận.

Các TFXIO đó có thể được tìm thấy trong gói tfx_bsl ( tfx_bsl.public.tfxio ).

Ví dụ: tập dữ liệu "Thu nhập điều tra dân số"

Ví dụ sau đây yêu cầu cả đọc và ghi dữ liệu trên đĩa và biểu diễn dữ liệu dưới dạng PCollection (không phải danh sách), hãy xem: census_example.py . Dưới đây chúng tôi trình bày cách tải xuống dữ liệu và chạy ví dụ này. Tập dữ liệu "Thu nhập điều tra dân số" được cung cấp bởi Kho lưu trữ Máy học UCI . Tập dữ liệu này chứa cả dữ liệu phân loại và dữ liệu số.

Dữ liệu ở định dạng CSV, đây là hai dòng đầu tiên:

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K

Các cột của tập dữ liệu là phân loại hoặc số. Tập dữ liệu này mô tả một vấn đề phân loại: dự đoán cột cuối cùng mà cá nhân kiếm được nhiều hơn hoặc ít hơn 50 nghìn mỗi năm. Tuy nhiên, từ quan điểm của tf.Transform , nhãn này chỉ là một cột phân loại khác.

Chúng tôi sử dụng TFXIO đóng hộp TFXIO , BeamRecordCsvTFXIO để dịch các dòng CSV thành các RecordBatches . TFXIO yêu cầu hai thông tin quan trọng:

  • một Lược đồ siêu dữ liệu TensorFlow chứa thông tin về loại và hình dạng về mỗi cột CSV. TensorRepresentation s là một phần tùy chọn của Lược đồ; nếu không được cung cấp (đó là trường hợp trong ví dụ này), chúng sẽ được suy ra từ thông tin về loại và hình dạng. Người ta có thể lấy Lược đồ bằng cách sử dụng hàm trợ giúp mà chúng tôi cung cấp để dịch từ thông số phân tích cú pháp TF (được hiển thị trong ví dụ này) hoặc bằng cách chạy Xác thực dữ liệu TensorFlow .

  • danh sách tên cột, theo thứ tự chúng xuất hiện trong tệp CSV. Lưu ý rằng những tên đó phải khớp với tên đối tượng trong Lược đồ.

Trong ví dụ này, chúng tôi cho phép thiếu tính năng education-num . Điều này có nghĩa là nó được biểu diễn dưới dạng tf.io.VarLenFeature trong feature_spec và dưới dạng tf.SparseTensor trong preprocessing_fn . Các tính năng khác sẽ trở thành tf.Tensor s cùng tên trong preprocessing_fn .

csv_tfxio = tfxio.BeamRecordCsvTFXIO(
    physical_format='text', column_names=ordered_columns, schema=SCHEMA)

record_batches = (
    p
    | 'ReadTrainData' >> textio.ReadFromText(train_data_file)
    | ...  # fix up csv lines
    | 'ToRecordBatches' >> csv_tfxio.BeamSource())

tensor_adapter_config = csv_tfxio.TensorAdapterConfig()

Lưu ý rằng chúng tôi đã phải thực hiện một số sửa chữa bổ sung sau khi các dòng CSV được đọc vào. Nếu không, chúng tôi có thể dựa vào CsvTFXIO để xử lý cả việc đọc tệp và dịch sang RecordBatch es:

csv_tfxio = tfxio.CsvTFXIO(train_data_file, column_name=ordered_columns,
                           schema=SCHEMA)
record_batches = p | 'TFXIORead' >> csv_tfxio.BeamSource()
tensor_adapter_config = csv_tfxio.TensorAdapterConfig()

Quá trình tiền xử lý tương tự như ví dụ trước, ngoại trừ chức năng tiền xử lý được tạo theo chương trình thay vì chỉ định từng cột theo cách thủ công. Trong hàm tiền xử lý bên dưới, NUMERICAL_COLUMNSCATEGORICAL_COLUMNS là danh sách chứa tên của cột số và cột phân loại:

def preprocessing_fn(inputs):
  """Preprocess input columns into transformed columns."""
  # Since we are modifying some features and leaving others unchanged, we
  # start by setting `outputs` to a copy of `inputs.
  outputs = inputs.copy()

  # Scale numeric columns to have range [0, 1].
  for key in NUMERIC_FEATURE_KEYS:
    outputs[key] = tft.scale_to_0_1(outputs[key])

  for key in OPTIONAL_NUMERIC_FEATURE_KEYS:
    # This is a SparseTensor because it is optional. Here we fill in a default
    # value when it is missing.
      sparse = tf.sparse.SparseTensor(outputs[key].indices, outputs[key].values,
                                      [outputs[key].dense_shape[0], 1])
      dense = tf.sparse.to_dense(sp_input=sparse, default_value=0.)
    # Reshaping from a batch of vectors of size 1 to a batch to scalars.
    dense = tf.squeeze(dense, axis=1)
    outputs[key] = tft.scale_to_0_1(dense)

  # For all categorical columns except the label column, we generate a
  # vocabulary but do not modify the feature.  This vocabulary is instead
  # used in the trainer, by means of a feature column, to convert the feature
  # from a string to an integer id.
  for key in CATEGORICAL_FEATURE_KEYS:
    tft.vocabulary(inputs[key], vocab_filename=key)

  # For the label column we provide the mapping from string to index.
  initializer = tf.lookup.KeyValueTensorInitializer(
      keys=['>50K', '<=50K'],
      values=tf.cast(tf.range(2), tf.int64),
      key_dtype=tf.string,
      value_dtype=tf.int64)
  table = tf.lookup.StaticHashTable(initializer, default_value=-1)

  outputs[LABEL_KEY] = table.lookup(outputs[LABEL_KEY])

  return outputs

Một điểm khác biệt so với ví dụ trước là cột nhãn chỉ định thủ công ánh xạ từ chuỗi thành chỉ mục. Vì vậy, '>50' được ánh xạ tới 0'<=50K' được ánh xạ thành 1 vì rất hữu ích khi biết chỉ mục nào trong mô hình được đào tạo tương ứng với nhãn nào.

Biến record_batches đại diện cho một PCollection của pyarrow.RecordBatch es. tensor_adapter_config được đưa ra bởi csv_tfxio , được suy ra từ SCHEMA (và cuối cùng, trong ví dụ này, từ thông số phân tích cú pháp TF).

Giai đoạn cuối cùng là ghi dữ liệu đã biến đổi vào đĩa và có hình thức tương tự như đọc dữ liệu thô. Lược đồ được sử dụng để làm điều này là một phần của đầu ra của AnalyzeAndTransformDataset , nó đưa ra một lược đồ cho dữ liệu đầu ra. Mã để ghi vào đĩa được hiển thị bên dưới. Lược đồ là một phần của siêu dữ liệu nhưng sử dụng hai thứ đó thay thế cho nhau trong API tf.Transform (tức là chuyển siêu dữ liệu đến ExampleProtoCoder ). Hãy lưu ý rằng điều này sẽ ghi sang một định dạng khác. Thay vì textio.WriteToText , hãy sử dụng hỗ trợ tích hợp của Beam cho định dạng TFRecord và sử dụng bộ mã hóa để mã hóa dữ liệu dưới dạng các giao thức Example . Đây là một định dạng tốt hơn để sử dụng cho việc đào tạo, như được hiển thị trong phần tiếp theo. transformed_eval_data_base cung cấp tên tệp cơ sở cho các phân đoạn riêng lẻ được viết.

transformed_data | "WriteTrainData" >> tfrecordio.WriteToTFRecord(
    transformed_eval_data_base,
    coder=tft.coders.ExampleProtoCoder(transformed_metadata))

Ngoài dữ liệu đào tạo, transform_fn cũng được viết ra với siêu dữ liệu:

_ = (
    transform_fn
    | 'WriteTransformFn' >> tft_beam.WriteTransformFn(working_dir))
transformed_metadata | 'WriteMetadata' >> tft_beam.WriteMetadata(
    transformed_metadata_file, pipeline=p)

Chạy toàn bộ đường ống Beam với p.run().wait_until_finish() . Cho đến thời điểm này, đường ống Beam đại diện cho một phép tính phân tán, hoãn lại. Nó cung cấp hướng dẫn cho những gì sẽ được thực hiện, nhưng các hướng dẫn đã không được thực hiện. Lời gọi cuối cùng này thực thi đường dẫn được chỉ định.

Tải xuống bộ dữ liệu điều tra dân số

Tải xuống tập dữ liệu điều tra dân số bằng các lệnh shell sau:

  wget https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
  wget https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test

Khi chạy tập lệnh điều tra dân census_example.py , hãy chuyển thư mục chứa dữ liệu này làm đối số đầu tiên. Tập lệnh tạo một thư mục con tạm thời để thêm dữ liệu được xử lý trước.

Tích hợp với đào tạo TensorFlow

Phần cuối cùng của census_example.py hiển thị cách dữ liệu đã xử lý trước được sử dụng để đào tạo mô hình. Xem tài liệu Công cụ ước tính để biết chi tiết. Bước đầu tiên là xây dựng Estimator yêu cầu mô tả các cột được xử lý trước. Mỗi cột số được mô tả như một real_valued_column là một trình bao bọc xung quanh một vectơ dày đặc có kích thước cố định ( 1 trong ví dụ này). Mỗi cột phân loại được ánh xạ từ chuỗi thành số nguyên và sau đó được chuyển vào indicator_column . tft.TFTransformOutput được sử dụng để tìm đường dẫn tệp từ vựng cho từng tính năng phân loại.

real_valued_columns = [feature_column.real_valued_column(key)
                       for key in NUMERIC_FEATURE_KEYS]

one_hot_columns = [
    tf.feature_column.indicator_column(
        tf.feature_column.categorical_column_with_vocabulary_file(
            key=key,
            vocabulary_file=tf_transform_output.vocabulary_file_by_name(
                vocab_filename=key)))
    for key in CATEGORICAL_FEATURE_KEYS]

estimator = tf.estimator.LinearClassifier(real_valued_columns + one_hot_columns)

Bước tiếp theo là tạo một trình xây dựng để tạo ra hàm đầu vào cho đào tạo và đánh giá. Sự khác biệt với khóa đào tạo được sử dụng bởi tf.Learn vì thông số tính năng không cần thiết để phân tích cú pháp dữ liệu đã chuyển đổi. Thay vào đó, hãy sử dụng siêu dữ liệu cho dữ liệu được chuyển đổi để tạo thông số tính năng.

def _make_training_input_fn(tf_transform_output, transformed_examples,
                            batch_size):
  ...
  def input_fn():
    """Input function for training and eval."""
    dataset = tf.data.experimental.make_batched_features_dataset(
        ..., tf_transform_output.transformed_feature_spec(), ...)

    transformed_features = tf.compat.v1.data.make_one_shot_iterator(
        dataset).get_next()
    ...

  return input_fn

Đoạn mã còn lại giống như sử dụng lớp Estimator . Ví dụ này cũng chứa mã để xuất mô hình ở định dạng SavedModel . Mô hình đã xuất có thể được sử dụng bởi Tensorflow Serving hoặc Cloud ML Engine .