Bantuan melindungi Great Barrier Reef dengan TensorFlow pada Kaggle Bergabung Tantangan

Analisis Model Tensorflow Pertanyaan yang Sering Diajukan

Umum

Apakah EvalSavedModel masih diperlukan?

Sebelumnya TFMA diperlukan semua metrik untuk disimpan dalam grafik tensorflow menggunakan khusus EvalSavedModel . Sekarang, metrik dapat dihitung di luar grafik TF menggunakan beam.CombineFn implementasi.

Beberapa perbedaan utama adalah:

  • Sebuah EvalSavedModel membutuhkan ekspor khusus dari pelatih sedangkan model yang melayani dapat digunakan tanpa perubahan yang dibutuhkan untuk kode pelatihan.
  • Ketika EvalSavedModel digunakan, setiap metrik ditambahkan pada pelatihan waktu secara otomatis tersedia pada saat evaluasi. Tanpa EvalSavedModel metrik ini harus re-tambah.
    • Pengecualian untuk aturan ini adalah jika model keras digunakan, metrik juga dapat ditambahkan secara otomatis karena keras menyimpan informasi metrik di samping model yang disimpan.

Bisakah TFMA bekerja dengan metrik dalam grafik dan metrik eksternal?

TFMA memungkinkan pendekatan hibrida untuk digunakan di mana beberapa metrik dapat dihitung dalam grafik sedangkan yang lain dapat dihitung di luar. Jika saat ini Anda memiliki EvalSavedModel maka Anda dapat terus menggunakannya.

Ada dua kasus:

  1. Gunakan TFMA EvalSavedModel untuk kedua ekstraksi fitur dan metrik perhitungan tetapi juga menambahkan tambahan metrik berbasis combiner. Dalam hal ini Anda akan mendapatkan semua metrik di-grafik dari EvalSavedModel bersama dengan metrik tambahan dari berbasis combiner kekuatan yang tidak telah didukung sebelumnya.
  2. Gunakan TFMA EvalSavedModel untuk fitur / ekstraksi prediksi tetapi penggunaan metrik berbasis combiner untuk semua metrik perhitungan. Mode ini berguna jika ada transformasi fitur hadir dalam EvalSavedModel yang Anda ingin gunakan untuk mengiris, tetapi lebih memilih untuk melakukan semua metrik perhitungan luar grafik.

Mempersiapkan

Jenis model apa yang didukung?

TFMA mendukung keras model, model berdasarkan generik API TF2 tanda tangan, sebagai model berdasarkan juga TF estimator (walaupun tergantung pada kasus penggunaan estimator model berdasarkan mungkin memerlukan EvalSavedModel untuk digunakan).

Lihat get_started panduan untuk daftar lengkap jenis model yang didukung dan larangan.

Bagaimana cara saya mengatur TFMA untuk bekerja dengan model berbasis keras asli?

Berikut ini adalah contoh konfigurasi untuk model keras berdasarkan asumsi berikut:

  • Model yang disimpan adalah untuk melayani dan menggunakan nama tanda tangan serving_default (ini dapat diubah dengan menggunakan model_specs[0].signature_name ).
  • Dibangun pada metrik dari model.compile(...) harus dievaluasi (ini dapat dinonaktifkan melalui options.include_default_metric dalam tfma.EvalConfig ).
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())

Lihat metrik untuk informasi lebih lanjut tentang jenis lain dari metrik yang dapat dikonfigurasi.

Bagaimana cara mengatur TFMA agar berfungsi dengan model berbasis tanda tangan TF2 generik?

Berikut ini adalah contoh konfigurasi untuk model TF2 generik. Di bawah, signature_name adalah nama dari tanda tangan khusus yang harus digunakan untuk evaluasi.

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

Lihat metrik untuk informasi lebih lanjut tentang jenis lain dari metrik yang dapat dikonfigurasi.

