مقدرات TF شعرية مخصصة

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

ملخص

يمكنك استخدام المقدرات المخصصة لإنشاء نماذج عشوائية رتيبة باستخدام طبقات 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 على التنسورات إدخال تحليل. تحليل ملامح المدخلات، ويمكنك استخدام 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