Обучение классификатора изображений с использованием .fit_generator()
или .fit()
передачей словаря class_weight=
в качестве аргумента.
Я никогда не получал ошибок в TF1.x, но в 2.1 я получаю следующий вывод при начале обучения:
WARNING:tensorflow:sample_weight modes were coerced from
...
to
['...']
Что значит принуждать что-то от ...
к ['...']
?
Источник этого предупреждения о tensorflow
репо здесь , комментарии размещены:
Попытка привести sample_weight_modes к целевой структуре. Это косвенно зависит от того факта, что Модель выравнивает выходные данные для своего внутреннего представления.
python
tensorflow
keras
tensorflow2.0
tf.keras
jorijnsmit
источник
источник
%tensorflow_version 2.x
этого предупреждения достаточно: colab.research.google.com/gist/jorijnsmit/…pip install tensorflow
(в среде pyenv / virtualenv)2.1.0rc0
.Ответы:
Это похоже на поддельное сообщение. Я получаю то же предупреждение после обновления до TensorFlow 2.1, но я вообще не использую весовые коэффициенты классов или выборочные веса. Я использую генератор, который возвращает кортеж, как это:
И теперь я просто изменил это на следующее, чтобы предупреждение исчезло:
Я не знаю, уместно ли это, но моя модель использует 3 входа, поэтому моя
inputs
переменная на самом деле представляет собой список из 3-х пустых массивов.targets
это просто один массив NumPy.В любом случае это просто предупреждение. Обучение работает в любом случае.
Редактировать для TensorFlow 2.2:
Эта ошибка, кажется, была исправлена в TensorFlow 2.2, и это здорово. Однако приведенное выше исправление не удастся в TF 2.2, потому что он попытается получить форму весов выборки, что, очевидно, не удастся
AttributeError: 'NoneType' object has no attribute 'shape'
. Так что отмените вышеуказанное исправление при обновлении до 2.2.источник
Я считаю, что это ошибка с тензорным потоком, которая произойдет, когда вы вызываете
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()
вызываются в предварительной обработке и принимает ввод длина больше , чем один.источник
...
о принуждении[...]
, а в вашем случае[None]
- кNone
...Я взял ваш Gist и установил Tensorflow 2.0 вместо TFA, и он работал без какого-либо такого предупреждения.
Вот суть полного кода. Код для установки Tensorflow показан ниже:
Скриншот успешного выполнения показан ниже:
Обновление: эта ошибка исправлена в
Tensorflow Version 2.2.
источник
2.1.0rc0
. Тем не менее, я боюсь, что мой вопрос остается: «Что значит принуждать что-то от...
к['...']
?»sample_weight_mode=None
иtarget_structure
имеют типdict
,sample_weight_modes
тогда[None]
и исключение вbroadcast_sample_weight_modes
ловится из-заdict
. Можно ли это считать ошибкой?вместо предоставления словаря
я попробовал список
и предупреждение исчезло.
источник