عرض على TensorFlow.org | تشغيل في Google Colab | عرض المصدر على جيثب | تحميل دفتر |
ملخص
المقدرات المعلبة هي طرق سريعة وسهلة لتدريب نماذج TFL لحالات الاستخدام النموذجية. يوضح هذا الدليل الخطوات اللازمة لإنشاء مقدر TFL المعلب.
يثبت
تثبيت حزمة TF Lattice:
pip install tensorflow-lattice
استيراد الحزم المطلوبة:
import tensorflow as tf
import copy
import logging
import numpy as np
import pandas as pd
import sys
import tensorflow_lattice as tfl
from tensorflow import feature_column as fc
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.01
BATCH_SIZE = 128
NUM_EPOCHS = 500
PREFITTING_NUM_EPOCHS = 10
أعمدة الميزات
أما بالنسبة للأي TF مقدر الآخرين، الاحتياجات من البيانات لتمريرها إلى مقدر، وهو عادة عن طريق input_fn وتحليل باستخدام FeatureColumns .
# Feature columns.
# - age
# - sex
# - cp chest pain type (4 values)
# - trestbps resting blood pressure
# - chol serum cholestoral in mg/dl
# - fbs fasting blood sugar > 120 mg/dl
# - restecg resting electrocardiographic results (values 0,1,2)
# - thalach maximum heart rate achieved
# - exang exercise induced angina
# - oldpeak ST depression induced by exercise relative to rest
# - slope the slope of the peak exercise ST segment
# - 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('cp'),
fc.numeric_column('trestbps', default_value=-1),
fc.numeric_column('chol'),
fc.categorical_column_with_vocabulary_list('fbs', [0, 1]),
fc.categorical_column_with_vocabulary_list('restecg', [0, 1, 2]),
fc.numeric_column('thalach'),
fc.categorical_column_with_vocabulary_list('exang', [0, 1]),
fc.numeric_column('oldpeak'),
fc.categorical_column_with_vocabulary_list('slope', [0, 1, 2]),
fc.numeric_column('ca'),
fc.categorical_column_with_vocabulary_list(
'thal', ['normal', 'fixed', 'reversible']),
]
تستخدم مقدرات TFL المعلبة نوع عمود الميزة لتحديد نوع طبقة المعايرة المراد استخدامها. ونحن نستخدم tfl.layers.PWLCalibration
طبقة للأعمدة ميزة الرقمية و tfl.layers.CategoricalCalibration
طبقة للأعمدة ميزة الفئوية.
لاحظ أن أعمدة المعالم الفئوية لا يتم التفافها بواسطة عمود ميزة التضمين. يتم تغذيتها مباشرة في المقدّر.
جاري إنشاء input_fn
بالنسبة لأي مقدر آخر ، يمكنك استخدام input_fn لتغذية البيانات إلى النموذج للتدريب والتقييم. يمكن لمقدرات TFL حساب كميات الميزات تلقائيًا واستخدامها كنقاط مفتاح إدخال لطبقة معايرة PWL. للقيام بذلك، فإنها تتطلب اجتياز feature_analysis_input_fn
، الذي يشبه إلى التدريب input_fn ولكن مع عصر واحد أو عينة فرعية من البيانات.
train_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(
x=train_x,
y=train_y,
shuffle=False,
batch_size=BATCH_SIZE,
num_epochs=NUM_EPOCHS,
num_threads=1)
# feature_analysis_input_fn is used to collect statistics about the input.
feature_analysis_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(
x=train_x,
y=train_y,
shuffle=False,
batch_size=BATCH_SIZE,
# Note that we only need one pass over the data.
num_epochs=1,
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)
# Serving input fn is used to create saved models.
serving_input_fn = (
tf.estimator.export.build_parsing_serving_input_receiver_fn(
feature_spec=fc.make_parse_example_spec(feature_columns)))
ميزة Configs
يتم تعيين ميزة معايرة وتكوينات لكل ميزة استخدام tfl.configs.FeatureConfig
. وتشمل تكوينات ميزة القيود الرتابه في الصوت، تنظيم لكل ميزة (انظر tfl.configs.RegularizerConfig
)، والأحجام شعرية لنماذج شعرية.
إذا تم تعريف أي تكوين لميزة الإدخال، التكوين الافتراضي في tfl.config.FeatureConfig
يستخدم.
# Feature configs are used to specify how each feature is calibrated and used.
feature_configs = [
tfl.configs.FeatureConfig(
name='age',
lattice_size=3,
# By default, input keypoints of pwl are quantiles of the feature.
pwl_calibration_num_keypoints=5,
monotonicity='increasing',
pwl_calibration_clip_max=100,
# Per feature regularization.
regularizer_configs=[
tfl.configs.RegularizerConfig(name='calib_wrinkle', l2=0.1),
],
),
tfl.configs.FeatureConfig(
name='cp',
pwl_calibration_num_keypoints=4,
# Keypoints can be uniformly spaced.
pwl_calibration_input_keypoints='uniform',
monotonicity='increasing',
),
tfl.configs.FeatureConfig(
name='chol',
# Explicit input keypoint initialization.
pwl_calibration_input_keypoints=[126.0, 210.0, 247.0, 286.0, 564.0],
monotonicity='increasing',
# Calibration can be forced to span the full output range by clamping.
pwl_calibration_clamp_min=True,
pwl_calibration_clamp_max=True,
# Per feature regularization.
regularizer_configs=[
tfl.configs.RegularizerConfig(name='calib_hessian', l2=1e-4),
],
),
tfl.configs.FeatureConfig(
name='fbs',
# Partial monotonicity: output(0) <= output(1)
monotonicity=[(0, 1)],
),
tfl.configs.FeatureConfig(
name='trestbps',
pwl_calibration_num_keypoints=5,
monotonicity='decreasing',
),
tfl.configs.FeatureConfig(
name='thalach',
pwl_calibration_num_keypoints=5,
monotonicity='decreasing',
),
tfl.configs.FeatureConfig(
name='restecg',
# Partial monotonicity: output(0) <= output(1), output(0) <= output(2)
monotonicity=[(0, 1), (0, 2)],
),
tfl.configs.FeatureConfig(
name='exang',
# Partial monotonicity: output(0) <= output(1)
monotonicity=[(0, 1)],
),
tfl.configs.FeatureConfig(
name='oldpeak',
pwl_calibration_num_keypoints=5,
monotonicity='increasing',
),
tfl.configs.FeatureConfig(
name='slope',
# Partial monotonicity: output(0) <= output(1), output(1) <= output(2)
monotonicity=[(0, 1), (1, 2)],
),
tfl.configs.FeatureConfig(
name='ca',
pwl_calibration_num_keypoints=4,
monotonicity='increasing',
),
tfl.configs.FeatureConfig(
name='thal',
# Partial monotonicity:
# output(normal) <= output(fixed)
# output(normal) <= output(reversible)
monotonicity=[('normal', 'fixed'), ('normal', 'reversible')],
),
]
النموذج الخطي المعاير
لبناء TFL المعلبة مقدر، وبناء تكوين نموذج من tfl.configs
. يتم إنشاء نموذج الخطي معايرة باستخدام tfl.configs.CalibratedLinearConfig
. وهي تطبق معايرة جزئية وخطية فئوية على ميزات الإدخال ، متبوعة بمجموعة خطية ومعايرة اختيارية لمعايرة خطية للإخراج. عند استخدام معايرة الإخراج أو عند تحديد حدود الإخراج ، ستطبق الطبقة الخطية المتوسط المرجح على المدخلات المعايرة.
ينشئ هذا المثال نموذجًا خطيًا معايرًا على الميزات الخمس الأولى. نحن نستخدم tfl.visualization
في رسم بياني نموذج مع المؤامرات تدريج.
# Model config defines the model structure for the estimator.
model_config = tfl.configs.CalibratedLinearConfig(
feature_configs=feature_configs,
use_bias=True,
output_calibration=True,
regularizer_configs=[
# Regularizer for the output calibrator.
tfl.configs.RegularizerConfig(name='output_calib_hessian', l2=1e-4),
])
# A CannedClassifier is constructed from the given model config.
estimator = tfl.estimators.CannedClassifier(
feature_columns=feature_columns[:5],
model_config=model_config,
feature_analysis_input_fn=feature_analysis_input_fn,
optimizer=tf.keras.optimizers.Adam(LEARNING_RATE),
config=tf.estimator.RunConfig(tf_random_seed=42))
estimator.train(input_fn=train_input_fn)
results = estimator.evaluate(input_fn=test_input_fn)
print('Calibrated linear test AUC: {}'.format(results['auc']))
saved_model_path = estimator.export_saved_model(estimator.model_dir,
serving_input_fn)
model_graph = tfl.estimators.get_model_graph(saved_model_path)
tfl.visualization.draw_model_graph(model_graph)
2021-09-30 20:54:06.660239: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected Calibrated linear test AUC: 0.834586501121521
نموذج شعرية معاير
يتم إنشاء نموذج شعرية معايرة باستخدام tfl.configs.CalibratedLatticeConfig
. يطبق النموذج الشبكي المعاير معايرة خطية فئوية ومعايرة فئوية على ميزات الإدخال ، متبوعة بنموذج شبكي ومعايرة اختيارية متعددة الخطوط للخرج.
ينشئ هذا المثال نموذجًا شبكيًا معايرًا على الميزات الخمس الأولى.
# This is calibrated lattice model: Inputs are calibrated, then combined
# non-linearly using a lattice layer.
model_config = tfl.configs.CalibratedLatticeConfig(
feature_configs=feature_configs,
regularizer_configs=[
# Torsion regularizer applied to the lattice to make it more linear.
tfl.configs.RegularizerConfig(name='torsion', l2=1e-4),
# Globally defined calibration regularizer is applied to all features.
tfl.configs.RegularizerConfig(name='calib_hessian', l2=1e-4),
])
# A CannedClassifier is constructed from the given model config.
estimator = tfl.estimators.CannedClassifier(
feature_columns=feature_columns[:5],
model_config=model_config,
feature_analysis_input_fn=feature_analysis_input_fn,
optimizer=tf.keras.optimizers.Adam(LEARNING_RATE),
config=tf.estimator.RunConfig(tf_random_seed=42))
estimator.train(input_fn=train_input_fn)
results = estimator.evaluate(input_fn=test_input_fn)
print('Calibrated lattice test AUC: {}'.format(results['auc']))
saved_model_path = estimator.export_saved_model(estimator.model_dir,
serving_input_fn)
model_graph = tfl.estimators.get_model_graph(saved_model_path)
tfl.visualization.draw_model_graph(model_graph)
Calibrated lattice test AUC: 0.8427318930625916
معايرة فرقة شعرية
عندما يكون عدد الميزات كبيرًا ، يمكنك استخدام نموذج تجميعي ، والذي يُنشئ شبكات متعددة أصغر لمجموعات فرعية من الميزات ويقيس متوسط ناتجها بدلاً من إنشاء شبكة واحدة ضخمة فقط. هي التي شيدت نماذج شعرية فرقة باستخدام tfl.configs.CalibratedLatticeEnsembleConfig
. يطبق نموذج مجموعة الشبكة المُعايرة معايرة خطية وقطعية متعددة التعريف على ميزة الإدخال ، متبوعة بمجموعة من النماذج الشبكية ومعايرة اختيارية لمعايرة خطية للإخراج.
فرقة شعرية عشوائية
يستخدم تكوين النموذج التالي مجموعة فرعية عشوائية من الميزات لكل شبكة شعرية.
# This is random lattice ensemble model with separate calibration:
# model output is the average output of separately calibrated lattices.
model_config = tfl.configs.CalibratedLatticeEnsembleConfig(
feature_configs=feature_configs,
num_lattices=5,
lattice_rank=3)
# A CannedClassifier is constructed from the given model config.
estimator = tfl.estimators.CannedClassifier(
feature_columns=feature_columns,
model_config=model_config,
feature_analysis_input_fn=feature_analysis_input_fn,
optimizer=tf.keras.optimizers.Adam(LEARNING_RATE),
config=tf.estimator.RunConfig(tf_random_seed=42))
estimator.train(input_fn=train_input_fn)
results = estimator.evaluate(input_fn=test_input_fn)
print('Random ensemble test AUC: {}'.format(results['auc']))
saved_model_path = estimator.export_saved_model(estimator.model_dir,
serving_input_fn)
model_graph = tfl.estimators.get_model_graph(saved_model_path)
tfl.visualization.draw_model_graph(model_graph, calibrator_dpi=15)
Random ensemble test AUC: 0.9003759026527405
RTL Layer Random Lattice فرقة
يستخدم التكوين نموذج بعد tfl.layers.RTL
طبقة يستخدم مجموعة فرعية عشوائية من الميزات لكل شعرية. ونلاحظ أن tfl.layers.RTL
يعتمد فقط القيود الرتابه في الصوت ويجب أن يكون نفس حجم شعرية لجميع الميزات وأي تسوية لكل ميزة. علما بأن استخدام tfl.layers.RTL
طبقة يتيح لك مقياس لفرق أكبر بكثير من استخدام منفصلة tfl.layers.Lattice
الحالات.
# Make sure our feature configs have the same lattice size, no per-feature
# regularization, and only monotonicity constraints.
rtl_layer_feature_configs = copy.deepcopy(feature_configs)
for feature_config in rtl_layer_feature_configs:
feature_config.lattice_size = 2
feature_config.unimodality = 'none'
feature_config.reflects_trust_in = None
feature_config.dominates = None
feature_config.regularizer_configs = None
# This is RTL layer ensemble model with separate calibration:
# model output is the average output of separately calibrated lattices.
model_config = tfl.configs.CalibratedLatticeEnsembleConfig(
lattices='rtl_layer',
feature_configs=rtl_layer_feature_configs,
num_lattices=5,
lattice_rank=3)
# A CannedClassifier is constructed from the given model config.
estimator = tfl.estimators.CannedClassifier(
feature_columns=feature_columns,
model_config=model_config,
feature_analysis_input_fn=feature_analysis_input_fn,
optimizer=tf.keras.optimizers.Adam(LEARNING_RATE),
config=tf.estimator.RunConfig(tf_random_seed=42))
estimator.train(input_fn=train_input_fn)
results = estimator.evaluate(input_fn=test_input_fn)
print('Random ensemble test AUC: {}'.format(results['auc']))
saved_model_path = estimator.export_saved_model(estimator.model_dir,
serving_input_fn)
model_graph = tfl.estimators.get_model_graph(saved_model_path)
tfl.visualization.draw_model_graph(model_graph, calibrator_dpi=15)
Random ensemble test AUC: 0.8903509378433228
مجموعة بلورات شعرية
كما يوفر TFL والكشف عن مجريات الأمور خوارزمية ترتيب ميزة تسمى بلورات . بلورات خوارزمية القطارات أول نموذج prefitting أن تقديرات البشرى التفاعلات الميزة. ثم يقوم بترتيب المجموعة النهائية بحيث تكون الميزات ذات التفاعلات غير الخطية في نفس المشابك.
لنماذج البلورات، سوف تحتاج أيضا إلى توفير prefitting_input_fn
التي تستخدم لتدريب نموذج prefitting، كما هو موضح أعلاه. لا يحتاج نموذج التهيئة إلى التدريب الكامل ، لذا يجب أن تكون بعض العهود كافية.
prefitting_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(
x=train_x,
y=train_y,
shuffle=False,
batch_size=BATCH_SIZE,
num_epochs=PREFITTING_NUM_EPOCHS,
num_threads=1)
ثم يمكنك إنشاء نموذج كريستال من خلال وضع lattice='crystals'
في التكوين نموذج.
# This is Crystals ensemble model with separate calibration: model output is
# the average output of separately calibrated lattices.
model_config = tfl.configs.CalibratedLatticeEnsembleConfig(
feature_configs=feature_configs,
lattices='crystals',
num_lattices=5,
lattice_rank=3)
# A CannedClassifier is constructed from the given model config.
estimator = tfl.estimators.CannedClassifier(
feature_columns=feature_columns,
model_config=model_config,
feature_analysis_input_fn=feature_analysis_input_fn,
# prefitting_input_fn is required to train the prefitting model.
prefitting_input_fn=prefitting_input_fn,
optimizer=tf.keras.optimizers.Adam(LEARNING_RATE),
prefitting_optimizer=tf.keras.optimizers.Adam(LEARNING_RATE),
config=tf.estimator.RunConfig(tf_random_seed=42))
estimator.train(input_fn=train_input_fn)
results = estimator.evaluate(input_fn=test_input_fn)
print('Crystals ensemble test AUC: {}'.format(results['auc']))
saved_model_path = estimator.export_saved_model(estimator.model_dir,
serving_input_fn)
model_graph = tfl.estimators.get_model_graph(saved_model_path)
tfl.visualization.draw_model_graph(model_graph, calibrator_dpi=15)
Crystals ensemble test AUC: 0.8840851783752441
يمكنك رسم معايرة الميزة مع مزيد من التفاصيل باستخدام tfl.visualization
حدة.
_ = tfl.visualization.plot_feature_calibrator(model_graph, "age")
_ = tfl.visualization.plot_feature_calibrator(model_graph, "restecg")