УВАГА: tensorflow: режими зразкової ваги були примушені з… до ['…']


47

Навчання класифікатора зображень, використовуючи .fit_generator()або .fit()передаючи словник class_weight=як аргумент.

Я ніколи не помилявся в TF1.x, але в 2.1 я отримую наступний результат, коли починаю навчання:

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

Що означає примушувати щось ...до ['...']?

Джерело цього попередження щодо tensorflowрепортажу знаходиться тут , коментарі:

Спроба примусити sample_weight_modes до цільової структури. Це неявно залежить від того, що Модель вирівнює результати для свого внутрішнього представлення.


7
Смішно бачити таке нещодавнє запитання як єдиний результат пошуку для моїх власних попереджень.
jmkjaer

1
@jorijnsmit чи можете ви надати код, щоб повторити проблему / попередження?
thushv89

2
Насправді переходу на TF2 %tensorflow_version 2.xдостатньо, щоб з’явилося це попередження: colab.research.google.com/gist/jorijnsmit/…
jorijnsmit

1
@jorijnsmit, Ні, я отримую те саме попередження, але фактично встановив TF2.1 як pip install tensorflow(у середовищі pyenv / virtualenv)
lurix66

1
Так, дійсно @ lurix66, вводиться код, який генерує цю помилку 2.1.0rc0.
jorijnsmit

Відповіді:


11

Це здається неправдивим повідомленням. Я отримую те саме повідомлення попередження після оновлення до TensorFlow 2.1, але я взагалі не використовую будь-які ваги класів або зразкові ваги. Я використовую генератор, який повертає кортеж так:

return inputs, targets

І тепер я просто змінив це на наступне, щоб попередження пройшло:

return inputs, targets, [None]

Я не знаю, чи це актуально, але моя модель використовує 3 входи, тож моя inputsзмінна - це фактично список з 3 масивних рядів. targets- це лише один масивний масив.

У будь-якому випадку, це просто попередження. Тренінг добре працює в будь-якому випадку.

Редагувати для TensorFlow 2.2:

Здається, ця помилка була виправлена ​​в TensorFlow 2.2, що чудово. Однак виправлення вище не вдасться в TF 2.2, оскільки воно намагатиметься набути форми зразків ваг, що, очевидно, не вдасться AttributeError: 'NoneType' object has no attribute 'shape'. Тому скасуйте вищезазначене виправлення під час оновлення до 2.2.


Це працює і для мене.
Роберт Лугг

14

Я вважаю, що це помилка з tensorflow, яка відбудеться, коли ви зателефонуєте model.compile()з параметром за замовчуванням, sample_weight_mode=Noneа потім зателефонуєте model.fit()із вказаним sample_weightабо class_weight.

З десятирядних репостів:

  • fit() врешті-решт дзвінки _process_training_inputs()
  • _process_training_inputs() набори sample_weight_modes = [None] на основі, model.sample_weight_mode = Noneа потім створює DataAdapterсsample_weight_modes = [None]
  • то DataAdapter дзвінки broadcast_sample_weight_modes()з sample_weight_modes = [None]під час ініціалізації
  • broadcast_sample_weight_modes() начебто очікує, sample_weight_modes = None але отримує[None]
  • він стверджує, що [None]це відрізняється від структури sample_weight/class_weight , перезаписує її назад None, пристосовуючись до структури sample_weight/ class_weightта видає попередження

Попередження осторонь цього не впливає fit() як sample_weight_modesу DataAdapterвстановленому поверненні None.

Зауважте, що в документації tensorflow зазначено, що sample_weightповинен бути масив numpy. Якщо ви зателефонували за fit()допомогою sample_weight.tolist()цього пункту, ви не отримаєте попередження, але sample_weightбуде мовчки замінено, Noneколи _process_numpy_inputs()викликається в попередній обробці та отримає вхід довжиною більше одиниці.


1
Дуже ретельне пояснення, дякую. Єдине, чого я не розумію, це те, що попередження описує ...примушення [...], тоді як у вашому випадку [None]примусово до None...
jorijnsmit

4

Я взяв ваш Gist і встановив Tensorflow 2.0 замість TFA, і він працював без такого попередження.

Ось історія повного коду. Код для встановлення Tensorflow показаний нижче:

!pip install tensorflow==2.0

Скріншот успішного виконання показаний нижче:

введіть тут опис зображення

Оновлення: ця помилка виправлена ​​вTensorflow Version 2.2.


5
Спасибі за вашу відповідь. Ви маєте рацію, попередження не вводиться до появи версії 2.1.0rc0. Однак, я боюся, моє питання залишається: "Що означає примушувати щось ...до ['...']?"
jorijnsmit

3
Я помітив , що деякі , ймовірно , ненавмисне матеріал трапляється , коли sample_weight_mode=Noneі target_structureмає тип dict, sample_weight_modesтоді [None]і виключення broadcast_sample_weight_modesловиться з - за dict. Чи можна це вважати помилкою?
Франц Кнулле

2
Ні. Питання продовжує збирати погляди та оновлення, але відповідей немає.
jorijnsmit

1
@gkennos: Якщо ви вважаєте, що це помилка, чи можете ви подати помилку в сховище Github Tensorflow.
Підтримка Tensorflow

1
Це, безумовно, помилка, але зараз вона виправлена ​​в TensorFlow 2.2
jlh

2

замість надання словника

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

я спробував список

weights = [42.0, 1.0]

і попередження зникло.


Спасибі людино! Я намагався (невдало) зі словниками. За допомогою списку виправлена ​​помилка!
Віктор Мондехар-Герра

Незважаючи на те, що це дозволяє позбутися від помилок, для мене це порушує зважування кожного класу і дає гірші результати. Я б перевірив на узгодженість, перш ніж перейти до списку.
CanofDrink
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.