Bagaimana cara mengatur TFMA untuk bekerja dengan model berbasis estimator?

Dalam hal ini ada tiga pilihan.

Opsi1: Gunakan Model Penyajian

Jika opsi ini digunakan, maka metrik apa pun yang ditambahkan selama pelatihan TIDAK akan disertakan dalam evaluasi.

Berikut ini adalah contoh konfigurasi dengan asumsi serving_default adalah nama tanda tangan yang digunakan:

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

Lihat metrik untuk informasi lebih lanjut tentang jenis lain dari metrik yang dapat dikonfigurasi.

Opsi2: Gunakan EvalSavedModel bersama dengan metrik berbasis penggabung tambahan

Dalam hal ini, gunakan EvalSavedModel untuk kedua fitur / ekstraksi prediksi dan evaluasi dan juga menambahkan metrik berdasarkan combiner tambahan.

Berikut ini adalah contoh konfigurasi:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "eval"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

Lihat metrik untuk informasi lebih lanjut tentang jenis lain dari metrik yang dapat dikonfigurasi dan EvalSavedModel untuk informasi lebih lanjut tentang menyiapkan EvalSavedModel.

Option3: Gunakan Model EvalSavedModel hanya untuk Ekstraksi Fitur / Prediksi

Mirip dengan pilihan (2), tetapi hanya menggunakan EvalSavedModel untuk ekstraksi fitur / prediksi. Opsi ini berguna jika hanya metrik eksternal yang diinginkan, tetapi ada transformasi fitur yang ingin Anda potong. Mirip dengan opsi (1) metrik apa pun yang ditambahkan selama pelatihan TIDAK akan disertakan dalam evaluasi.

Dalam hal ini konfigurasi adalah sama seperti di atas hanya include_default_metrics dinonaktifkan.

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

Lihat metrik untuk informasi lebih lanjut tentang jenis lain dari metrik yang dapat dikonfigurasi dan EvalSavedModel untuk informasi lebih lanjut tentang menyiapkan EvalSavedModel.

Bagaimana cara saya mengatur TFMA untuk bekerja dengan model berbasis model-ke-estimator yang keras?

The keras model_to_estimator setup mirip dengan confiugration estimator. Namun ada beberapa perbedaan khusus tentang cara kerja model ke estimator. Secara khusus, model-to-esimtator mengembalikan outputnya dalam bentuk dict di mana kunci dict adalah nama layer output terakhir dalam model keras terkait (jika tidak ada nama yang diberikan, keras akan memilih nama default untuk Anda seperti dense_1 atau output_1 ). Dari perspektif TFMA, perilaku ini mirip dengan apa yang akan menjadi output untuk model multi-output meskipun model ke estimator mungkin hanya untuk satu model. Untuk memperhitungkan perbedaan ini, langkah tambahan diperlukan untuk mengatur nama keluaran. Namun, tiga opsi yang sama berlaku sebagai penaksir.

Berikut ini adalah contoh perubahan yang diperlukan untuk konfigurasi berbasis estimator:

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

Bagaimana cara mengatur TFMA agar berfungsi dengan prediksi yang telah dihitung sebelumnya (yaitu model-agnostik)? ( TFRecord dan tf.Example )

Dalam rangka untuk mengkonfigurasi TFMA bekerja dengan pra-dihitung prediksi, default tfma.PredictExtractor harus dinonaktifkan dan tfma.InputExtractor harus dikonfigurasi untuk mengurai prediksi bersama dengan fitur input lain. Hal ini dilakukan dengan mengkonfigurasi tfma.ModelSpec dengan nama kunci fitur yang digunakan untuk prediksi bersama label dan bobot.

Berikut ini adalah contoh pengaturan:

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

Lihat metrik untuk informasi lebih lanjut tentang metrik yang dapat dikonfigurasi.

