Genel
Bir EvalSavedModel hala gerekli mi?
Önceden TFMA, tüm ölçümlerin özel bir EvalSavedModel
kullanılarak bir tensorflow grafiği içinde saklanmasını gerektiriyordu. Artık metrikler, beam.CombineFn
uygulamaları kullanılarak TF grafiğinin dışında hesaplanabilir.
Ana farklılıklardan bazıları şunlardır:
- Bir
EvalSavedModel
, eğiticiden özel bir dışa aktarma gerektirirken, hizmet veren bir model, eğitim kodunda herhangi bir değişiklik gerekmeden kullanılabilir. - Bir
EvalSavedModel
kullanıldığında, eğitim zamanında eklenen tüm metrikler, değerlendirme zamanında otomatik olarak kullanılabilir.EvalSavedModel
olmadan bu metriklerin yeniden eklenmesi gerekir.- Bu kuralın istisnası, eğer bir keras modeli kullanılıyorsa, keras metrik bilgilerini kaydedilen modelin yanında kaydettiği için metrikler otomatik olarak da eklenebilir.
TFMA hem grafik içi metriklerle hem de dış metriklerle çalışabilir mi?
TFMA, bazı metriklerin grafik içinde, diğerlerinin ise dışarıda hesaplanabileceği durumlarda hibrit bir yaklaşımın kullanılmasına izin verir. Halihazırda bir EvalSavedModel
varsa, onu kullanmaya devam edebilirsiniz.
İki durum vardır:
- Hem özellik çıkarma hem de metrik hesaplamaları için TFMA
EvalSavedModel
kullanın, ayrıca birleştirici tabanlı ek metrikler ekleyin. Bu durumda,EvalSavedModel
tüm grafik içi metrikleri ve birleştirici tabanlı daha önce desteklenmemiş olabilecek ek metrikleri alırsınız. - Özellik/tahmin çıkarımı için TFMA
EvalSavedModel
kullanın, ancak tüm ölçüm hesaplamaları için birleştirici tabanlı ölçümleri kullanın. Bu mod,EvalSavedModel
dilimleme için kullanmak istediğiniz ancak tüm metrik hesaplamaları grafiğin dışında gerçekleştirmeyi tercih ettiğiniz özellik dönüşümleri varsa kullanışlıdır.
Kurmak
Hangi model türleri desteklenir?
TFMA, keras modellerini, genel TF2 imza API'lerini temel alan modelleri ve ayrıca TF tahmincisi tabanlı modelleri destekler (her ne kadar kullanım durumuna bağlı olarak tahmin ediciye dayalı modeller, bir EvalSavedModel
kullanılmasını gerektirebilir).
Desteklenen model türlerinin tam listesi ve kısıtlamalar için get_started kılavuzuna bakın.
TFMA'yı yerel keras tabanlı bir modelle çalışacak şekilde nasıl kurarım?
Aşağıda, aşağıdaki varsayımlara dayalı bir keras modeli için örnek bir yapılandırma verilmiştir:
- Kaydedilen model hizmet içindir ve
serving_default
imza adını kullanır (bu,model_specs[0].signature_name
kullanılarak değiştirilebilir). -
model.compile(...)
yerleşik metrikler değerlendirilmelidir (bu, tfma.EvalConfig içindekioptions.include_default_metric
aracılığıyla devre dışı bırakılabilir).
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here. For example:
# metrics { class_name: "ConfusionMatrixPlot" }
# metrics { class_name: "CalibrationPlot" }
}
slicing_specs {}
""", tfma.EvalConfig())
Yapılandırılabilen diğer metrik türleri hakkında daha fazla bilgi için metriklere bakın.
TFMA'yı genel bir TF2 imza tabanlı modelle çalışacak şekilde nasıl kurarım?
Aşağıdaki, genel bir TF2 modeli için örnek bir yapılandırmadır. Aşağıda, imza_adı, değerlendirme için kullanılması gereken özel signature_name
adıdır.
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
signature_name: "<signature-name>"
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here. For example:
# metrics { class_name: "BinaryCrossentropy" }
# metrics { class_name: "ConfusionMatrixPlot" }
# metrics { class_name: "CalibrationPlot" }
}
slicing_specs {}
""", tfma.EvalConfig())
Yapılandırılabilen diğer metrik türleri hakkında daha fazla bilgi için metriklere bakın.
TFMA'yı tahmin edici tabanlı bir modelle çalışacak şekilde nasıl kurarım?
Bu durumda üç seçenek vardır.
Seçenek1: Sunum Modelini Kullan
Bu seçenek kullanılırsa, eğitim sırasında eklenen hiçbir metrik değerlendirmeye dahil EDİLMEZ.
Aşağıdaki, kullanılan imza adının serving_default
olduğunu varsayan örnek bir yapılandırmadır:
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
""", tfma.EvalConfig())
Yapılandırılabilen diğer metrik türleri hakkında daha fazla bilgi için metriklere bakın.
Seçenek2: EvalSavedModel'i ek birleştirici tabanlı ölçümlerle birlikte kullanın
Bu durumda, hem özellik / tahmin çıkarma hem de değerlendirme için EvalSavedModel
kullanın ve ayrıca birleştirici tabanlı metrikler ekleyin.
Aşağıdaki örnek bir yapılandırmadır:
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
signature_name: "eval"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
""", tfma.EvalConfig())
Yapılandırılabilen diğer metrik türleri hakkında daha fazla bilgi için metriklere ve EvalSavedModel'i ayarlama hakkında daha fazla bilgi için EvalSavedModel'e bakın.
Seçenek3: EvalSavedModel Modelini yalnızca Özellik/Tahmin Çıkarma için kullanın
Seçenek (2)'ye benzer, ancak özellik/tahmin çıkarımı için yalnızca EvalSavedModel
kullanın. Bu seçenek, yalnızca dış metrikler isteniyorsa yararlıdır, ancak dilimlemek istediğiniz özellik dönüşümleri vardır. Seçenek (1)'e benzer şekilde, eğitim sırasında eklenen hiçbir metrik değerlendirmeye dahil EDİLMEZ.
Bu durumda yapılandırma yukarıdakiyle aynıdır, yalnızca include_default_metrics
devre dışı bırakılır.
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
signature_name: "eval"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
options {
include_default_metrics { value: false }
}
""", tfma.EvalConfig())
Yapılandırılabilen diğer metrik türleri hakkında daha fazla bilgi için metriklere ve EvalSavedModel'i ayarlama hakkında daha fazla bilgi için EvalSavedModel'e bakın.
TFMA'yı keras modelden tahmin ediciye dayalı bir modelle çalışacak şekilde nasıl kurarım?
Keras model_to_estimator
kurulumu, tahmin edici yapılandırmasına benzer. Ancak, modelden tahmin ediciye nasıl çalıştığına özgü birkaç farklılık vardır. Özellikle, modelden esimtator'a çıktılarını, dict anahtarının ilişkili keras modelindeki son çıktı katmanının adı olduğu bir dict biçiminde döndürür (herhangi bir ad sağlanmadıysa, keras sizin için varsayılan bir ad seçecektir). dense_1
veya output_1
gibi). Bir TFMA perspektifinden, bu davranış, modelden tahmin ediciye yalnızca tek bir model için olsa bile, çok çıktılı bir model için çıktının ne olacağına benzer. Bu farkı hesaba katmak için çıktı adını ayarlamak için ek bir adım gereklidir. Ancak, tahmin edici olarak aynı üç seçenek geçerlidir.
Tahminci tabanlı bir yapılandırma için gereken değişikliklerin bir örneği aşağıdadır:
from google.protobuf import text_format
config = text_format.Parse("""
... as for estimator ...
metrics_specs {
output_names: ["<keras-output-layer>"]
# Add metrics here.
}
... as for estimator ...
""", tfma.EvalConfig())
TFMA'yı önceden hesaplanmış (yani modelden bağımsız) tahminlerle çalışacak şekilde nasıl ayarlarım? ( TFRecord
ve tf.Example
)
TFMA'yı önceden hesaplanmış tahminlerle çalışacak şekilde yapılandırmak için, varsayılan tfma.PredictExtractor
devre dışı bırakılmalı ve tfma.InputExtractor
, diğer giriş özellikleriyle birlikte tahminleri ayrıştıracak şekilde yapılandırılmalıdır. Bu, etiketler ve ağırlıkların yanı sıra tahminler için kullanılan özellik anahtarının adıyla bir tfma.ModelSpec
yapılandırılarak gerçekleştirilir.
Aşağıdaki örnek bir kurulumdur:
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
prediction_key: "<prediction-key>"
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
""", tfma.EvalConfig())
Yapılandırılabilen metrikler hakkında daha fazla bilgi için metriklere bakın.
Bir tfma.ModelSpec
yapılandırılmasına rağmen, bir modelin gerçekte kullanılmadığına dikkat edin (yani tfma.EvalSharedModel
yok). Model analizini çalıştırma çağrısı aşağıdaki gibi görünebilir:
eval_result = tfma.run_model_analysis(
eval_config=eval_config,
# This assumes your data is a TFRecords file containing records in the
# tf.train.Example format.
data_location="/path/to/file/containing/tfrecords",
output_path="/path/for/metrics_for_slice_proto")
TFMA'yı önceden hesaplanmış (yani modelden bağımsız) tahminlerle çalışacak şekilde nasıl ayarlarım? ( pd.DataFrame
)
Belleğe sığabilecek küçük veri kümeleri için TFRecord
alternatif bir pandas.DataFrame
s'dir. TFMA, tfma.analyze_raw_data
API'sini kullanarak pandas.DataFrame
s üzerinde çalışabilir. tfma.MetricsSpec
ve tfma.SlicingSpec
açıklaması için kurulum kılavuzuna bakın. Yapılandırılabilen metrikler hakkında daha fazla bilgi için metriklere bakın.
Aşağıdaki örnek bir kurulumdur:
# Run in a Jupyter Notebook.
df_data = ... # your pd.DataFrame
eval_config = text_format.Parse("""
model_specs {
label_key: 'label'
prediction_key: 'prediction'
}
metrics_specs {
metrics { class_name: "AUC" }
metrics { class_name: "ConfusionMatrixPlot" }
}
slicing_specs {}
slicing_specs {
feature_keys: 'language'
}
""", config.EvalConfig())
eval_result = tfma.analyze_raw_data(df_data, eval_config)
tfma.view.render_slicing_metrics(eval_result)
Metrikler
Ne tür metrikler desteklenir?
TFMA, aşağıdakiler de dahil olmak üzere çok çeşitli ölçümleri destekler:
- regresyon metrikleri
- ikili sınıflandırma metrikleri
- çok sınıflı/çok etiketli sınıflandırma metrikleri
- mikro ortalama / makro ortalama metrikleri
- sorgu/sıralama tabanlı metrikler
Çok çıktılı modellerden alınan metrikler destekleniyor mu?
Evet. Daha fazla ayrıntı için metrik kılavuzuna bakın.
Birden çok modelden alınan metrikler destekleniyor mu?
Evet. Daha fazla ayrıntı için metrik kılavuzuna bakın.
Metrik ayarları (isim vb.) özelleştirilebilir mi?
Evet. Metrik ayarları, metrik yapılandırmasına config
ayarları eklenerek özelleştirilebilir (örneğin belirli eşiklerin ayarlanması vb.). Daha fazla ayrıntı içeren metrik kılavuzuna bakın.
Özel metrikler destekleniyor mu?
Evet. Ya özel bir tf.keras.metrics.Metric
uygulaması yazarak ya da özel bir beam.CombineFn
uygulaması yazarak. Metrik kılavuzunda daha fazla ayrıntı vardır.
Ne tür metrikler desteklenmez?
Metriniz bir beam.CombineFn
kullanılarak hesaplanabildiği sürece, tfma.metrics.Metric
temelinde hesaplanabilecek metrik türleri üzerinde herhangi bir kısıtlama yoktur. tf.keras.metrics.Metric
türetilen bir metrikle çalışılıyorsa, aşağıdaki kriterler karşılanmalıdır:
- Her örnekte metrik için yeterli istatistikleri bağımsız olarak hesaplamak, ardından bu yeterli istatistikleri tüm örneklere ekleyerek birleştirmek ve metrik değerini yalnızca bu yeterli istatistiklerden belirlemek mümkün olmalıdır.
- Örneğin, doğruluk için yeterli istatistikler "tamamen doğru" ve "toplam örnekler"dir. Bu iki sayıyı tek tek örnekler için hesaplamak ve bu örnekler için doğru değerleri elde etmek için bunları bir grup örnek için toplamak mümkündür. Nihai doğruluk, "toplam doğru / toplam örnekler" kullanılarak hesaplanabilir.
Eklentiler
Modelimdeki adaleti veya önyargıyı değerlendirmek için TFMA kullanabilir miyim?
TFMA, sınıflandırma modellerinde istenmeyen yanlılığın etkilerini değerlendirmek için dışa aktarma sonrası ölçümler sağlayan bir FairnessIndicators eklentisi içerir.
özelleştirme
Ya daha fazla özelleştirmeye ihtiyacım olursa?
TFMA çok esnektir ve özel Extractors
, Evaluators
ve/veya Writers
kullanarak boru hattının neredeyse tüm parçalarını özelleştirmenize olanak tanır. Bu soyutlamalar, mimari belgede daha ayrıntılı olarak tartışılmaktadır.
Sorun giderme, hata ayıklama ve yardım alma
MultiClassConfusionMatrix metrikleri neden ikilileştirilmiş ConfusionMatrix metrikleriyle eşleşmiyor?
Bunlar aslında farklı hesaplamalar. Binarizasyon, her sınıf kimliği için bağımsız olarak bir karşılaştırma gerçekleştirir (yani, her sınıf için tahmin, sağlanan eşiklerle ayrı ayrı karşılaştırılır). Bu durumda, iki veya daha fazla sınıfın, tahmin edilen değerleri eşikten daha büyük olduğu için tahminle eşleştiklerini belirtmesi mümkündür (bu, daha düşük eşiklerde daha da belirgin olacaktır). Çok sınıflı karışıklık matrisi durumunda, hala yalnızca bir gerçek tahmin edilen değer vardır ve bu değer ya gerçek değerle eşleşir ya da eşleşmez. Eşik, yalnızca eşikten küçükse hiçbir sınıfla eşleşmeyen bir tahmini zorlamak için kullanılır. Eşik ne kadar yüksek olursa, ikilileştirilmiş bir sınıfın tahmininin eşleşmesi o kadar zor olur. Benzer şekilde, eşik ne kadar düşük olursa, ikilileştirilmiş bir sınıfın tahminlerinin eşleşmesi o kadar kolay olur. Bu, > 0,5'lik eşiklerde ikilileştirilmiş değerlerin ve çok sınıflı matris değerlerinin daha yakın hizalanacağı ve < 0,5'lik eşiklerde birbirlerinden daha uzak olacağı anlamına gelir.
Örneğin, diyelim ki sınıf 2'nin 0,8 olasılıkla tahmin edildiği, ancak gerçek sınıfın 0,15 olasılığı olan sınıf 1 olduğu 10 sınıfımız var. Sınıf 1'de ikili hale getirirseniz ve 0.1'lik bir eşik kullanırsanız, o zaman sınıf 1 doğru kabul edilecektir (0.15 > 0.1), bu nedenle bir TP olarak sayılacaktır, Bununla birlikte, çok sınıflı durum için sınıf 2 doğru kabul edilecektir (0,8 > 0.1) ve sınıf 1 gerçek olduğundan, bu bir FN olarak sayılacaktır. Daha düşük eşiklerde daha fazla değer pozitif olarak kabul edileceğinden, genel olarak ikilileştirilmiş karışıklık matrisi için çok sınıflı karışıklık matrisinden daha yüksek TP ve FP sayıları ve benzer şekilde daha düşük TN ve FN olacaktır.
Aşağıda, MultiClassConfusionMatrixAtThresholds ile sınıflardan birinin ikilileştirilmesinden karşılık gelen sayımlar arasında gözlemlenen farklılıklara bir örnek verilmiştir.
Kesinlik@1 ve geri çağırma@1 metriklerim neden aynı değere sahip?
En yüksek k değerinde 1 hassasiyet ve hatırlama aynı şeydir. Kesinlik TP / (TP + FP)
'ye eşittir ve geri çağırma TP / (TP + FN)
'ye eşittir. En iyi tahmin her zaman pozitiftir ve etiketle eşleşir veya eşleşmez. Başka bir deyişle, N
örnekle, TP + FP = N
. Bununla birlikte, etiket en üstteki tahminle eşleşmezse, bu aynı zamanda üst olmayan bir k tahmininin eşleştiğini ve ilk k değeri 1 olarak ayarlandığında, ilk olmayan tüm 1 tahminlerin 0 olacağını gösterir. Bu, FN'nin (N - TP)
olması gerektiği anlamına gelir. (N - TP)
veya N = TP + FN
. Sonuç, precision@1 = TP / N = recall@1
olur. Bunun, çoklu etiket için değil, yalnızca örnek başına tek bir etiket olduğunda geçerli olduğunu unutmayın.
Ortalama_etiket ve ortalama_tahmin metriklerim neden her zaman 0,5?
Bunun nedeni büyük olasılıkla metriklerin bir ikili sınıflandırma sorunu için yapılandırılmasıdır, ancak model yalnızca bir sınıf yerine her iki sınıf için de olasılıklar veriyor. Bu, tensorflow'un sınıflandırma API'si kullanıldığında yaygındır. Çözüm, tahminlerin temel almasını istediğiniz sınıfı seçmek ve ardından o sınıfa göre ikili hale getirmektir. Örneğin:
eval_config = text_format.Parse("""
...
metrics_specs {
binarize { class_ids: { values: [0] } }
metrics { class_name: "MeanLabel" }
metrics { class_name: "MeanPrediction" }
...
}
...
""", config.EvalConfig())
MultiLabelConfusionMatrixPlot nasıl yorumlanır?
Belirli bir etiket verildiğinde, MultiLabelConfusionMatrixPlot
(ve ilişkili MultiLabelConfusionMatrix
), seçilen etiket gerçekten doğru olduğunda diğer etiketlerin sonuçlarını ve bunların tahminlerini karşılaştırmak için kullanılabilir. Örneğin, bird
, plane
ve superman
olmak üzere üç sınıfımız olduğunu ve bu sınıflardan herhangi birini veya birkaçını içerip içermediğini belirtmek için resimleri sınıflandırdığımızı varsayalım. MultiLabelConfusionMatrix
, her gerçek sınıfın kartezyen çarpımını diğer sınıfa (tahmin edilen sınıf olarak adlandırılır) karşı hesaplayacaktır. Eşleştirme (actual, predicted)
iken, predicted
sınıfın mutlaka pozitif bir tahmin anlamına gelmediğini, sadece gerçek ve tahmin edilen matristeki tahmin edilen sütunu temsil ettiğini unutmayın. Örneğin, aşağıdaki matrisleri hesapladığımızı varsayalım:
(bird, bird) -> { tp: 6, fp: 0, fn: 2, tn: 0}
(bird, plane) -> { tp: 2, fp: 2, fn: 2, tn: 2}
(bird, superman) -> { tp: 1, fp: 1, fn: 4, tn: 2}
(plane, bird) -> { tp: 3, fp: 1, fn: 1, tn: 3}
(plane, plane) -> { tp: 4, fp: 0, fn: 4, tn: 0}
(plane, superman) -> { tp: 1, fp: 3, fn: 3, tn: 1}
(superman, bird) -> { tp: 3, fp: 2, fn: 2, tn: 2}
(superman, plane) -> { tp: 2, fp: 3, fn: 2, tn: 2}
(superman, superman) -> { tp: 4, fp: 0, fn: 5, tn: 0}
num_examples: 20
MultiLabelConfusionMatrixPlot
bu verileri görüntülemenin üç yolu vardır. Her durumda, tabloyu gerçek sınıfın perspektifinden okumanın yolu satır satırdır.
1) Toplam Tahmin Sayısı
Bu durumda, belirli bir satır (yani gerçek sınıf) için diğer sınıflar için TP + FP
sayıları neydi. Yukarıdaki sayılar için ekranımız aşağıdaki gibi olacaktır:
tahmin edilen kuş | tahmin edilen uçak | tahmin edilen süpermen | |
---|---|---|---|
gerçek kuş | 6 | 4 | 2 |
gerçek uçak | 4 | 4 | 4 |
gerçek süpermen | 5 | 5 | 4 |
Resimler aslında bir bird
içerdiğinde, 6 tanesini doğru bir şekilde tahmin ettik. Aynı zamanda 4 kez plane
(doğru ya da yanlış) ve 2 kez de superman
(doğru ya da yanlış) tahmininde bulunduk.
2) Yanlış Tahmin Sayısı
Bu durumda, belirli bir satır (yani gerçek sınıf) için diğer sınıflar için FP
sayıları ne kadardı. Yukarıdaki sayılar için ekranımız aşağıdaki gibi olacaktır:
tahmin edilen kuş | tahmin edilen uçak | tahmin edilen süpermen | |
---|---|---|---|
gerçek kuş | 0 | 2 | 1 |
gerçek uçak | 1 | 0 | 3 |
gerçek süpermen | 2 | 3 | 0 |
Resimler aslında bir bird
içerdiğinde, 2 kez plane
ve 1 kez superman
yanlış tahmin ettik.
3) Yanlış Negatif Sayım
Bu durumda, belirli bir satır (yani gerçek sınıf) için diğer sınıflar için FN
sayıları neydi. Yukarıdaki sayılar için ekranımız aşağıdaki gibi olacaktır:
tahmin edilen kuş | tahmin edilen uçak | tahmin edilen süpermen | |
---|---|---|---|
gerçek kuş | 2 | 2 | 4 |
gerçek uçak | 1 | 4 | 3 |
gerçek süpermen | 2 | 2 | 5 |
Resimler aslında bir bird
içerdiğinde, onu 2 kez tahmin edemedik. Aynı zamanda 2 kez plane
, 4 kez de superman
tahmininde bulunamadık.
Neden tahmin anahtarı bulunamadı hatası alıyorum?
Bazı modeller tahminlerini bir sözlük şeklinde verir. Örneğin, ikili sınıflandırma problemi için bir TF tahmincisi, probabilities
, class_ids
vb. içeren bir sözlük verir. Çoğu durumda, TFMA'nın predictions
, probabilities
, vb. gibi yaygın olarak kullanılan anahtar adlarını bulmak için varsayılanları vardır. Ancak, modeliniz çok özelleştirilmişse, TFMA tarafından bilinmeyen adlar altındaki çıkış anahtarları. Bu durumlarda, çıktının altında depolandığı anahtarın adını belirlemek için tfma.ModelSpec
bir prediciton_key
ayarı eklenmelidir.