Công cụ ước tính tùy chỉnh mạng lưới TF

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Tổng quat

Bạn có thể sử dụng công cụ ước tính tùy chỉnh để tạo các mô hình đơn điệu tùy ý bằng cách sử dụng các lớp TFL. Hướng dẫn này phác thảo các bước cần thiết để tạo các công cụ ước tính như vậy.

Thành lập

Cài đặt gói TF Lattice:

pip install tensorflow-lattice

Nhập các gói bắt buộc:

import tensorflow as tf

import logging
import numpy as np
import pandas as pd
import sys
import tensorflow_lattice as tfl
from tensorflow import feature_column as fc

from tensorflow_estimator.python.estimator.canned import optimizers
from tensorflow_estimator.python.estimator.head import binary_class_head
logging.disable(sys.maxsize)

Tải xuống bộ dữ liệu UCI Statlog (Heart):

csv_file = tf.keras.utils.get_file(
    'heart.csv', 'http://storage.googleapis.com/download.tensorflow.org/data/heart.csv')
df = pd.read_csv(csv_file)
target = df.pop('target')
train_size = int(len(df) * 0.8)
train_x = df[:train_size]
train_y = target[:train_size]
test_x = df[train_size:]
test_y = target[train_size:]
df.head()

Đặt các giá trị mặc định được sử dụng để đào tạo trong hướng dẫn này:

LEARNING_RATE = 0.1
BATCH_SIZE = 128
NUM_EPOCHS = 1000

Các cột tính năng

Đối với bất kỳ ước lượng TF khác, nhu cầu dữ liệu được truyền cho các ước lượng, mà thường là thông qua một input_fn và phân tích cú pháp sử dụng FeatureColumns .

# Feature columns.
# - age
# - sex
# - ca        number of major vessels (0-3) colored by flourosopy
# - thal      3 = normal; 6 = fixed defect; 7 = reversable defect
feature_columns = [
    fc.numeric_column('age', default_value=-1),
    fc.categorical_column_with_vocabulary_list('sex', [0, 1]),
    fc.numeric_column('ca'),
    fc.categorical_column_with_vocabulary_list(
        'thal', ['normal', 'fixed', 'reversible']),
]

Lưu ý rằng các đặc tính phân loại không cần phải được bao bọc bởi một cột đối tượng dày đặc, vì tfl.laysers.CategoricalCalibration lớp có thể trực tiếp tiêu thụ chỉ số thể loại.

Tạo input_fn

Đối với bất kỳ công cụ ước tính nào khác, bạn có thể sử dụng input_fn để cung cấp dữ liệu vào mô hình để đào tạo và đánh giá.

train_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(
    x=train_x,
    y=train_y,
    shuffle=True,
    batch_size=BATCH_SIZE,
    num_epochs=NUM_EPOCHS,
    num_threads=1)

test_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(
    x=test_x,
    y=test_y,
    shuffle=False,
    batch_size=BATCH_SIZE,
    num_epochs=1,
    num_threads=1)

Tạo model_fn

Có một số cách để tạo công cụ ước tính tùy chỉnh. Ở đây chúng ta sẽ xây dựng một model_fn mà các cuộc gọi một mô hình Keras trên tensors đầu vào phân tích cú pháp. Để phân tích các tính năng đầu vào, bạn có thể sử dụng tf.feature_column.input_layer , tf.keras.layers.DenseFeatures , hoặc tfl.estimators.transform_features . Nếu bạn sử dụng cái sau, bạn sẽ không cần phải bọc các đối tượng phân loại bằng các cột đặc trưng dày đặc và các bộ căng kết quả sẽ không được nối với nhau, điều này làm cho việc sử dụng các tính năng trong các lớp hiệu chỉnh dễ dàng hơn.

Để xây dựng một mô hình, bạn có thể trộn và kết hợp các lớp TFL hoặc bất kỳ lớp Keras nào khác. Ở đây chúng tôi tạo một mô hình Keras mạng tinh thể đã được hiệu chỉnh từ các lớp TFL và áp đặt một số ràng buộc về tính đơn điệu. Sau đó, chúng tôi sử dụng mô hình Keras để tạo công cụ ước tính tùy chỉnh.

def model_fn(features, labels, mode, config):
  """model_fn for the custom estimator."""
  del config
  input_tensors = tfl.estimators.transform_features(features, feature_columns)
  inputs = {
      key: tf.keras.layers.Input(shape=(1,), name=key) for key in input_tensors
  }

  lattice_sizes = [3, 2, 2, 2]
  lattice_monotonicities = ['increasing', 'none', 'increasing', 'increasing']
  lattice_input = tf.keras.layers.Concatenate(axis=1)([
      tfl.layers.PWLCalibration(
          input_keypoints=np.linspace(10, 100, num=8, dtype=np.float32),
          # The output range of the calibrator should be the input range of
          # the following lattice dimension.
          output_min=0.0,
          output_max=lattice_sizes[0] - 1.0,
          monotonicity='increasing',
      )(inputs['age']),
      tfl.layers.CategoricalCalibration(
          # Number of categories including any missing/default category.
          num_buckets=2,
          output_min=0.0,
          output_max=lattice_sizes[1] - 1.0,
      )(inputs['sex']),
      tfl.layers.PWLCalibration(
          input_keypoints=[0.0, 1.0, 2.0, 3.0],
          output_min=0.0,
          output_max=lattice_sizes[0] - 1.0,
          # You can specify TFL regularizers as tuple
          # ('regularizer name', l1, l2).
          kernel_regularizer=('hessian', 0.0, 1e-4),
          monotonicity='increasing',
      )(inputs['ca']),
      tfl.layers.CategoricalCalibration(
          num_buckets=3,
          output_min=0.0,
          output_max=lattice_sizes[1] - 1.0,
          # Categorical monotonicity can be partial order.
          # (i, j) indicates that we must have output(i) <= output(j).
          # Make sure to set the lattice monotonicity to 'increasing' for this
          # dimension.
          monotonicities=[(0, 1), (0, 2)],
      )(inputs['thal']),
  ])
  output = tfl.layers.Lattice(
      lattice_sizes=lattice_sizes, monotonicities=lattice_monotonicities)(
          lattice_input)

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  model = tf.keras.Model(inputs=inputs, outputs=output)
  logits = model(input_tensors, training=training)

  if training:
    optimizer = optimizers.get_optimizer_instance_v2('Adagrad', LEARNING_RATE)
  else:
    optimizer = None

  head = binary_class_head.BinaryClassHead()
  return head.create_estimator_spec(
      features=features,
      mode=mode,
      labels=labels,
      optimizer=optimizer,
      logits=logits,
      trainable_variables=model.trainable_variables,
      update_ops=model.updates)

Đào tạo và ước tính

Sử dụng model_fn chúng ta có thể tạo và đào tạo lập dự toán.

estimator = tf.estimator.Estimator(model_fn=model_fn)
estimator.train(input_fn=train_input_fn)
results = estimator.evaluate(input_fn=test_input_fn)
print('AUC: {}'.format(results['auc']))
2021-09-30 20:51:11.094402: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
AUC: 0.5946115255355835