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 tensorflow
repositó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.
python
tensorflow
keras
tensorflow2.0
tf.keras
jorijnsmit
fonte
fonte
%tensorflow_version 2.x
é suficiente para fazer com que esse aviso apareça: colab.research.google.com/gist/jorijnsmit/…pip install tensorflow
(no ambiente pyenv / virtualenv)2.1.0rc0
.Respostas:
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:
E agora eu mudei para o seguinte para fazer o aviso desaparecer:
Não sei se isso é relevante, mas meu modelo usa 3 entradas, portanto, minha
inputs
variá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.fonte
Eu acredito que este é um erro com tensorflow que acontecerá quando você chamar
model.compile()
com o parâmetro padrãosample_weight_mode=None
e depois chamarmodel.fit()
comsample_weight
or especificadoclass_weight
.Dos repositórios tensorflow:
fit()
eventualmente chama_process_training_inputs()
_process_training_inputs()
define comsample_weight_modes = [None]
basemodel.sample_weight_mode = None
e, em seguida, cria umDataAdapter
comsample_weight_modes = [None]
DataAdapter
chamadasbroadcast_sample_weight_modes()
comsample_weight_modes = [None]
durante a inicializaçãobroadcast_sample_weight_modes()
parece esperar,sample_weight_modes = None
mas recebe[None]
[None]
é uma estrutura diferente desample_weight
/class_weight
, sobrescreve-a de volta aoNone
ajuste na estrutura desample_weight
/class_weight
e emite um avisoAviso de lado este não tem efeito sobre
fit()
comosample_weight_modes
naDataAdapter
recua paraNone
.Observe que a documentação do tensorflow indica que
sample_weight
deve ser uma matriz numpy. Se você telefonarfit()
emsample_weight.tolist()
vez disso, não receberá um aviso, massample_weight
será sobrescrito silenciosamente paraNone
quando_process_numpy_inputs()
é chamado no pré - processamento e recebe uma entrada com comprimento maior que um.fonte
...
ser coagido[...]
, enquanto no seu caso[None]
é coagido aNone
...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:
A captura de tela da execução bem-sucedida é mostrada abaixo:
Atualização: este bug foi corrigido no
Tensorflow Version 2.2.
fonte
2.1.0rc0
. No entanto, receio que minha pergunta permaneça: "O que significa coagir algo de...
para['...']
?"sample_weight_mode=None
etarget_structure
são do tipodict
,sample_weight_modes
é então[None]
e a exceçãobroadcast_sample_weight_modes
é capturada devido aodict
. Isso pode ser considerado um bug?em vez de fornecer um dicionário
eu tentei uma lista
e o aviso desapareceu.
fonte