मैं केरस में कई आउटपुट मॉडल पर काम कर रहा हूं। मैंने दो कस्टम मेट्रिक्स, auroc और auprc लागू किए हैं, जो कि Keras मॉडल की compile विधियों में पास किए गए हैं:

def auc(y_true, y_pred, curve='PR'):
    score, up_opt = tf.compat.v1.metrics.auc(y_true, y_pred, curve=curve, summation_method="careful_interpolation")
    K.get_session().run(tf.local_variables_initializer())
    with tf.control_dependencies([up_opt]):
        score = tf.identity(score)
    return score

def auprc(y_true, y_pred):
    return auc(y_true, y_pred, curve='PR')

def auroc(y_true, y_pred):
    return auc(y_true, y_pred, curve='ROC')

mlp_model.compile(loss=...,
                    optimizer=...,
                    metrics=[auprc, auroc])

इस पद्धति का उपयोग करते हुए, मैं प्रत्येक आउटपुट के लिए auprc/auroc मान प्राप्त करता हूं, लेकिन, बायेसियन ऑप्टिमाइज़र के साथ अपने हाइपरपैरामीटर को अनुकूलित करने के लिए, मुझे एक एकल मीट्रिक की आवश्यकता होती है (उदाहरण: प्रत्येक आउटपुट के लिए औसत या auprc का योग)। मुझे समझ नहीं आ रहा है कि मैं एक ही मेट्रिक में कैसे जुड़ सकता हूं।

संपादित करें: यहां वांछित परिणामों का एक उदाहरण है

अब प्रत्येक युग के लिए निम्नलिखित मीट्रिक मुद्रित होते हैं:

out1_auprc: 0.0267 - out2_auprc: 0.0277 - out3_auprc: 0.0294

जहां out1, out2, out3 मेरे तंत्रिका नेटवर्क आउटपुट हैं, मैं कुछ इस तरह प्राप्त करना चाहता हूं:

average_auprc: 0.0279 - out1_auprc: 0.0267 - out2_auprc: 0.0277 - out3_auprc: 0.0294

मैं बायेसियन ऑप्टिमाइज़ेशन के लिए केरस ट्यूनर का उपयोग कर रहा हूं।

किसी भी मदद की सराहना की जाती है, धन्यवाद।

3
FabioL 22 मई 2020, 19:03

1 उत्तर

सबसे बढ़िया उत्तर

मैं कस्टम कॉलबैक बनाने में समस्या को ओवरराइड करता हूं

class MergeMetrics(Callback):

    def __init__(self,**kargs):
        super(MergeMetrics,self).__init__(**kargs)

    def on_epoch_begin(self,epoch, logs={}):
        return

    def on_epoch_end(self, epoch, logs={}):
        logs['merge_metrics'] = 0.5*logs["y1_mse"]+0.5*logs["y2_mse"]

मैं इस कॉलबैक का उपयोग 2 अलग-अलग आउटपुट से आने वाले 2 मेट्रिक्स को मर्ज करने के लिए करता हूं। उदाहरण के लिए मैं एक साधारण समस्या का उपयोग करता हूं लेकिन आप इसे अपनी समस्या में आसानी से एकीकृत कर सकते हैं और इसे सत्यापन सेट के साथ एकीकृत कर सकते हैं

यह डमी उदाहरण है

X = np.random.uniform(0,1, (1000,10))
y1 = np.random.uniform(0,1, 1000)
y2 = np.random.uniform(0,1, 1000)


inp = Input((10))
x = Dense(32, activation='relu')(inp)
out1 = Dense(1, name='y1')(x)
out2 = Dense(1, name='y2')(x)
m = Model(inp, [out1,out2])
m.compile('adam','mae', metrics='mse')


checkpoint = MergeMetrics()
m.fit(X, [y1,y2], epochs=10, callbacks=[checkpoint])

मुद्रित आउटपुट

loss: ..... y1_mse: 0.0863 - y2_mse: 0.0875 - merge_metrics: 0.0869
1
Marco Cerliani 22 मई 2020, 22:04