それは入力が(y_true, y_pred)
である両方のケースのための前提としていkerasモデルのカスタム損失およびメトリック関数を作成:Keras:メトリックと異なる入力して損失が
def custom_loss(y_true, y_pred):
.
return loss
def custom_metric(y_true, y_pred):
.
return metric
そしてy_pred
の入力が出力されますModel
。例:
model = Model(inputs = [input1,..inputN], outputs=loss)
model.compile(loss=costum_loss, metrics=costum_metric)
この場合、上記の損失とメトリックの両方について、y_predは損失になります。
costum_loss
に異なる入力があり、costum_metric
が異なる場合はどうなりますか?それを行う方法はありますか?
編集:
def warp_loss(X):
z, positive_entity, negatives_entities = X
positiveSim = Lambda(lambda x: similarity(x[0], x[1]), output_shape=(1,), name="positive_sim")([z, positive_entity])
z_reshaped = Reshape((1, z.shape[1].value))(z)
negativeSim = Lambda(lambda x: similarity(x[0], x[1]), output_shape=(negatives_titles.shape[1].value, 1,), name="negative_sim")([z_reshaped, negatives_entities])
loss = Lambda(lambda x: max_margin_loss(x[0], x[1]), output_shape=(1,), name="max_margin")([positiveSim, negativeSim])
return loss
def mean_loss(y_true, y_pred):
return K.mean(y_pred - 0 * y_true)
とメトリック:
def metric(X):
z, positive_entity, negatives_entities = X
positiveSim = Lambda(lambda x: similarity(x[0], x[1]), output_shape=(1,), name="positive_sim")([z, positive_entity])
z_reshaped = Reshape((1, z.shape[1].value))(z)
negativeSim = Lambda(lambda x: similarity(x[0], x[1]), output_shape=(negatives_titles.shape[1].value, 1,), name="negative_sim")([z_reshaped, negatives_entities])
position = K.sum(K.cast(K.greater(positiveSim, negativeSim), dtype="int32"), axis=1, keepdims=True)
accuracy = Lambda(lambda x: x/_NUMBER_OF_NEGATIVE_EXAMPLES)(position)
return accuracy
def mean_acc(y_true, y_pred):
return K.mean(y_pred - 0 * y_true)
だから、最初の4行は同じとした後、あるspeciffically私は私の損失になりたい
詳細2つの機能が変わります。 Callback
を使用してmean_acc
を印刷することは可能でしょうか?
カスタム関数はy_predに依存しませんか? –
これらの2つの関数で 'y_pred'を異なるものにします。この場合、損失出力は実際には予測値ではありません。あなたはすでにコメントしているこの質問https://stackoverflow.com/questions/46447882/weights-of-cnn-model-go-to-really-small-values-and-after-nanで損失を確認することができます。 –
あなたは 'custom_loss'と' custom_metrics'への入力として何をしたいですか? –