<p>这里我要回答的是OP的主题问题,而不是他的确切问题。我这样做是因为当我搜索主题问题时,问题出现在顶部。</p>
<p>您可以通过两种方式实现自定义度量。</p>
<ol>
<li><p>如<a href="https://keras.io/metrics#custom-metrics" rel="noreferrer">Keras docu</a>所述。
</p>
<pre><code>import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='sgd',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
</code></pre>
<p>但这里你必须记住,正如Marcin Możejko的回答中提到的,<code>y_true</code>和<code>y_pred</code>是张量。因此,为了正确计算度量,您需要使用<code>keras.backend</code>功能。请看这个SO问题了解详细信息<a href="https://stackoverflow.com/questions/43547402/how-to-calculate-f1-macro-in-keras">How to calculate F1 Macro in Keras?</a></p></li>
<li><p>或者您可以用<a href="https://github.com/keras-team/keras/issues/5794#issuecomment-303683985" rel="noreferrer">Keras GH issue</a>中提到的方式来实现它。为此,您需要使用<code>callbacks</code>参数的<code>model.fit</code>。
</p>
<pre><code>import keras as keras
import numpy as np
from keras.optimizers import SGD
from sklearn.metrics import roc_auc_score
model = keras.models.Sequential()
# ...
sgd = SGD(lr=0.001, momentum=0.9)
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])
class Metrics(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self._data = []
def on_epoch_end(self, batch, logs={}):
X_val, y_val = self.validation_data[0], self.validation_data[1]
y_predict = np.asarray(model.predict(X_val))
y_val = np.argmax(y_val, axis=1)
y_predict = np.argmax(y_predict, axis=1)
self._data.append({
'val_rocauc': roc_auc_score(y_val, y_predict),
})
return
def get_data(self):
return self._data
metrics = Metrics()
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), callbacks=[metrics])
metrics.get_data()
</code></pre></li>
</ol>