[ad_1]
Tiền xử lý dữ liệu là một trong những bước chính trong bất kỳ quy trình Machine Studying nào. Tensorflow Remodel giúp chúng ta thực hiện điều này trong môi trường phân tán trên một tập dữ liệu khổng lồ.
Trước khi đi sâu hơn vào Chuyển đổi dữ liệu, Xác thực dữ liệu là bước đầu tiên của quy trình sản xuất, đã được đề cập trong bài viết của tôi Xác thực dữ liệu trong quy trình sản xuất: Cách của TFX. Hãy xem bài viết này để hiểu rõ hơn về bài viết này.
Tôi đã sử dụng Colab cho bản demo này vì nó dễ hơn nhiều (và nhanh hơn) để cấu hình môi trường. Nếu bạn đang trong giai đoạn khám phá, tôi cũng khuyên bạn nên sử dụng Colab vì nó sẽ giúp bạn tập trung vào những thứ quan trọng hơn.
Hoạt động của ML Pipeline bắt đầu bằng việc thu thập và xác thực dữ liệu, sau đó là chuyển đổi. Dữ liệu đã chuyển đổi được đào tạo và triển khai. Tôi đã đề cập đến phần xác thực trong phần trước của mình bài báovà bây giờ chúng ta sẽ đề cập đến phần chuyển đổi. Để hiểu rõ hơn về pipeline trong Tensorflow, hãy xem bài viết bên dưới.
Như đã thiết lập trước đó, chúng ta sẽ sử dụng Colab. Vì vậy, chúng ta chỉ cần cài đặt thư viện tfx và chúng ta có thể bắt đầu.
! pip set up tfx
Sau khi cài đặt, hãy khởi động lại phiên để tiếp tục.
Tiếp theo là hàng nhập khẩu.
# Importing Librariesimport tensorflow as tf
from tfx.elements import CsvExampleGen
from tfx.elements import ExampleValidator
from tfx.elements import SchemaGen
from tfx.v1.elements import ImportSchemaGen
from tfx.elements import StatisticsGen
from tfx.elements import Remodel
from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
from google.protobuf.json_format import MessageToDict
import os
Chúng tôi sẽ sử dụng bộ dữ liệu tàu vũ trụ titanic từ Kaggle, như trong bài viết xác thực dữ liệu. Bộ dữ liệu này được sử dụng miễn phí cho mục đích thương mại và phi thương mại. Bạn có thể truy cập từ đây. Mô tả về tập dữ liệu được hiển thị ở hình bên dưới.
Để bắt đầu với phần chuyển đổi dữ liệu, bạn nên tạo các thư mục nơi các thành phần đường ống sẽ được đặt (nếu không, chúng sẽ được đặt trong thư mục mặc định). Tôi đã tạo hai thư mục, một cho các thành phần đường ống và một cho dữ liệu đào tạo của chúng tôi.
# Path to pipeline folder
# All of the generated elements will likely be saved right here_pipeline_root = '/content material/tfx/pipeline/'
# Path to coaching knowledge
# It could actually even comprise a number of coaching knowledge recordsdata
_data_root = '/content material/tfx/knowledge/'
Tiếp theo, chúng ta tạo InteractiveContext và truyền đường dẫn đến thư mục pipeline. Quá trình này cũng tạo một cơ sở dữ liệu sqlite để lưu trữ siêu dữ liệu của quy trình pipeline.
InteractiveContext có mục đích khám phá từng giai đoạn của quy trình. Tại mỗi thời điểm, chúng ta có thể xem các hiện vật được tạo ra. Khi ở trong môi trường sản xuất, lý tưởng nhất là chúng ta sẽ sử dụng một khuôn khổ tạo đường ống như Apache Beam, nơi toàn bộ quy trình này sẽ được thực hiện tự động, không cần can thiệp.
# Initializing the InteractiveContext
# It will create an sqlite db for storing the metadatacontext = InteractiveContext(pipeline_root=_pipeline_root)
Tiếp theo, chúng ta bắt đầu với việc thu thập dữ liệu. Nếu dữ liệu của bạn được lưu trữ dưới dạng tệp csv, chúng ta có thể sử dụng CsvExampleGen và truyền đường dẫn đến thư mục lưu trữ tệp dữ liệu.
Đảm bảo thư mục chỉ chứa dữ liệu đào tạo và không có gì khác. Nếu dữ liệu đào tạo của bạn được chia thành nhiều tệp, hãy đảm bảo chúng có cùng tiêu đề.
# Enter CSV recordsdata
example_gen = CsvExampleGen(input_base=_data_root)
TFX hiện hỗ trợ csv, tf.File, BigQuery và một số trình thực thi tùy chỉnh. Tìm hiểu thêm về nó trong liên kết bên dưới.
Để thực thi thành phần ExampleGen, hãy sử dụng context.run.
# Execute the elementcontext.run(example_gen)
Sau khi chạy thành phần, đây sẽ là đầu ra của chúng ta. Nó cung cấp execution_id, thông tin chi tiết về thành phần và nơi lưu đầu ra của thành phần.
Khi mở rộng, chúng ta có thể thấy được những chi tiết này.
Cấu trúc thư mục trông giống như hình ảnh bên dưới. Tất cả các hiện vật này đã được TFX tạo cho chúng tôi. Chúng cũng được tự động tạo phiên bản và các chi tiết được lưu trữ trong metadata.sqlite. Tệp sqlite giúp duy trì nguồn gốc dữ liệu hoặc dòng dõi dữ liệu.
Để khám phá các hiện vật này theo chương trình, hãy sử dụng mã bên dưới.
# View the generated artifacts
artifact = example_gen.outputs('examples').get()(0)# Show break up names and uri
print(f'break up names: {artifact.split_names}')
print(f'artifact uri: {artifact.uri}')
Đầu ra sẽ là tên của các tập tin và uri.
Chúng ta hãy sao chép uri tàu và xem chi tiết bên trong tệp. Tệp được lưu trữ dưới dạng tệp zip và được lưu trữ ở định dạng TFRecordDataset.
# Get the URI of the output artifact representing the coaching examples
train_uri = os.path.be a part of(artifact.uri, 'Break up-train')# Get the listing of recordsdata on this listing (all compressed TFRecord recordsdata)
tfrecord_filenames = (os.path.be a part of(train_uri, title)
for title in os.listdir(train_uri))
# Create a `TFRecordDataset` to learn these recordsdata
dataset = tf.knowledge.TFRecordDataset(tfrecord_filenames, compression_type="GZIP")
Đoạn mã bên dưới được lấy từ Tensorflow, đây là đoạn mã chuẩn có thể được sử dụng để lấy bản ghi từ TFRecordDataset và trả về kết quả để chúng ta kiểm tra.
# Helper operate to get particular person examples
def get_records(dataset, num_records):
'''Extracts data from the given dataset.
Args:
dataset (TFRecordDataset): dataset saved by ExampleGen
num_records (int): variety of data to preview
'''# initialize an empty listing
data = ()
# Use the `take()` methodology to specify what number of data to get
for tfrecord in dataset.take(num_records):
# Get the numpy property of the tensor
serialized_example = tfrecord.numpy()
# Initialize a `tf.prepare.Instance()` to learn the serialized knowledge
instance = tf.prepare.Instance()
# Learn the instance knowledge (output is a protocol buffer message)
instance.ParseFromString(serialized_example)
# convert the protocol bufffer message to a Python dictionary
example_dict = (MessageToDict(instance))
# append to the data listing
data.append(example_dict)
return data
# Get 3 data from the dataset
sample_records = get_records(dataset, 3)# Print the output
pp.pprint(sample_records)
Chúng tôi đã yêu cầu 3 bản ghi và kết quả trông như thế này. Mỗi bản ghi và siêu dữ liệu của nó được lưu trữ ở định dạng từ điển.
Tiếp theo, chúng ta chuyển sang quy trình tiếp theo, đó là tạo số liệu thống kê cho dữ liệu bằng StatisticsGen. Chúng ta truyền đầu ra từ đối tượng example_gen làm đối số.
Chúng tôi thực thi thành phần bằng cách sử dụng statistics.run, với statistics_gen làm đối số.
# Generate dataset statistics with StatisticsGen utilizing the example_gen objectstatistics_gen = StatisticsGen(
examples=example_gen.outputs('examples'))
# Execute the element
context.run(statistics_gen)
Chúng ta có thể sử dụng context.present để xem kết quả.
# Present the output statisticscontext.present(statistics_gen.outputs('statistics'))
Bạn có thể thấy rằng nó rất giống với thế hệ thống kê mà chúng ta đã thảo luận trong bài viết TFDV. Lý do là, TFX sử dụng TFDV để thực hiện các hoạt động này. Làm quen với TFDV sẽ giúp hiểu rõ hơn các quy trình này.
Bước tiếp theo là tạo lược đồ. Điều này được thực hiện bằng cách sử dụng SchemaGen bằng cách truyền đối tượng statistics_gen. Chạy thành phần và trực quan hóa nó bằng context.present.
# Generate schema utilizing SchemaGen with the statistics_gen objectschema_gen = SchemaGen(
statistics=statistics_gen.outputs('statistics'),
)
# Run the element
context.run(schema_gen)
# Visualize the schema
context.present(schema_gen.outputs('schema'))
Đầu ra hiển thị thông tin chi tiết về lược đồ cơ bản của dữ liệu. Một lần nữa, giống như trong TFDV.
Nếu bạn cần thực hiện sửa đổi cho lược đồ được trình bày ở đây, hãy thực hiện bằng tfdv và tạo tệp lược đồ. Bạn có thể truyền nó bằng ImportSchemaGen và yêu cầu tfx sử dụng tệp mới.
# Including a schema file manually
schema_gen = ImportSchemaGen(schema_file="path_to_schema_file/schema.pbtxt")
Tiếp theo, chúng tôi xác thực các ví dụ bằng ExampleValidator. Chúng tôi truyền statistics_gen và schema_gen làm đối số.
# Validate the examples utilizing the ExampleValidator
# Cross statistics_gen and schema_gen objectsexample_validator = ExampleValidator(
statistics=statistics_gen.outputs('statistics'),
schema=schema_gen.outputs('schema'))
# Run the element.
context.run(example_validator)
Đây sẽ là kết quả lý tưởng để chứng minh rằng mọi việc đều ổn.
Tại thời điểm này, cấu trúc thư mục của chúng ta trông giống như hình ảnh bên dưới. Chúng ta có thể thấy rằng đối với mỗi bước trong quy trình, các hiện vật tương ứng được tạo ra.
Chúng ta hãy chuyển sang phần chuyển đổi thực tế. Bây giờ chúng ta sẽ tạo tệp constants.py để thêm tất cả các hằng số cần thiết cho quy trình.
# Creating the file containing all constants which can be for use for this undertaking_constants_module_file = 'constants.py'
Chúng ta sẽ tạo tất cả các hằng số và ghi chúng vào tệp constants.py. Xem “%%writefile {_constants_module_file}”, lệnh này không cho phép mã chạy, thay vào đó, nó ghi tất cả mã trong ô đã cho vào tệp đã chỉ định.
%%writefile {_constants_module_file}# Options with string knowledge varieties that will likely be transformed to indices
CATEGORICAL_FEATURE_KEYS = ( 'CryoSleep','Vacation spot','HomePlanet','VIP')
# Numerical options which can be marked as steady
NUMERIC_FEATURE_KEYS = ('Age','FoodCourt','RoomService', 'ShoppingMall','Spa','VRDeck')
# Characteristic that may be grouped into buckets
BUCKET_FEATURE_KEYS = ('Age')
# Variety of buckets utilized by tf.remodel for encoding every bucket function.
FEATURE_BUCKET_COUNT = {'Age': 4}
# Characteristic that the mannequin will predict
LABEL_KEY = 'Transported'
# Utility operate for renaming the function
def transformed_name(key):
return key + '_xf'
Chúng ta hãy tạo tệp remodel.py, tệp này sẽ chứa mã thực tế để chuyển đổi dữ liệu.
# Making a file that comprises all preprocessing code for the undertaking_transform_module_file = 'remodel.py'
Ở đây, chúng ta sẽ sử dụng thư viện tensorflow_transform. Mã cho quá trình chuyển đổi sẽ được viết dưới hàm preprocessing_fn. Bắt buộc chúng ta phải sử dụng cùng tên, vì tfx sẽ tìm kiếm nội bộ trong quá trình chuyển đổi.
%%writefile {_transform_module_file}import tensorflow as tf
import tensorflow_transform as tft
import constants
# Unpack the contents of the constants module
_NUMERIC_FEATURE_KEYS = constants.NUMERIC_FEATURE_KEYS
_CATEGORICAL_FEATURE_KEYS = constants.CATEGORICAL_FEATURE_KEYS
_BUCKET_FEATURE_KEYS = constants.BUCKET_FEATURE_KEYS
_FEATURE_BUCKET_COUNT = constants.FEATURE_BUCKET_COUNT
_LABEL_KEY = constants.LABEL_KEY
_transformed_name = constants.transformed_name
# Outline the transformations
def preprocessing_fn(inputs):
outputs = {}
# Scale these options to the vary (0,1)
for key in _NUMERIC_FEATURE_KEYS:
outputs(_transformed_name(key)) = tft.scale_to_0_1(
inputs(key))
# Bucketize these options
for key in _BUCKET_FEATURE_KEYS:
outputs(_transformed_name(key)) = tft.bucketize(
inputs(key), _FEATURE_BUCKET_COUNT(key))
# Convert strings to indices in a vocabulary
for key in _CATEGORICAL_FEATURE_KEYS:
outputs(_transformed_name(key)) = tft.compute_and_apply_vocabulary(inputs(key))
# Convert the label strings to an index
outputs(_transformed_name(_LABEL_KEY)) = tft.compute_and_apply_vocabulary(inputs(_LABEL_KEY))
return outputs
Chúng tôi đã sử dụng một số hàm mã hóa và tỷ lệ chuẩn cho bản demo này. Thư viện chuyển đổi thực sự lưu trữ rất nhiều hàm. Khám phá chúng tại đây.
Bây giờ là lúc xem quá trình chuyển đổi đang diễn ra. Chúng ta tạo một đối tượng Remodel và truyền các đối tượng example_gen và schema_gen cùng với đường dẫn đến remodel.py mà chúng ta đã tạo.
# Ignore TF warning messages
tf.get_logger().setLevel('ERROR')# Instantiate the Remodel element with example_gen and schema_gen objects
# Cross the trail for remodel file
remodel = Remodel(
examples=example_gen.outputs('examples'),
schema=schema_gen.outputs('schema'),
module_file=os.path.abspath(_transform_module_file))
# Run the element
context.run(remodel)
Chạy nó và quá trình chuyển đổi sẽ hoàn tất!
Hãy xem dữ liệu đã chuyển đổi được hiển thị ở hình ảnh bên dưới.
Đây là câu hỏi của bạn phải không?
Quy trình này không dành cho cá nhân muốn xử lý trước dữ liệu và bắt đầu đào tạo mô hình. Quy trình này dành cho lượng dữ liệu lớn (dữ liệu yêu cầu xử lý phân tán) và đường ống sản xuất tự động không thể bị hỏng.
Sau khi áp dụng chuyển đổi, cấu trúc thư mục của bạn trông như thế này
Nó chứa thông tin chi tiết trước và sau khi biến đổi. Ngoài ra, một biểu đồ biến đổi cũng được tạo ra.
Hãy nhớ rằng, chúng tôi đã chia tỷ lệ các tính năng số của mình bằng tft.scale_to_0_1. Các hàm như thế này yêu cầu các chi tiết tính toán cần phân tích toàn bộ dữ liệu (như giá trị trung bình, giá trị tối thiểu và giá trị tối đa trong một tính năng). Phân tích dữ liệu được phân phối trên nhiều máy để có được các chi tiết này đòi hỏi hiệu suất cao (đặc biệt nếu thực hiện nhiều lần). Các chi tiết như vậy được tính toán một lần và duy trì trong transform_graph. Bất kỳ khi nào một hàm cần chúng, nó sẽ được lấy trực tiếp từ transform_graph. Nó cũng hỗ trợ áp dụng các phép biến đổi được tạo trong giai đoạn đào tạo trực tiếp vào dữ liệu phục vụ, đảm bảo tính nhất quán trong giai đoạn tiền xử lý.
Một lợi thế lớn khác khi sử dụng thư viện Tensorflow Remodel là mọi giai đoạn đều được ghi lại dưới dạng hiện vật, do đó, dòng dõi dữ liệu được duy trì. Phiên bản dữ liệu cũng được thực hiện tự động khi dữ liệu thay đổi. Do đó, nó giúp thử nghiệm, triển khai và khôi phục dễ dàng trong môi trường sản xuất.
Vậy là xong. Nếu bạn có bất kỳ câu hỏi nào, vui lòng ghi vào phần bình luận.
Bạn có thể tải xuống sổ ghi chép và các tệp dữ liệu được sử dụng trong bài viết này từ kho lưu trữ GitHub của tôi bằng cách sử dụng liên kết
[ad_2]
Source link