PERINGATAN: tensorflow: mode sample_weight dipaksakan dari ... ke ['...']

47

Melatih classifier gambar menggunakan .fit_generator()atau .fit()dan meneruskan kamus class_weight=sebagai argumen.

Saya tidak pernah mendapatkan kesalahan di TF1.x tetapi di 2.1 saya mendapatkan output berikut saat memulai pelatihan:

WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']

Apa artinya untuk memaksa sesuatu dari ...ke ['...']?

Sumber untuk peringatan tentang tensorflowrepo ini ada di sini , komentar yang diberikan adalah:

Mencoba untuk memaksa sample_weight_modes ke struktur target. Ini secara implisit tergantung pada kenyataan bahwa Model meratakan output untuk representasi internal.

jorijnsmit
sumber
7
Lucu melihat pertanyaan baru-baru ini sebagai satu-satunya hasil pencarian untuk peringatan saya sendiri.
jmkjaer
1
@ jorijnsmit dapatkah Anda memberikan kode untuk mereplikasi masalah / peringatan?
thushv89
2
Sebenarnya beralih ke TF2 dengan %tensorflow_version 2.xcukup untuk membuat peringatan ini muncul: colab.research.google.com/gist/jorijnsmit/…
jorijnsmit
1
@ jorijnsmit, Tidak, saya mendapatkan peringatan yang sama tetapi sebenarnya sudah menginstal TF2.1 sebagai pip install tensorflow(dalam lingkungan pyenv / virtualenv)
lurix66
1
Ya memang @ lurix66, kode yang menghasilkan kesalahan ini diperkenalkan di 2.1.0rc0.
jorijnsmit

Jawaban:

11

Ini sepertinya pesan palsu. Saya mendapatkan pesan peringatan yang sama setelah meningkatkan ke TensorFlow 2.1, tapi saya tidak menggunakan bobot kelas atau bobot sampel sama sekali. Saya menggunakan generator yang mengembalikan tuple seperti ini:

return inputs, targets

Dan sekarang saya baru saja mengubahnya menjadi yang berikut untuk membuat peringatan hilang:

return inputs, targets, [None]

Saya tidak tahu apakah ini relevan, tetapi model saya menggunakan 3 input, jadi inputsvariabel saya sebenarnya adalah daftar 3 numpy array. targetshanya array numpy tunggal.

Bagaimanapun, itu hanya peringatan. Pelatihannya bekerja dengan baik.

Edit untuk TensorFlow 2.2:

Bug ini tampaknya telah diperbaiki di TensorFlow 2.2, yang sangat bagus. Namun perbaikan di atas akan gagal dalam TF 2.2, karena akan mencoba untuk mendapatkan bentuk bobot sampel, yang jelas akan gagal AttributeError: 'NoneType' object has no attribute 'shape'. Jadi batalkan perbaikan di atas saat memutakhirkan ke 2.2.

jlh
sumber
Ini juga berfungsi untuk saya.
Robert Lugg
14

Saya percaya ini adalah bug dengan tensorflow yang akan terjadi ketika Anda memanggil model.compile()dengan parameter default sample_weight_mode=Nonedan kemudian memanggil model.fit()dengan ditentukan sample_weightatau class_weight.

Dari repo tensorflow:

  • fit() akhirnya menelepon _process_training_inputs()
  • _process_training_inputs() set sample_weight_modes = [None] berdasarkan model.sample_weight_mode = Nonedan kemudian membuat DataAdapterdengansample_weight_modes = [None]
  • yang DataAdapterpanggilan broadcast_sample_weight_modes()dengan sample_weight_modes = [None]selama inisialisasi
  • broadcast_sample_weight_modes() tampaknya mengharapkan sample_weight_modes = None tetapi menerima[None]
  • itu menegaskan bahwa itu [None]adalah struktur yang berbeda dari sample_weight/ class_weight, menimpa kembali Nonedengan pas dengan struktur sample_weight/ class_weightdan mengeluarkan peringatan

Peringatan samping ini tidak berpengaruh pada fit()seperti sample_weight_modesdi DataAdapteradalah set kembali ke None.

Perhatikan bahwa dokumentasi tensorflow menyatakan bahwa sample_weightharus numpy-array. Jika Anda menelepon fit()dengan sample_weight.tolist()gantinya, Anda tidak akan mendapatkan peringatan tetapi sample_weightditimpa secara diam-diam Noneketika _process_numpy_inputs()dipanggil dalam praproses dan menerima input yang panjangnya lebih dari satu.

Maks
sumber
1
Penjelasan yang sangat menyeluruh, terima kasih. Satu-satunya hal yang saya tidak mengerti adalah bahwa peringatan itu menggambarkan ...dipaksa [...], sedangkan dalam kasus Anda [None]dipaksa untuk None...
jorijnsmit
4

Saya telah mengambil Gist Anda dan menginstal Tensorflow 2.0, bukan TFA dan berhasil tanpa Peringatan semacam itu.

Berikut adalah Inti dari kode lengkap. Kode untuk menginstal Tensorflow ditunjukkan di bawah ini:

!pip install tensorflow==2.0

Cuplikan layar dari eksekusi yang berhasil ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Pembaruan: Bug ini diperbaiki diTensorflow Version 2.2.

Dukungan Tensorflow
sumber
5
Terima kasih atas tanggapan Anda. Anda benar, pesan peringatan tidak diperkenalkan sampai versi 2.1.0rc0. Namun, aku takut sisa-sisa pertanyaan saya: "Apa artinya untuk memaksa sesuatu dari ...ke ['...']?"
jorijnsmit
3
Saya perhatikan bahwa beberapa hal yang mungkin tidak disengaja terjadi ketika sample_weight_mode=Nonedan target_structurebertipe dict, sample_weight_modessaat itu [None]dan pengecualian dalam broadcast_sample_weight_modesditangkap karena dict. Bisakah ini dianggap sebagai bug?
Franz Knülle
2
Nggak. Pertanyaan terus mengumpulkan pandangan dan kemajuan tetapi tidak ada jawaban.
jorijnsmit
1
@ gkennos: Jika Anda merasa itu adalah bug, Bisakah Anda mengajukan Bug di Github Tensorflow Repository.
Dukungan Tensorflow
1
Ini pasti bug, tapi sekarang sudah diperbaiki di TensorFlow 2.2
jlh
2

alih-alih menyediakan kamus

weights = {'0': 42.0, '1': 1.0}

saya mencoba daftar

weights = [42.0, 1.0]

dan peringatan itu hilang.

0 -_- 0
sumber
Terima kasih sobat! Saya mencoba (tidak berhasil) dengan kamus. Dengan menggunakan daftar kesalahan diperbaiki!
Victor Mondejar-Guerra
Meskipun ini menghilangkan kesalahan, bagi saya ini mematahkan bobot untuk setiap kelas menghasilkan hasil yang lebih buruk. Saya akan memeriksa konsistensi sebelum beralih ke daftar.
CanofDrink