ВНИМАНИЕ: тензор потока: образцы-весовые режимы были переведены из… в ['…']

47

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

Я никогда не получал ошибок в TF1.x, но в 2.1 я получаю следующий вывод при начале обучения:

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

Что значит принуждать что-то от ...к ['...']?

Источник этого предупреждения о tensorflowрепо здесь , комментарии размещены:

Попытка привести sample_weight_modes к целевой структуре. Это косвенно зависит от того факта, что Модель выравнивает выходные данные для своего внутреннего представления.

jorijnsmit
источник
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это просто один массив NumPy.

В любом случае это просто предупреждение. Обучение работает в любом случае.

Редактировать для TensorFlow 2.2:

Эта ошибка, кажется, была исправлена ​​в TensorFlow 2.2, и это здорово. Однако приведенное выше исправление не удастся в TF 2.2, потому что он попытается получить форму весов выборки, что, очевидно, не удастся AttributeError: 'NoneType' object has no attribute 'shape'. Так что отмените вышеуказанное исправление при обновлении до 2.2.

JLH
источник
Это работает и для меня.
Роберт Лугг
14

Я считаю, что это ошибка с тензорным потоком, которая произойдет, когда вы вызываете 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.

Обратите внимание, что в документации тензорного потока говорится, что это 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.

Поддержка Tensorflow
источник
5
Благодарю за ваш ответ. Вы правы, предупреждающее сообщение не вводится до версии 2.1.0rc0. Тем не менее, я боюсь, что мой вопрос остается: «Что значит принуждать что-то от ...к ['...']
jorijnsmit
3
Я заметил, что некоторые, возможно, непреднамеренные вещи случаются, когда sample_weight_mode=Noneи target_structureимеют тип dict, sample_weight_modesтогда [None]и исключение в broadcast_sample_weight_modesловится из-за dict. Можно ли это считать ошибкой?
Franz Knülle
2
Нет. Вопрос продолжает собирать мнения и отклики, но ответов нет.
jorijnsmit
1
@gkennos: Если вы чувствуете, что это ошибка, вы можете отправить сообщение об ошибке в Github Tensorflow Repository.
Поддержка Tensorflow
1
Это, безусловно, ошибка, но теперь фиксируется в TensorFlow 2.2
JLH
2

вместо предоставления словаря

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

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

weights = [42.0, 1.0]

и предупреждение исчезло.

0 -_- 0
источник
Спасибо чувак! Я пытался (безуспешно) со словарями. При использовании списка ошибка исправлена!
Виктор Мондехар-Герра
Хотя это и помогает избавиться от ошибки, для меня это приводит к снижению веса каждого класса и приводит к худшим результатам. Я бы проверил последовательность, прежде чем перейти к списку.
CanofDrink