web-dev-qa-db-ja.com

画像セグメンテーションのためのテンソルフローからのsigmoid_cross_entropy損失関数

画像セグメンテーションニューラルネットワークに関して_sigmoid_cross_entropy_損失関数が何をするかを理解しようとしています。

関連するTensorflowソースは次のとおりです コード

_zeros = array_ops.zeros_like(logits, dtype=logits.dtype)
cond = (logits >= zeros)
relu_logits = array_ops.where(cond, logits, zeros)
neg_abs_logits = array_ops.where(cond, -logits, logits)
return math_ops.add(
    relu_logits - logits * labels,
    math_ops.log1p(math_ops.exp(neg_abs_logits)), name=name)
_

私の主な質問は、なぜリターンにmath_ops.add()があるのですか?追加は、画像内のすべてのピクセルの損失の合計を参照していますか、それとも合計は何か違うことをしていますか?寸法の変​​化を適切に追跡して、合計が何をしているのかを推測することができません。

7
Jonathan

sigmoid_cross_entropy_with_logitsはマルチラベル分類で使用されます。

問題全体は、独立したクラス予測のバイナリクロスエントロピー損失に分割できます(たとえば、1は偶数と素数の両方です)。最終的にすべての予測損失を収集し、それらを平均します。

以下に例を示します。

import tensorflow as tf


logits = tf.constant([[0, 1],
                      [1, 1],
                      [2, -4]], dtype=tf.float32)
y_true = tf.constant([[1, 1],
                      [1, 0],
                      [1, 0]], dtype=tf.float32)
# tensorflow api
loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=y_true,
                                       logits=logits)

# manul computing
probs = tf.nn.sigmoid(logits)
loss_t = tf.reduce_mean(y_true * (-tf.log(probs)) +
                        (1 - y_true) * (-tf.log(1 - probs)))

config = tf.ConfigProto()
config.gpu_options.allow_growth = True  # pylint: disable=no-member
with tf.Session(config=config) as sess:
    loss_ = loss.eval()
    loss_t_ = loss_t.eval()
    print('sigmoid_cross_entropy: {: .3f}\nmanual computing: {: .3f}'.format(
        loss_, loss_t_))
------------------------------------------------------------------------------
#output: 
    sigmoid_cross_entropy:  0.463
    manual computing:  0.463
3
BugKiller

この場合、math_ops.add()tf.add(x、y) に対応し、同じサイズの2つのテンソルを足し合わせているだけです。結果の次元は引数と同じです。

セグメンテーションタスクにsigmoid_cross_entropy_with_logitsを使用する場合は、次のようにする必要があります。

loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=predictions)

ここで、labelsは各ピクセルのラベルの平坦化されたテンソルであり、logitsは各ピクセルの予測の平坦化されたテンソルです。

lossを返します。これは、各ピクセルの個々の損失を含むテンソルです。その後、あなたは使用することができます

loss_mean = tf.reduce_mean(loss)

すべての個々のピクセルの損失を平均して、最終的な損失を取得します。

2