Grad-CAMの損失関数
前回の書いたGrad-CAMの記事では損失関数を結局どう定義してたかについては深く突っ込まなかったので、もう少し具体的に損失関数がどうなっているのか確認してみます。
前回コード
def grad_cam(input_model, image, cls, layer_name):
y_c = input_model.output[0, cls]
conv_output = input_model.get_layer(layer_name).output
grads = K.gradients(y_c, conv_output)[0]
def grad_cam(input_model, image, cls, layer_name):
y_c = input_model.output[0, cls]
conv_output = input_model.get_layer(layer_name).output
grads = K.gradients(y_c, conv_output)[0]
結局、このコードのy_c = input_model.output[0, cls]
の一行部分が損失関数になっているわけですが、損失関数をどう定義して計算しているんでしょうか。
これはOne_hotベクトル同士の内積、つまり
def grad_cam(input_model, image, cls, layer_name):
y_pred = input_model.output[0]
y_true = np.zeros(1000)
y_true[cls] = 1.0
y_true = tf.convert_to_tensor(y_true.astype(np.float32))
loss = K.sum(y_pred * y_true)
conv_output = input_model.get_layer(layer_name).output
grads = K.gradients(loss, conv_output)[0]
という計算をしているにすぎません。
それにしてもK.sum(y_pred * y_true)
の損失関数の名称はなんていうんでしょうか。ヒンジ関数あたりが近い形ですかね?
ほかの損失関数を使った場合:
当然、ほかの損失関数を使っても良いです。
#loss = - K.mean(K.square(y_pred - y_true), axis=-1) # mean_squared_error
loss = - K.categorical_crossentropy(y_true, y_pred) # categorical_crossentropy
ただ、どのGrad-Camの結果は損失関数を使っても、あまり違いがないみたいです。
:左(y_pred * y_true)、中央(mean_squared_error)、右(categorical_crossentropy)
まとめ:
Grad-CAMの損失関数はK.sum(y_pred * y_true)
である。ほかの損失関数を使っても結果はあまり変わらない。
Author And Source
この問題について(Grad-CAMの損失関数), 我々は、より多くの情報をここで見つけました https://qiita.com/nishiha/items/8509dc4146442ad5315c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .