Per una libreria di reti neurali ho implementato alcune funzioni di attivazione e funzioni di perdita e le loro derivate. Possono essere combinati in modo arbitrario e il derivato ai livelli di output diventa semplicemente il prodotto della derivata di perdita e la derivata dell'attivazione.Come implementare la derivata Softmax indipendentemente da qualsiasi funzione di perdita?
Tuttavia, non sono riuscito a implementare la derivata della funzione di attivazione di Softmax indipendentemente da qualsiasi funzione di perdita. A causa della normalizzazione, ovvero il denominatore nell'equazione, la modifica di una singola attivazione di ingresso modifica tutte le attivazioni di uscita e non solo una.
Ecco la mia implementazione di Softmax in cui la derivata non supera il controllo del gradiente di circa l'1%. Come posso implementare il derivato Softmax in modo che possa essere combinato con qualsiasi funzione di perdita?
import numpy as np
class Softmax:
def compute(self, incoming):
exps = np.exp(incoming)
return exps/exps.sum()
def delta(self, incoming, outgoing):
exps = np.exp(incoming)
others = exps.sum() - exps
return 1/(2 + exps/others + others/exps)
activation = Softmax()
cost = SquaredError()
outgoing = activation.compute(incoming)
delta_output_layer = activation.delta(incoming) * cost.delta(outgoing)
per jacobian_m [i] [j] = s [i] * (1-s [i]) Ottengo l'errore TypeError: l'oggetto 'numpy.float64' non supporta l'assegnazione dell'elemento come si riparerebbe per una matrice di input numpy ? –