Keras/Theano Calcolo delle perdite personalizzate - Lavorando con i tensori
-
31-10-2019 - |
Domanda
Sto lottando per scrivere un codice di manipolazione del tensore per una funzione di perdita personalizzata che sto usando in Keras.
Fondamentalmente, sto cercando di modificare una perdita binaria_crossentropia aggiungendo un peso che viene calcolato da una caratteristica particolare.
La prima cosa che faccio è passare i miei dati di funzionalità extra alla perdita personalizzata aggiungendolo a y_true in questo modo:
y_trainModded = numpy.append(y_train, MyExtraData, axis=1)
Che viene quindi passato alla funzione di adattamento come:
model.fit(X_train, y_trainModded, epochs=2500, .....)
Quindi estratto per renderlo utilizzabile in questo modo:
def myCustomLoss(data, y_pred):
y_true = data[:,:2]
MyExtraData = data[:,2]
...
...
Finora, tutto funziona bene. Tuttavia, sto lottando con una sezione in cui voglio selezionare solo MyExtradata in cui ho previsto "1". Intuitivamente, questo sarebbe semplicemente qualcosa di simile:
ExtraDataWherePredicted1 = MyExtraData[y_pred > 0]
Tuttavia, abbiamo a che fare con tensori, non array numpy. Ho provato a lanciare su array numpy usando Eval (), ma non ha funzionato. Ho anche provato vari approcci usando operazioni di Keras.backend come:
WherePredicted1 = K.greater( y_pred,0)
ExtraDataWherePredicted1 = tf.boolean_mask(MyExtraData, WherePredicted1)
Che potrei quindi usare per pesare la mia perdita come:
return K.mean(K.binary_crossentropy(y_pred,y_true), axis=-1)-(K.mean(ExtraDataWherePredicted1))
Ma tutto ciò che provo lancia vari errori ... Non riesco proprio a capire come calcolare Extradatawherepreded1. Trovo anche molto difficile eseguire il debug della funzione di perdita perché non riesco a stampare () qualsiasi cosa al suo interno, quindi è molto difficile ricontrollare per vedere se gli array/i tensori sono ciò che mi aspetto che siano.
Qualsiasi aiuto sarebbe apprezzato!
Nessuna soluzione corretta