2 votes

Comment puis-je punir certaines sorties plus que d'autres dans un modèle keras ?

J'ai un modèle keras avec plusieurs (8) neurones de sortie, qui passent tous par une fonction d'activation softmax. Mon ensemble de données, qui comprend environ 300 000 points de données, est toutefois largement rempli de données pour lesquelles le fait d'avoir le premier neurone de sortie à 1 et tous les autres à 0 permet au réseau neuronal d'obtenir une précision élevée. Lorsque j'adapte mon modèle à l'ensemble de données, je reste bloqué à une perte de 0,3 (en utilisant l'erreur quadratique moyenne) et je me retrouve avec un mauvais réseau neuronal, qui ne fonctionne pas bien sur les nouvelles données.

Je voudrais pondérer l'erreur de chaque neurone de façon très élevée, sauf pour celui qui permet au réseau d'obtenir une grande précision. En python/pseudo code, cela ressemblerait à ce qui suit, où y_true y y_pred peuvent être des listes ou des tableaux numpy :

def some_error_function(...):
    # something like mean_squared_error()

def weighted_loss(y_true, y_pred):

    # Regular loss value for the first output neuron
    loss = some_error_function(y_true[0], y_pred[0])

    # Loss multiplied by 100 for the other output neurons
    loss += some_error_function(y_true[1:], y_pred[1:]) * 100

Juste pour clarifier, some_error_function(...) peuvent prendre des valeurs individuelles en tant que paramètres ou listes, ainsi y_pred[1:] signifie passer une liste ou un tableau numpy de toutes les valeurs sauf la première.

Lors de la compilation de mon modèle, comment pourrais-je remplacer ma fonction de perte actuelle par une fonction de perte pondérée comme celle ci-dessus ?

model.compile(optimizer=keras.optimizers.Adam(), loss=<current loss function>)

J'ai essayé de passer une fonction comme weighted_loss mais je n'étais pas sûr de pouvoir calculer une perte avec les données suivantes y_true y y_true car ils sont du type <class 'tensorflow.python.framework.ops.Tensor'> .

De plus, je ne sais pas exactement ce que je dois rendre. Lorsque j'ai renvoyé 0.0 comme test, j'ai reçu l'erreur suivante :

ValueError: No gradients provided for any variable: ['sequential/dense/kernel:0', 'sequential/dense/bias:0', 'sequential/dense_1/kernel:0', 'sequential/dense_1/bias:0', 'sequential/dense_2/kernel:0', 'sequential/dense_2/bias:0', 'sequential/dense_3/kernel:0', 'sequential/dense_3/bias:0'].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X