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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top