Merken Sie den Termin vor! Google I / O kehrt vom 18. bis 20. Mai zurück Registrieren Sie sich jetzt
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Benutzerdefinierte TF-Gitterschätzer

Ansicht auf TensorFlow.org In Google Colab ausführen Quelle auf GitHub anzeigen Notizbuch herunterladen

Überblick

Sie können benutzerdefinierte Schätzer verwenden, um mithilfe von TFL-Ebenen beliebig monotone Modelle zu erstellen. In diesem Handbuch werden die Schritte beschrieben, die zum Erstellen solcher Schätzer erforderlich sind.

Einrichten

Installieren des TF-Gitterpakets:

pip install -q tensorflow-lattice

Erforderliche Pakete importieren:

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)

Herunterladen des UCI Statlog (Heart) -Datensatzes:

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

Festlegen der Standardwerte für das Training in diesem Handbuch:

LEARNING_RATE = 0.1
BATCH_SIZE = 128
NUM_EPOCHS = 1000

Feature-Spalten

Wie bei jedem anderen TF-Schätzer müssen Daten an den Schätzer übergeben werden . Dies erfolgt normalerweise über ein input_fn und wird mithilfe von FeatureColumns analysiert.

# 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']),
]

Beachten Sie, dass kategoriale Features nicht von einer dichten Feature-Spalte tfl.laysers.CategoricalCalibration werden müssen, da der Layer tfl.laysers.CategoricalCalibration Kategorieindizes direkt verwenden kann.

Input_fn erstellen

Wie bei jedem anderen Schätzer können Sie input_fn verwenden, um dem Modell Daten für Training und Auswertung zuzuführen.

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)

Modell_fn erstellen

Es gibt verschiedene Möglichkeiten, einen benutzerdefinierten Schätzer zu erstellen. Hier konstruieren wir ein model_fn , das ein Keras-Modell für die analysierten Eingangstensoren aufruft. Um die Eingabefunktionen zu analysieren, können Sie tf.feature_column.input_layer , tf.keras.layers.DenseFeatures oder tfl.estimators.transform_features . Wenn Sie Letzteres verwenden, müssen Sie kategoriale Features nicht mit dichten Feature-Spalten umschließen, und die resultierenden Tensoren werden nicht verkettet, was die Verwendung der Features in den Kalibrierungsebenen erleichtert.

Um ein Modell zu erstellen, können Sie TFL-Ebenen oder andere Keras-Ebenen mischen und anpassen. Hier erstellen wir ein kalibriertes Gitter-Keras-Modell aus TFL-Schichten und legen verschiedene Monotonie-Einschränkungen fest. Anschließend verwenden wir das Keras-Modell, um den benutzerdefinierten Schätzer zu erstellen.

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)

Schulung und Schätzer

Mit model_fn wir den Schätzer erstellen und trainieren.

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']))
AUC: 0.6416040062904358