سوالی دارید؟ در انجمن بازدید از انجمن TensorFlow با انجمن ارتباط برقرار کنید

برآوردگرهای سفارشی مشبک TF

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

برای ایجاد مدلهای یکنواخت دلخواه با استفاده از لایه های TFL می توانید از برآوردگرهای سفارشی استفاده کنید. این راهنما مراحل لازم برای ایجاد چنین برآوردگرهایی را به طور خلاصه بیان می کند.

برپایی

نصب بسته TF Lattice:

pip install -q tensorflow-lattice

وارد کردن بسته های مورد نیاز:

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 (قلب):

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

تنظیم مقادیر پیش فرض مورد استفاده برای آموزش در این راهنما:

LEARNING_RATE = 0.1
BATCH_SIZE = 128
NUM_EPOCHS = 1000

ستون های ویژه

همانطور که برای هر برآوردگر TF دیگر ، داده ها باید به برآوردگر منتقل شوند ، که معمولاً از طریق input_fn و با استفاده از 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']),
]

توجه داشته باشید که نیازی نیست که ویژگیهای طبقه بندی شده توسط ستون ویژگی متراکم بسته بندی شوند ، زیرا لایه tfl.laysers.CategoricalCalibration مستقیماً می تواند شاخصهای دسته را مصرف کند.

ایجاد input_fn

همانطور که برای هر برآوردگر دیگر ، می توانید از input_fn برای تغذیه داده ها به مدل برای آموزش و ارزیابی استفاده کنید.

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

روش های مختلفی برای ایجاد برآوردگر سفارشی وجود دارد. در اینجا ما یک model_fn خواهیم ساخت که یک مدل Keras را روی model_fn ورودی تجزیه شده فراخوانی می کند. برای تجزیه ویژگی های ورودی ، می توانید از tf.feature_column.input_layer ، tf.keras.layers.DenseFeatures یا tfl.estimators.transform_features . اگر از مورد دوم استفاده کنید ، نیازی به پیچیدن ویژگی های طبقه بندی شده با ستون های متراکم نیست ، و تنورهای حاصل به هم متصل نخواهند شد ، که استفاده از ویژگی های موجود در لایه های کالیبراسیون را آسان می کند.

برای ساخت یک مدل ، می توانید لایه های TFL یا سایر لایه های Keras را مخلوط و مطابقت دهید. در اینجا ما یک مدل شبکه ای مدرج Keras از لایه های TFL ایجاد می کنیم و چندین محدودیت یکنواختی را اعمال می کنیم. سپس از مدل Keras برای ایجاد برآوردگر سفارشی استفاده می کنیم.

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)

آموزش و برآوردگر

با استفاده از model_fn می توان برآوردگر را ایجاد و آموزش داد.

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