TF Kafes Özel Tahminciler

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

genel bakış

TFL katmanlarını kullanarak keyfi monoton modeller oluşturmak için özel tahmin edicileri kullanabilirsiniz. Bu kılavuz, bu tür tahmin edicileri oluşturmak için gereken adımları özetlemektedir.

Kurmak

TF Kafes paketini yükleme:

pip install tensorflow-lattice

Gerekli paketleri içe aktarma:

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)

UCI Statlog (Kalp) veri setini indirme:

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()

Bu kılavuzda eğitim için kullanılan varsayılan değerlerin ayarlanması:

LEARNING_RATE = 0.1
BATCH_SIZE = 128
NUM_EPOCHS = 1000

Özellik Sütunları

Başka bir TF tahmin için olduğu gibi, veri ihtiyaçları, input_fn ile tipik olarak tahmin geçirilir kullanılarak ayrıştırılmasına 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']),
]

Çünkü kategorik özellikler, yoğun bir özellik sütuna göre sarılmış olması gerekmez Not tfl.laysers.CategoricalCalibration katman kategori indeksleri doğrudan tüketebilir.

input_fn oluşturuluyor

Diğer tahmin edicilerde olduğu gibi, eğitim ve değerlendirme için modele veri beslemek için input_fn'yi kullanabilirsiniz.

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)

model_fn oluşturuluyor

Özel bir tahminci oluşturmanın birkaç yolu vardır. Burada bir inşa edecek model_fn çözümlü girdi tensörlerin bir Keras modeli çağırır. Giriş özelliklerini ayrıştırmak için kullanabilirsiniz tf.feature_column.input_layer , tf.keras.layers.DenseFeatures veya tfl.estimators.transform_features . İkincisini kullanırsanız, kategorik özellikleri yoğun özellik sütunlarıyla sarmanız gerekmeyecek ve sonuçta ortaya çıkan tensörler birleştirilmeyecek, bu da özelliklerin kalibrasyon katmanlarındaki kullanımını kolaylaştıracaktır.

Bir model oluşturmak için TFL katmanlarını veya diğer Keras katmanlarını karıştırıp eşleştirebilirsiniz. Burada TFL katmanlarından kalibre edilmiş bir kafes Keras modeli oluşturuyoruz ve birkaç monotonluk kısıtlaması uyguluyoruz. Daha sonra özel tahmin ediciyi oluşturmak için Keras modelini kullanırız.

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)

Eğitim ve Tahminci

Kullanılması model_fn yarattığımız ve tahmin edicisi eğitebilirsiniz.

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