Keras の損失関数 (損失) の概要

1. Kerasパッケージとtensorflowパッケージのバージョン紹介

Keras パッケージと tensorflow パッケージのバージョンは使用する前に一致する必要があり、使用する前に Python のバージョンも一致する必要があるためです。現在の環境はpython3.5+keras2.1.0+tensorflow1.4.0です。各バージョンを一致させる方法がわからない場合は、私のサポート パッケージを使用することをお勧めします。以前は python3.8 を使用していましたが、keras と tensorflow をインストールした後は、常にエラーを報告していました。正常に設定するには数日の実験が必要でした環境です。この環境に gdal パッケージをインストールしないように注意してください。gdal パッケージをインストールすると、エラーが報告されます。原因は、gdal パッケージが numpy バ​​ージョンをダウングレードしており、keras と tensorflow がエラーを報告しているためと思われます。これは私の経験談ですので、参考にしていただければと思います。

2. 損失関数の概要

損失関数ファイル (losses.py) は、keras パッケージのフォルダーにあります (私のファイルは "D:\Anaconda3\setup\envs\py35_tf1.4.0_keras2.1.0\Lib\site-packages\keras" にあります)。合計があります

2.1、mean_squared_error関数

ソースコードは次のとおりです。

def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

式は次のとおりです。
ここに画像の説明を挿入

どのように計算されるかを例で見てみましょう。
仮定:

y_true = [[0., 1., 1.], [0., 0., 1.]] ##真实标签
y_pred = [[1., 1., 0], [1., 0., 1]]  #预测标签,可见第一个列表里错了2个,第一个列表里错了1个
y_true = tf.convert_to_tensor(y_true) #将列表转成张量
y_pred = tf.convert_to_tensor(y_pred) #将列表转成张量,因为K.square和K.mean的输入类型为张量。

y_true と y_pred の型をテンソルとして見ることができます。

type(y_true)
#tensorflow.python.framework.ops.Tensor
type(y_pred)
#tensorflow.python.framework.ops.Tensor

means_squared_error 関数を呼び出して計算します。

def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true),axis=-1)
result = mean_squared_error(y_true, y_pred)
type(result) #查看结果类型,也为张量
#tensorflow.python.framework.ops.Tensor

次に、結果テンソルの特定の値を確認します。ここで、 tf.Session() を最初に呼び出す必要があります。上記の関数定義や呼び出しは、計算に必要な内容を準備して枠組みを設定するだけであり、実際の計算を行うわけではないため、セッションはすぐに計算を開始できます。以下の出力結果は [0.6666667 0.33333334] で、最初のリストの損失が 0.67、2 番目のリストの損失が 0.33 であることを示しています。このアルゴリズムは分散の計算に似ています。

with tf.Session() as sess:
    print (result.eval())
#[0.6666667  0.33333334]

2.2、mean_absolute_error関数

ソースコードは次のとおりです。

def mean_absolute_error(y_true, y_pred):
    return K.mean(K.abs(y_pred - y_true), axis=-1)

計算式は次のとおりです。
ここに画像の説明を挿入
上記の例と同様、操作方法は同じです。結果は [0.6666667 0.33333334] で、このアルゴリズムは平均絶対誤差を計算するのと同じです。

2.3、mean_absolute_percentage_error関数数

ソースコードは次のとおりです。

def mean_absolute_percentage_error(y_true, y_pred):
    diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true),K.epsilon(),None))
    return 100. * K.mean(diff, axis=-1)

式は次のとおりです。
ここに画像の説明を挿入

上記例と同様、操作方法は同じです。結果は [3.3333338e+08 3.3333331e+08] です。この結果はあまり意味がありませんが、式は実際のラベルの予測誤差の割合のように見えます。

2.4、mean_squared_logarithmic_error 関数

ソースコードは次のとおりです。

def mean_squared_logarithmic_error(y_true, y_pred):
    first_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
    second_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)
    return K.mean(K.square(first_log - second_log), axis=-1)

計算式は次のとおりです。
ここに画像の説明を挿入
上記の例と同様、操作方法は同じです。結果は [0.32030192 0.16015096] となります。

2.5、squared_hinge関数

ソースコードは次のとおりです。

def squared_hinge(y_true, y_pred):
    return K.mean(K.square(K.maximum(1. - y_true * y_pred, 0.)), axis=-1)

式は次のとおりです。
ここに画像の説明を挿入
結果は [0.6666667 0.6666667] となります。値は 0 と 1 の 2 つだけなので、y_true * y_pred は、正しい予測を 1 に設定し、間違った予測を 0 に設定し、その後 1 に設定するのと同じです。 - y_true * y_pred は、それを反転して間違った予測を取得する場所。

2.5、ヒンジ機能

