1

TensorFlowを使用してマルチラベル分類を実装しようとしています(つまり、各出力パターンには多くのアクティブユニットがあります)。この問題は、クラスの不均衡(ラベル分布を非常に疎らにするラベル分布のものよりはるかにゼロ)を有する。テンソルフローとシグモイドクロスエントロピー損失との比較

問題に取り組む最も良い方法は、tf.nn.weighted_cross_entropy_with_logits機能を使用することです。しかし、私はこのランタイムエラーが発生します:

ValueError: Tensor conversion requested dtype uint8 for Tensor with dtype float32 

ここで何が間違っているのか分かりません。損失関数への入力として、私はラベルテンソル、logitsテンソル、および一定であるポジティブ・クラスの重みを、渡す:

positive_class_weight = 10 
loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight) 

この問題を解決する方法についてのヒントを?私が同じラベルを渡してテンソルをtf.losses.sigmoid_cross_entropyの損失関数に渡すと、すべてがうまくいきます(Tensorflowが適切に実行されますが、訓練予測は常にゼロです)。

関連する問題hereを参照してください。 tf.losses.sigmoid_cross_entropytf.nn.weighted_cross_entropy_with_logits間の唯一の大きな違いは、返さテンソルの形状であるため、

答えて

1

エラーは、損失関数の後にスローされる可能性が高いです。

この例を見てみましょう:

logits = tf.linspace(-3., 5., 10) 
labels = tf.fill([10,], 1.) 

positive_class_weight = 10 
weighted_loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight) 
print(weighted_loss.shape) 

sigmoid_loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels, logits=logits) 
print(sigmoid_loss.shape) 

テンソルlogitslabelsを一種の人工的であり、両方の形状(10,)を持っています。しかし、weighted_losssigmoid_lossが異なることが重要です。出力は次のとおりです。

(10,) 
() 

tf.losses.sigmoid_cross_entropy還元(デフォルトでは合計)を実行するためです。だから、それを複製するには、加重損失をtf.reduce_sum(...)でラップする必要があります。

これが役に立たない場合は、labelsテンソルのタイプがfloat32であることを確認してください。このバグは作ることは非常に簡単で、例えば、次の宣言は動作しません。

labels = tf.fill([10,], 1) # the type is not float! 

あなたはthis questionを読み取ることも興味があるかもしれません。

+0

ありがとうございます。これで問題は解決しました。ラベルを明示的に 'float32'にキャストし、' tf.reduce_sum(...) 'を使って損失出力を減らさなければなりませんでした。 – Alberto

関連する問題