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