Perhatikan bahwa meskipun sebuah tfma.ModelSpec sedang dikonfigurasi model tidak benar-benar digunakan (yaitu tidak ada tfma.EvalSharedModel ). Panggilan untuk menjalankan analisis model mungkin terlihat sebagai berikut:

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

Bagaimana cara mengatur TFMA agar berfungsi dengan prediksi yang telah dihitung sebelumnya (yaitu model-agnostik)? ( pd.DataFrame )

Untuk dataset kecil yang dapat disimpan dalam memori, alternatif untuk TFRecord adalah pandas.DataFrame s. TFMA dapat beroperasi pada pandas.DataFrame s menggunakan tfma.analyze_raw_data API. Untuk penjelasan tfma.MetricsSpec dan tfma.SlicingSpec , lihat pengaturan panduan. Lihat metrik untuk informasi lebih lanjut tentang metrik yang dapat dikonfigurasi.

Berikut ini adalah contoh pengaturan:

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

Metrik

Jenis metrik apa yang didukung?

TFMA mendukung berbagai metrik termasuk:

Apakah metrik dari model multi-output didukung?

Ya. Lihat metrik memandu untuk lebih jelasnya.

Apakah metrik dari beberapa model didukung?

Ya. Lihat metrik memandu untuk lebih jelasnya.

Dapatkah pengaturan metrik (nama, dll) disesuaikan?

Ya. Pengaturan metrik dapat disesuaikan (misalnya ambang tertentu pengaturan, dll) dengan menambahkan config pengaturan untuk metrik konfigurasi. Lihat metrik panduan memiliki rincian lebih lanjut.

Apakah metrik khusus didukung?

Ya. Baik dengan menulis kustom tf.keras.metrics.Metric implementasi atau dengan menulis kustom beam.CombineFn implementasi. The metrik panduan memiliki rincian lebih lanjut.

Jenis metrik apa yang tidak didukung?

Selama metrik Anda dapat dihitung menggunakan beam.CombineFn , tidak ada pembatasan pada jenis metrik yang dapat dihitung berdasarkan tfma.metrics.Metric . Jika bekerja dengan metrik berasal dari tf.keras.metrics.Metric maka kriteria berikut harus dipenuhi:

  • Seharusnya dimungkinkan untuk menghitung statistik yang memadai untuk metrik pada setiap contoh secara independen, kemudian menggabungkan statistik yang cukup ini dengan menambahkannya di semua contoh, dan menentukan nilai metrik hanya dari statistik yang memadai ini.
  • Misalnya, untuk akurasi statistik yang cukup adalah "total benar" dan "total contoh". Dimungkinkan untuk menghitung dua angka ini untuk contoh individu, dan menambahkannya untuk sekelompok contoh untuk mendapatkan nilai yang tepat untuk contoh tersebut. Akurasi akhir dapat dihitung menggunakan "total benar / contoh total".

Pengaya

Dapatkah saya menggunakan TFMA untuk mengevaluasi keadilan atau bias dalam model saya?

TFMA termasuk FairnessIndicators add-on yang menyediakan metrik pasca-ekspor untuk mengevaluasi efek bias yang tidak diinginkan dalam model klasifikasi.

Kustomisasi

Bagaimana jika saya membutuhkan lebih banyak penyesuaian?

TFMA sangat flexibile dan memungkinkan Anda untuk menyesuaikan hampir semua bagian pipa menggunakan kustom Extractors , Evaluators , dan / atau Writers . Abstrations ini discusssed secara lebih rinci dalam arsitektur dokumen.

Pemecahan masalah, debugging, dan mendapatkan bantuan

Mengapa metrik MultiClassConfusionMatrix tidak cocok dengan metrik ConfusionMatrix biner

