경고 : tensorflow : sample_weight 모드가…에서 [ '…'] (으)로 강제 변환되었습니다.


47

사전을 인수로 사용 .fit_generator()하거나 .fit()전달 하여 이미지 분류기를 훈련 class_weight=시킵니다.

TF1.x에서는 오류가 발생하지 않았지만 2.1에서는 훈련을 시작할 때 다음과 같은 결과가 나타납니다.

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

그것은에서 강제 변환 뭔가에 무엇을 의미 하는가 ...['...']?

에이 경고의 소스 tensorflow의 REPO는 여기에 , 배치 의견은 다음과 같습니다 :

sample_weight_modes를 대상 구조로 강제 변환하십시오. 이것은 내재적으로 모델이 내부 표현을 위해 출력을 평탄화한다는 사실에 달려 있습니다.


7
내 자신의 경고에 대한 유일한 검색 결과와 같은 최근 질문을 보는 것이 재미 있습니다.
jmkjaer

1
@jorijnsmit 문제 / 경고를 복제하는 코드를 제공 할 수 있습니까?
따라서 hv89

2
사실과 TF2로 전환하면 %tensorflow_version 2.x이 경고가 나타나도록 충분하다 colab.research.google.com/gist/jorijnsmit/...
jorijnsmit

1
@jorijnsmit, 아니요, 같은 경고가 표시되지만 실제로 pip install tensorflow는 pyenv / virtualenv 환경 내에서 와 같이 TF2.1을 설치했습니다
lurix66

1
실제로 @ lurix66에서이 오류를 발생시키는 코드가에 소개되어 2.1.0rc0있습니다.
jorijnsmit

답변:


11

이것은 가짜 메시지처럼 보입니다. TensorFlow 2.1로 업그레이드 한 후에도 동일한 경고 메시지가 표시되지만 클래스 가중치 또는 샘플 가중치를 전혀 사용하지 않습니다. 다음과 같이 튜플을 반환하는 생성기를 사용합니다.

return inputs, targets

이제 경고를 없애기 위해 다음과 같이 변경했습니다.

return inputs, targets, [None]

이것이 관련이 있는지는 모르지만 모델은 3 개의 입력을 사용하므로 inputs변수는 실제로 3 개의 numpy 배열 목록입니다. targets하나의 numpy 배열입니다.

어쨌든 경고 일뿐입니다. 훈련은 어느 쪽이든 잘 작동합니다.

TensorFlow 2.2 편집 :

이 버그는 TensorFlow 2.2에서 수정 된 것으로 보입니다. 그러나 위의 수정은 TF 2.2에서 실패합니다. 샘플 무게의 모양을 얻으려고 시도하기 때문에 분명히 실패합니다 AttributeError: 'NoneType' object has no attribute 'shape'. 따라서 2.2로 업그레이드 할 때 위 수정을 실행 취소하십시오.


이것은 나에게도 효과적입니다.
Robert Lugg

14

나는 이것이 model.compile()기본 매개 변수 sample_weight_mode=None로 호출 한 다음 model.fit()지정된 sample_weight또는 로 호출 할 때 발생하는 tensorflow의 버그라고 생각합니다 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_modesDataAdapterNone

tensorflow 설명서sample_weight 에는 numpy-array 여야한다고 명시되어 있습니다. 당신이 호출 할 경우 fit()sample_weight.tolist()대신, 당신은 경고를받지 않습니다하지만 sample_weight자동으로 덮어 쓰기 None할 때 _process_numpy_inputs()호출되는 전처리 하나보다 길이 이상의 입력을 받는다.


1
매우 철저한 설명, 감사합니다. 내가 이해하지 못하는 것은 경고 ...가 강제로 기술 되는 [...]반면, 귀하의 경우 [None]에는 강제로 기술된다는 것입니다 None.
jorijnsmit

4

Tist 대신 Gist를 가져 와서 Tensorflow 2.0을 설치했으며 그러한 경고없이 작동했습니다.

다음은 완전한 코드 의 요지 입니다. Tensorflow 설치 코드는 다음과 같습니다.

!pip install tensorflow==2.0

성공적인 실행의 스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

업데이트 : 이 버그는 다음에서 수정되었습니다.Tensorflow Version 2.2.


5
당신의 응답을 주셔서 감사합니다. 맞습니다. 경고 메시지는 version까지 소개되지 않았습니다 2.1.0rc0. 그러나 나는 나의 질문이 남아있는 것을 두려워 ...한다 ['...'].
jorijnsmit 10

3
나는이 때 약간의 아마 의도하지 않은 물건이 발생할 것으로 나타났습니다 sample_weight_mode=Nonetarget_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]

경고가 사라졌습니다.


고마워요! 사전으로 시도하지 못했습니다. 목록을 사용하면 오류가 수정됩니다!
Victor Mondejar-Guerra

이것이 오류를 제거하는 동안 각 클래스의 가중치가 깨져서 더 나쁜 결과가 나옵니다. 목록으로 전환하기 전에 일관성을 확인하고 싶습니다.
CanofDrink
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.