警告:tensorflow:sample_weightモードは…から['…']に強制変換されました


47

.fit_generator()または.fit()を使用して画像分類子をトレーニングclass_weight=し、引数としてに辞書を渡します。

TF1.xでエラーが発生することはありませんが、2.1ではトレーニングを開始すると次の出力が表示されます。

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

何かをから...に強制するとはどういう意味['...']ですか?

tensorflowのリポジトリに関するこの警告の出典はこちらです。コメントは次のとおりです。

sample_weight_modesをターゲット構造に強制変換しようとしました。これは、Modelが内部表現の出力をフラット化するという事実に暗黙的に依存しています。


7
このような最近の質問が、自分の警告の唯一の検索結果であるのを見るのもおかしい。
jmkjaer

1
@jorijnsmitは、問題/警告を再現するためのコードを提供できますか?
したがって、hhv89

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つの巨大な配列のリストです。 targets単一のnumpy配列です。

いずれにせよ、それは単なる警告です。トレーニングはどちらの方法でも問題なく機能します。

TensorFlow 2.2の編集:

このバグはTensorFlow 2.2で修正されたようで、すばらしいです。ただし、TF 2.2では上記の修正が失敗しAttributeError: 'NoneType' object has no attribute 'shape'ます。これは、サンプルの重みの形状を取得しようとするためで、明らかにで失敗します。そのため、2.2にアップグレードするときに上記の修正を元に戻します。


これも私にとってはうまくいきます。
Robert Lugg

14

これはtensorflowのバグでありmodel.compile()、デフォルトのパラメータsample_weight_mode=Noneで呼び出した後model.fit()、指定されたsample_weightorで呼び出すと発生すると考えられますclass_weight

tensorflowリポジトリから:

  • fit() 最終的に電話する _process_training_inputs()
  • _process_training_inputs() セットは、 sample_weight_modes = [None]に基づいてmodel.sample_weight_mode = None、次に作成しDataAdaptersample_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それを上書きし、警告を出力しますNonesample_weightclass_weight

脇に警告を出しても、がに戻さfit()sample_weight_modesている場合DataAdapterとは異なり、影響はありませんNone

tensorflowのドキュメントにsample_weight、numpy配列である必要があると記載されていることに注意してください。あなたが呼び出す場合fit()sample_weight.tolist()代わりに、あなたは警告を取得することはありませんが、sample_weight静かに上書きされNoneたとき_process_numpy_inputs()に呼び出された前処理および1以上の長さの大きいの入力を受け付けます。


1
非常に徹底した説明、ありがとう。私が理解していない唯一のことは、警告...がに強制されていることを示しているの[...]に対し、あなたの場合[None]None...に強制されていることです
jorijnsmit

4

私はあなたの要旨を取り、TFAの代わりにTensorflow 2.0をインストールしましたが、そのような警告なしで機能しました。

これが完全なコードの要点です。Tensorflowをインストールするためのコードを以下に示します。

!pip install tensorflow==2.0

成功した実行のスクリーンショットを以下に示します。

ここに画像の説明を入力してください

更新:このバグは修正されましたTensorflow Version 2.2.


5
ご回答ありがとうございます。そうです、警告メッセージはversionまで導入されません2.1.0rc0。しかし、私は私の質問の遺骨を怖い:「それから強制に何かを意味何...['...']?」
jorijnsmit

3
私はいくつかの時に、おそらく意図せぬものが起こることに気づいたsample_weight_mode=Nonetarget_structureタイプのものでありdictsample_weight_modesその後、ある[None]とにおける例外broadcast_sample_weight_modesのために捕捉されますdict。これはバグと見なすことができますか?
FranzKnülleDec

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.