Ini sebenarnya perhitungan yang berbeda. Binarisasi melakukan perbandingan untuk setiap ID kelas secara independen (yaitu prediksi untuk setiap kelas dibandingkan secara terpisah terhadap ambang batas yang disediakan). Dalam hal ini mungkin untuk dua atau lebih kelas untuk semua menunjukkan bahwa mereka cocok dengan prediksi karena nilai prediksi mereka lebih besar dari ambang batas (ini akan lebih jelas di ambang batas yang lebih rendah). Dalam kasus matriks konfusi multikelas, masih ada hanya satu nilai prediksi yang benar dan itu cocok dengan nilai sebenarnya atau tidak. Ambang batas hanya digunakan untuk memaksa prediksi agar tidak cocok dengan tidak ada kelas jika kurang dari ambang batas. Semakin tinggi ambang batas, semakin sulit untuk mencocokkan prediksi kelas biner. Demikian juga, semakin rendah ambang batas, semakin mudah untuk mencocokkan prediksi kelas biner. Artinya pada threshold > 0.5 nilai-nilai biner dan nilai matriks multiclass akan lebih selaras dan pada threshold < 0.5 akan semakin berjauhan.

Sebagai contoh, katakanlah kita memiliki 10 kelas di mana kelas 2 diprediksi dengan probabilitas 0,8, tetapi kelas sebenarnya adalah kelas 1 yang memiliki probabilitas 0,15. Jika Anda melakukan binerisasi pada kelas 1 dan menggunakan ambang batas 0,1, maka kelas 1 akan dianggap benar (0,15 > 0,1) sehingga akan dihitung sebagai TP, Namun untuk kasus multikelas, kelas 2 akan dianggap benar (0,8 > 0.1) dan karena kelas 1 adalah yang sebenarnya, ini akan dihitung sebagai FN. Karena pada ambang batas yang lebih rendah, lebih banyak nilai akan dianggap positif, secara umum akan ada jumlah TP dan FP yang lebih tinggi untuk matriks kebingungan biner daripada matriks kebingungan multikelas, dan juga TN dan FN yang lebih rendah.

Berikut ini adalah contoh perbedaan yang diamati antara MultiClassConfusionMatrixAtThresholds dan jumlah yang sesuai dari binarisasi salah satu kelas.

MultiClassConfusionMatrixAtThresholds vs Binarized

Mengapa metrik precision@1 dan recall@1 saya memiliki nilai yang sama?

Pada nilai k teratas dari 1 presisi dan recall adalah hal yang sama. Presisi sama dengan TP / (TP + FP) dan recall sama dengan TP / (TP + FN) . Prediksi teratas selalu positif dan akan cocok atau tidak cocok dengan label. Dengan kata lain, dengan N contoh, TP + FP = N . Namun, jika label tidak sesuai dengan atas prediksi, maka ini juga menyiratkan prediksi k non-top disesuaikan dan dengan top k set ke 1, semua non-top 1 prediksi akan menjadi 0. Ini berarti FN harus (N - TP) atau N = TP + FN . Hasil akhirnya adalah precision@1 = TP / N = recall@1 . Perhatikan bahwa ini hanya berlaku bila ada satu label per contoh, bukan untuk multi-label.

Mengapa metrik mean_label dan mean_prediction saya selalu 0,5?

Ini kemungkinan besar disebabkan karena metrik dikonfigurasi untuk masalah klasifikasi biner, tetapi model mengeluarkan probabilitas untuk kedua kelas, bukan hanya satu. Hal ini biasa terjadi ketika tensorflow ini klasifikasi API digunakan. Solusinya adalah memilih kelas yang Anda inginkan untuk dijadikan dasar prediksi dan kemudian melakukan binerisasi pada kelas tersebut. Sebagai contoh:

eval_config = text_format.Parse("""
  ...
  metrics_specs {
    binarize { class_ids: { values: [0] } }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    ...
  }
  ...
""", config.EvalConfig())

Bagaimana cara menginterpretasikan MultiLabelConfusionMatrixPlot?

