DrLo Δημοσ. 11 Ιανουαρίου Δημοσ. 11 Ιανουαρίου (επεξεργασμένο) θέλω να φτιάξω μια custom metric συνάρτηση για το training σε ενός NN (που να μπορώ να τη χρησιμοποιώ και ως custom loss) θέλω αντι να χρησιμοποιώ πχ το 'mean_absolute_percentage_error' να χρησιμοποιώ το "max_absolute_percentage_error" def max_pe(y_true, y_pred) : absolute_percentage_error = tf.abs((y_true - y_pred) / y_true) * 100 return tf.reduce_max(absolute_percentage_error) το θέμα είναι ότι δε βγάζει το σωστό νούμερο και δε μπορώ να καταλάβω γιατί ακόμα και όταν απλά την καταγράφω σαν metric (δεν την έχω ως loss) αφού τελος πάντως τελειώσει το training , όταν υπολογίσω το maximum percentage το όταν πάρω το trained μοντελο για πάρω τα predictions , το maximum error είναι ~ 39% αλλά βλέποντας το history, στο epoch που "επιλέχθηκε" μετά το early stopping , λέει ότι το είναι 22% και δε βγάζει νόημα τι κάνω λάθος Επεξ/σία 11 Ιανουαρίου από DrLo
stefanos50 Δημοσ. 11 Ιανουαρίου Δημοσ. 11 Ιανουαρίου (επεξεργασμένο) 12 ώρες πριν, DrLo είπε θέλω να φτιάξω μια custom metric συνάρτηση για το training σε ενός NN (που να μπορώ να τη χρησιμοποιώ και ως custom loss) θέλω αντι να χρησιμοποιώ πχ το 'mean_absolute_percentage_error' να χρησιμοποιώ το "max_absolute_percentage_error" def max_pe(y_true, y_pred) : absolute_percentage_error = tf.abs((y_true - y_pred) / y_true) * 100 return tf.reduce_max(absolute_percentage_error) το θέμα είναι ότι δε βγάζει το σωστό νούμερο και δε μπορώ να καταλάβω γιατί ακόμα και όταν απλά την καταγράφω σαν metric (δεν την έχω ως loss) αφού τελος πάντως τελειώσει το training , όταν υπολογίσω το maximum percentage το όταν πάρω το trained μοντελο για πάρω τα predictions , το maximum error είναι ~ 39% αλλά βλέποντας το history, στο epoch που "επιλέχθηκε" μετά το early stopping , λέει ότι το είναι 22% και δε βγάζει νόημα τι κάνω λάθος Τι ακριβώς εννοείς ότι δεν βγάζει το σωστό νούμερο; Δεν είναι καλό το performance; Είναι εκτός του εύρους της μετρικής; Το ότι η μετρική διαφέρει από αυτή του όταν έκανες training με όταν το ξανά φορτώσεις και κάνεις testing μπορεί να έχει πολλές αιτίες. Έχεις callback για να κρατάς το καλύτερο μοντέλο και με βάση κάποιο κανόνα ή το τελευταίο μετά το early stopping; Γενικά πολύ ασαφής η περιγραφή σου αν μπορείς ανέβασε ολόκληρο τον κώδικα ή γράψε πιο αναλυτικά το τι ακριβώς κάνεις που εκπαιδεύεις και που τεστάρεις και τι θέλεις να πετύχεις. Η σύνταξη της συνάρτησης που έχεις βάλει μέχρι στιγμής δεν νομίζω ότι έχει κάποιο λάθος. Επεξ/σία 11 Ιανουαρίου από stefanos50
DrLo Δημοσ. 11 Ιανουαρίου Μέλος Δημοσ. 11 Ιανουαρίου (επεξεργασμένο) 12 λεπτά πριν, stefanos50 είπε Τι ακριβώς εννοείς ότι δεν βγάζει το σωστό νούμερο; Δεν είναι καλό το performance; Είναι εκτός του εύρους της μετρικής; Το ότι η μετρική διαφέρει από αυτή του όταν έκανες training με όταν το ξανά φορτώσεις και κάνεις testing μπορεί να έχει πολλές αιτίες. Γενικά αν μπορείς ανέβασε ολόκληρο τον κώδικα ή γράψε πιο αναλυτικά το τι ακριβώς κάνεις που εκπαιδεύεις και που τεστάρεις. Δεν εννωω ότι έχει διαφορετική τιμή (λίγο) σε διαφορετικά τρεξίματα όπως λες. Αυτό είναι φυσικά αναμενόμενο. ενωω αυτό που βλέπω στο training history με το απο τέλεσμα του trained μοντέλου από ΤΟ ΙΔΙΟ αυτό training. Εννωω, ότι όταν πάρω το trained μοντέλο στο τέλος, έξω από το loop του training, δώσω ξανά , ανεξάρτητα από το training validation x και πάρω τα predictions και υπολογισω το maxmum percentage error (με άλλο κώδικά , επιβεβαίωμένο, ακόμα και αν παρω τις τιμές και το κάνω σε excel) των προβλέψεων είναι 42% πχ ένω το metric που βλέπω στο history είναι πολύ διαφορετικό. Στο epoch που επιλέγεται εντέλει ως αυτό στο οποίο γίνοτναι restore τα weights όταν ενεργοποιηθεί το early stoping βλέπω ότι το "val_max_pe" είναι ~28%. οσάν δηλαδή ο υπολογισμός σε αυτό το function και μόνο να είναι λάθος το δοκίμασα συμβουλές από το chatgpt για αυτό που προτείνει ως με from keras import backend as K def max_pe(y_true, y_pred): percentage_errors = K.abs((y_true - y_pred) / y_true) * 100 return K.max(percentage_errors) μου δίνει είτε το ίδιο με αυτό που βγάζω εγώ , είτε περιέργως, παίζοντας με τα axis στο K.max() Ακριβως το ίδιο νούμερο με το ΜΕΑΝ percenage error (το υπάρχον mape δηλαδή). Επεξ/σία 11 Ιανουαρίου από DrLo
Dr_Pepper Δημοσ. 29 Ιανουαρίου Δημοσ. 29 Ιανουαρίου Στις 11/1/2025 στις 3:25 ΠΜ, DrLo είπε θέλω να φτιάξω μια custom metric συνάρτηση για το training σε ενός NN (που να μπορώ να τη χρησιμοποιώ και ως custom loss) θέλω αντι να χρησιμοποιώ πχ το 'mean_absolute_percentage_error' να χρησιμοποιώ το "max_absolute_percentage_error" def max_pe(y_true, y_pred) : absolute_percentage_error = tf.abs((y_true - y_pred) / y_true) * 100 return tf.reduce_max(absolute_percentage_error) το θέμα είναι ότι δε βγάζει το σωστό νούμερο και δε μπορώ να καταλάβω γιατί ακόμα και όταν απλά την καταγράφω σαν metric (δεν την έχω ως loss) αφού τελος πάντως τελειώσει το training , όταν υπολογίσω το maximum percentage το όταν πάρω το trained μοντελο για πάρω τα predictions , το maximum error είναι ~ 39% αλλά βλέποντας το history, στο epoch που "επιλέχθηκε" μετά το early stopping , λέει ότι το είναι 22% και δε βγάζει νόημα τι κάνω λάθος Φαίνεται ότι υπάρχει ένα μικρό μπέρδεμα με το πώς υπολογίζεται το max_absolute_percentage_error . Κατά τη διάρκεια του training, το y_true και το y_pred που δίνεις στη συνάρτηση max_pe είναι batches δεδομένων, δηλαδή μικρά υποσύνολα των συνολικών δεδομένων training. Η συνάρτηση tf.reduce_max(absolute_percentage_error) υπολογίζει το μέγιστο σφάλμα εντός αυτού του batch. Δεν υπολογίζει το μέγιστο σφάλμα σε όλο το training set. Έτσι, το 22% που βλέπεις στο history είναι το μέγιστο σφάλμα στο batch με το οποίο έγινε η αξιολόγηση στο epoch αυτό και όχι το μέγιστο σφάλμα σε όλα τα δεδομένα. Υπολογισμός Metrics μετά το Training: Όταν υπολογίζεις το μέγιστο σφάλμα μετά το training, χρησιμοποιείς όλα τα δεδομένα validation/test, οπότε το μέγιστο σφάλμα που βλέπεις είναι πραγματικά το μέγιστο σε όλο το dataset. Η Λύση, συνάρτηση Metric: Για να διορθώσεις την metric συνάρτηση και να υπολογίζει σωστά το max_absolute_percentage_error σε κάθε batch, πρέπει να διατηρείς το μέγιστο σφάλμα που έχει εμφανιστεί μέχρι στιγμής σε όλα τα batches. Αντί να χρησιμοποιείς tf.reduce_max σε κάθε batch, θα πρέπει να χρησιμοποιείς μια μεταβλητή (state variable) που θα κρατάει το μέγιστο και θα την ενημερώνεις. import tensorflow as tf class MaxAbsolutePercentageError(tf.keras.metrics.Metric): def __init__(self, name='max_pe', **kwargs): super(MaxAbsolutePercentageError, self).__init__(name=name, **kwargs) self.max_error = self.add_weight(name='max_error', initializer='zeros') def update_state(self, y_true, y_pred, sample_weight=None): y_true = tf.cast(y_true, tf.float32) # Cast σε float αν χρειαστεί y_pred = tf.cast(y_pred, tf.float32) # Cast σε float αν χρειαστεί absolute_percentage_error = tf.abs((y_true - y_pred) / y_true) * 100 batch_max_error = tf.reduce_max(absolute_percentage_error) self.max_error.assign(tf.maximum(self.max_error, batch_max_error)) def result(self): return self.max_error def reset_state(self): self.max_error.assign(0.) Χρήση ως Loss Function: Η χρήση του max_absolute_percentage_error ως loss function είναι λίγο προβληματική γιατί είναι ασυνεχής συνάρτηση (λόγω του max). Αυτό μπορεί να δημιουργήσει προβλήματα στη σύγκλιση του μοντέλου. Αν θες οπωσδήποτε να το χρησιμοποιήσεις ως loss, μπορείς να δοκιμάσεις μια "smoothed" έκδοση του max (όπως το softmax), αλλά γενικά δεν είναι η πιο ιδανική επιλογή. Πώς να το Χρησιμοποιήσεις: Ως Metric: model.compile(optimizer='adam', loss='mean_squared_error', # χρησιμοποίησε καταλληλότερη συνάρτηση loss metrics=[MaxAbsolutePercentageError()]) history = model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), callbacks=[early_stopping]) Ως Loss (με Προσοχή): def smooth_max_pe(y_true, y_pred): y_true = tf.cast(y_true, tf.float32) y_pred = tf.cast(y_pred, tf.float32) absolute_percentage_error = tf.abs((y_true - y_pred) / y_true) * 100 # Softmax προσέγγιση του max exp_errors = tf.exp(absolute_percentage_error) return tf.math.log(tf.reduce_sum(exp_errors) / tf.cast(tf.shape(exp_errors)[0], tf.float32)) model.compile(optimizer='adam', loss=smooth_max_pe, metrics=[MaxAbsolutePercentageError()]) 2
DrLo Δημοσ. 29 Ιανουαρίου Μέλος Δημοσ. 29 Ιανουαρίου (επεξεργασμένο) αν και πέρασε η προθεσμί που μο χρειαζόταν η απάντηση, η απάντησή σο ήταν κατατοπιστική Για την ακρίβεια χριεάζομαι (χρειαζόμον) το maximum absolute error του κάθε "epoch" , και ναι κάθε epoch είναι περισσότερα από 1 batches οπότε αυτό που λες βγάζει νοημα. έιχα την εντύπωση οτι το metric υπολογιζόταν στο τέλος του epoch , όχι κάθε batch θα τσεκάρω με 1 batch / epoch (μιας και το παράδειγμα που δουλευα ήταν εξαιρεικά ελαφρύ) αλλά και το κώδικά σου. thanks ΥΓ: ... άρα αυτό που βλέπω στο printout των epochs στο τέλος είναι το max_absolute_error του τελευταίου batch πρακτικά που έχει "γράφτει πάνω" στα προηγούμε που δε προλαβαινα να δω (και κάποιο από αυτά θα ήταν το "σωστό"); Επεξ/σία 29 Ιανουαρίου από DrLo
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα