AVISO: tensorflow: modos de sample_weight foram coagidos de… a ['…']


47

Treinar um classificador de imagens usando .fit_generator()ou .fit()passando um dicionário class_weight=como argumento.

Nunca obtive erros no TF1.x, mas no 2.1 recebo a seguinte saída ao iniciar o treinamento:

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

O que significa coagir algo de ...para ['...']?

A fonte deste aviso no tensorflowrepositório está aqui , os comentários colocados são:

Tente coagir sample_weight_modes à estrutura de destino. Isso depende implicitamente do fato de o Model nivelar as saídas para sua representação interna.


7
Engraçado ver uma pergunta tão recente como o único resultado de pesquisa para meus próprios avisos também.
jmkjaer

11
@jorijnsmit você pode fornecer o código para replicar o problema / aviso?
thushv89

2
Na verdade, alternar para TF2 com %tensorflow_version 2.xé suficiente para fazer com que esse aviso apareça: colab.research.google.com/gist/jorijnsmit/…
jorijnsmit

11
@jorijnsmit, Não, recebo o mesmo aviso, mas na verdade instalei o TF2.1 como pip install tensorflow(no ambiente pyenv / virtualenv)
lurix66

11
Sim, de fato, @ lurix66, o código que gera esse erro é introduzido no 2.1.0rc0.
jorijnsmit 17/01

Respostas:


11

Parece uma mensagem falsa. Recebo a mesma mensagem de aviso após a atualização para o TensorFlow 2.1, mas não uso pesos de classe ou de amostra. Eu uso um gerador que retorna uma tupla como esta:

return inputs, targets

E agora eu mudei para o seguinte para fazer o aviso desaparecer:

return inputs, targets, [None]

Não sei se isso é relevante, mas meu modelo usa 3 entradas, portanto, minha inputsvariável é na verdade uma lista de 3 matrizes numpy. targetsé apenas uma única matriz numpy.

De qualquer forma, é apenas um aviso. O treinamento funciona bem de qualquer maneira.

Edite para o TensorFlow 2.2:

Esse bug parece ter sido corrigido no TensorFlow 2.2, o que é ótimo. No entanto, a correção acima falhará no TF 2.2, porque tentará obter a forma dos pesos da amostra, o que obviamente falhará AttributeError: 'NoneType' object has no attribute 'shape'. Desfaça a correção acima ao atualizar para o 2.2.


Isso funciona para mim também.
Robert Lugg

14

Eu acredito que este é um erro com tensorflow que acontecerá quando você chamar model.compile()com o parâmetro padrão sample_weight_mode=Nonee depois chamar model.fit()com sample_weightor especificado class_weight.

Dos repositórios tensorflow:

  • fit() eventualmente chama _process_training_inputs()
  • _process_training_inputs() define com sample_weight_modes = [None] base model.sample_weight_mode = Nonee, em seguida, cria um DataAdaptercomsample_weight_modes = [None]
  • as DataAdapterchamadas broadcast_sample_weight_modes()com sample_weight_modes = [None]durante a inicialização
  • broadcast_sample_weight_modes() parece esperar, sample_weight_modes = None mas recebe[None]
  • afirma que [None]é uma estrutura diferente de sample_weight/ class_weight, sobrescreve-a de volta ao Noneajuste na estrutura de sample_weight/ class_weighte emite um aviso

Aviso de lado este não tem efeito sobre fit()como sample_weight_modesna DataAdapterrecua para None.

Observe que a documentação do tensorflow indica que sample_weightdeve ser uma matriz numpy. Se você telefonar fit()em sample_weight.tolist()vez disso, não receberá um aviso, mas sample_weightserá sobrescrito silenciosamente para Nonequando _process_numpy_inputs()é chamado no pré - processamento e recebe uma entrada com comprimento maior que um.


11
Uma explicação muito completa, obrigado. A única coisa que não entendo é que o aviso descreve ...ser coagido [...], enquanto no seu caso [None]é coagido a None...
jorijnsmit

4

Peguei seu Gist e instalei o Tensorflow 2.0, em vez do TFA, e ele funcionou sem esse aviso.

Aqui está a essência do código completo. O código para instalar o Tensorflow é mostrado abaixo:

!pip install tensorflow==2.0

A captura de tela da execução bem-sucedida é mostrada abaixo:

insira a descrição da imagem aqui

Atualização: este bug foi corrigido noTensorflow Version 2.2.


5
Obrigado pela sua resposta. Você está certo, a mensagem de aviso não é apresentada até a versão 2.1.0rc0. No entanto, receio que minha pergunta permaneça: "O que significa coagir algo de ...para ['...']?"
jorijnsmit

3
Percebi que algumas coisas provavelmente não intencionais acontecem quando sample_weight_mode=Nonee target_structuresão do tipo dict, sample_weight_modesé então [None]e a exceção broadcast_sample_weight_modesé capturada devido ao dict. Isso pode ser considerado um bug?
Franz Knülle

2
Não. A pergunta continua reunindo visualizações e votos positivos, mas não há respostas.
jorijnsmit 30/01

11
@gkennos: Se você acha que é um bug, pode arquivar um bug no Repositório do Github Tensorflow.
Suporte ao Tensorflow

11
É definitivamente um erro, mas agora está fixo em TensorFlow 2.2
jlh

2

em vez de fornecer um dicionário

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

eu tentei uma lista

weights = [42.0, 1.0]

e o aviso desapareceu.


Valeu cara! Eu estava tentando (sem êxito) com os dicionários. Usando a lista, o erro foi corrigido!
Victor Mondejar-Guerra

Enquanto isso se livra do erro, para mim isso quebra a ponderação de cada classe produz resultados piores. Eu verificaria a consistência antes de mudar para uma lista.
CanofDrink 23/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.