Diberikan label khusus, MultiLabelConfusionMatrixPlot (dan terkait MultiLabelConfusionMatrix ) dapat digunakan untuk membandingkan hasil dari label lain dan prediksi mereka ketika label yang dipilih adalah benar-benar benar. Sebagai contoh, mari kita mengatakan bahwa kita memiliki tiga kelas bird , plane , dan superman dan kami mengelompokkan gambar untuk menunjukkan jika mengandung satu atau lebih dari setiap kelas-kelas ini. The MultiLabelConfusionMatrix akan menghitung produk Cartesian dari masing-masing kelas yang sebenarnya terhadap masing-masing kelas lain (disebut kelas diprediksi). Perhatikan bahwa sementara pasangan adalah (actual, predicted) , yang predicted kelas tidak selalu berarti prediksi positif, itu hanya mewakili kolom diprediksi dalam aktual vs matrix diprediksi. Sebagai contoh, katakanlah kita telah menghitung matriks berikut:

   (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

The MultiLabelConfusionMatrixPlot memiliki tiga cara untuk menampilkan data ini. Dalam semua kasus, cara membaca tabel adalah baris demi baris dari perspektif kelas yang sebenarnya.

1) Jumlah Prediksi Total

Dalam hal ini, untuk diberikan berturut-turut (yaitu kelas yang sebenarnya) apa yang menjadi TP + FP jumlah untuk kelas-kelas lain. Untuk hitungan di atas, tampilan kita akan menjadi sebagai berikut:

Burung yang diprediksi Pesawat yang diprediksi Superman yang diprediksi
Burung sebenarnya 6 4 2
Pesawat sebenarnya 4 4 4
Superman sebenarnya 5 5 4

Ketika gambar sebenarnya berisi bird kita benar memprediksi 6 dari mereka. Pada saat yang sama kami juga diprediksi plane (baik benar atau salah) 4 kali dan superman (baik benar atau salah) 2 kali.

2) Hitungan Prediksi Salah

Dalam hal ini, untuk diberikan berturut-turut (yaitu kelas yang sebenarnya) apa yang menjadi FP jumlah untuk kelas-kelas lain. Untuk hitungan di atas, tampilan kita akan menjadi sebagai berikut:

Burung yang diprediksi Pesawat yang diprediksi Superman yang diprediksi
Burung sebenarnya 0 2 1
Pesawat sebenarnya 1 0 3
Superman sebenarnya 2 3 0

Ketika gambar sebenarnya berisi bird kita salah memperkirakan plane 2 kali dan superman 1 kali.

3) Hitungan Negatif Palsu

Dalam hal ini, untuk diberikan berturut-turut (yaitu kelas yang sebenarnya) apa yang menjadi FN jumlah untuk kelas-kelas lain. Untuk hitungan di atas, tampilan kita akan menjadi sebagai berikut:

Burung yang diprediksi Pesawat yang diprediksi Superman yang diprediksi
Burung sebenarnya 2 2 4
Pesawat sebenarnya 1 4 3
Superman sebenarnya 2 2 5

Ketika gambar sebenarnya berisi bird kita gagal untuk memprediksi itu 2 kali. Pada saat yang sama, kami gagal untuk memprediksi plane 2 kali dan superman 4 kali.

Mengapa saya mendapatkan pesan error tentang kunci prediksi tidak ditemukan?

Beberapa model mengeluarkan prediksinya dalam bentuk kamus. Sebagai contoh, sebuah estimator TF untuk masalah klasifikasi biner output kamus yang berisi probabilities , class_ids , dll Dalam kebanyakan kasus TFMA memiliki default untuk menemukan nama kunci commomly digunakan seperti predictions , probabilities , dll Namun, jika model Anda sangat disesuaikan hal itu mungkin kunci keluaran dengan nama yang tidak diketahui oleh TFMA. Dalam tesis kasus prediciton_key pengaturan harus ditambahkan ke tfma.ModelSpec untuk mengidentifikasi nama kunci output disimpan di bawah.