ソースコードは次のとおりです。

def hinge(y_true, y_pred):
    return K.mean(K.maximum(1. - y_true * y_pred, 0.), axis=-1)

式は次のとおりです。
ここに画像の説明を挿入

結果は [0.6666667 0.6666667] となります。

2.6、categorical_hinge関数

ソースコードは次のとおりです。

def categorical_hinge(y_true, y_pred):
    pos = K.sum(y_true * y_pred, axis=-1)
    neg = K.max((1. - y_true) * y_pred, axis=-1)
    return K.maximum(0., neg - pos + 1.)

計算式はヒンジ機能と同じです。pos は、実際の値が 1 である場所の数が 1 として正しく予測されることを示し、neg は、実際の値が 0 である場所の数が誤って 1 として予測されることを示します。結果は[1.1.]です。

2.7、logcosh関数

ソースコードは次のとおりです。

def logcosh(y_true, y_pred):
    """Logarithm of the hyperbolic cosine of the prediction error.

    `log(cosh(x))` is approximately equal to `(x ** 2) / 2` for small `x` and
    to `abs(x) - log(2)` for large `x`. This means that 'logcosh' works mostly
    like the mean squared error, but will not be so strongly affected by the
    occasional wildly incorrect prediction. However, it may return NaNs if the
    intermediate value `cosh(y_pred - y_true)` is too large to be represented
    in the chosen precision.
    """
    def cosh(x):
        return (K.exp(x) + K.exp(-x)) / 2
    return K.mean(K.log(cosh(y_pred - y_true)), axis=-1)

予測誤差の双曲線余弦の対数。結果は [0.2891872 0.1445936] となります。

2.8、categorical_crossentropy関数

ソースコードは次のとおりです。

def categorical_crossentropy(y_true, y_pred):
    return K.categorical_crossentropy(y_true, y_pred)

さらに詳しいソース コードについては、次のように .\Lib\site-packages\keras\backend\cntk_backend.py を参照してください。

def categorical_crossentropy(target, output, from_logits=False):
    if from_logits:
        result = C.cross_entropy_with_softmax(output, target)
        # cntk's result shape is (batch, 1), while keras expect (batch, )
        return C.reshape(result, ())
    else:
        # scale preds so that the class probas of each sample sum to 1
        output /= C.reduce_sum(output, axis=-1)
        # avoid numerical instability with epsilon clipping
        output = C.clip(output, epsilon(), 1.0 - epsilon())
        return -sum(target * C.log(output), axis=-1)

categorical_crossentropy 損失を使用する場合、ターゲット値はカテゴリ形式である必要があります (つまり、10 個のクラスがある場合、各サンプルのターゲット値は、カテゴリを表すものを除き、インデックスが 1 の 10 次元ベクトルである必要があります。他はすべて0です)。

2.9、sparse_categorical_crossentropy関数

ソースコードは次のとおりです。

def sparse_categorical_crossentropy(target, output, from_logits=False):
    target = C.one_hot(target, output.shape[-1])
    target = C.reshape(target, output.shape)
    return categorical_crossentropy(target, output, from_logits)

意味は categorical_crossentropy と似ています。

2.10、binary_crossentropy関数

ソースコードは次のとおりです。

def binary_crossentropy(target, output, from_logits=False):
    if from_logits:
        output = C.sigmoid(output)
    output = C.clip(output, epsilon(), 1.0 - epsilon())
    output = -target * C.log(output) - (1.0 - target) * C.log(1.0 - output)
    return output

二項分類のクロスエントロピー。

2.11、kullback_leibler_divergence関数

ソースコードは次のとおりです。

def kullback_leibler_divergence(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), 1)
    y_pred = K.clip(y_pred, K.epsilon(), 1)
    return K.sum(y_true * K.log(y_true / y_pred), axis=-1)

KL 発散計算損失

2.12、ポアソン関数

ソースコードは次のとおりです。

def poisson(y_true, y_pred):
    return K.mean(y_pred - y_true * K.log(y_pred + K.epsilon()), axis=-1)

ポアソン損失関数

2.13、cosine_proximity関数

ソースコードは次のとおりです。

def cosine_proximity(y_true, y_pred):
    y_true = K.l2_normalize(y_true, axis=-1)
    y_pred = K.l2_normalize(y_pred, axis=-1)
    return -K.sum(y_true * y_pred, axis=-1)

2.14、cosine_proximity関数

ソースコードは次のとおりです。

def cosine_proximity(y_true, y_pred):
    y_true = K.l2_normalize(y_true, axis=-1)
    y_pred = K.l2_normalize(y_pred, axis=-1)
    return -K.sum(y_true * y_pred, axis=-1)






おすすめ

転載: blog.csdn.net/weixin_42999968/article/details/112277765