2017-01-16 1 views
5

dans keras, je veux personnaliser ma fonction de perte qui prend non seulement (y_true, y_pred) comme entrée mais aussi besoin d'utiliser la sortie de la couche interne du réseau comme l'étiquette pour une couche de sortie.Cette image montre le Network LayoutKeras Implémentation de la fonction de perte personnalisée qui nécessite une sortie de couche interne comme étiquette

Ici, la sortie interne est xn, qui est un vecteur de fonction 1D. dans le coin supérieur droit, la sortie est xn ', qui est la prédiction de xn. En d'autres termes, xn est l'étiquette de xn '.

Alors que [Ax, Ay] est traditionnellement connu comme y_true, et [Ax ', Ay'] est y_pred.

Je veux combiner ces deux composants de perte en un et former le réseau conjointement.

Toutes les idées ou pensées sont très appréciées!

Répondre

0

Tout d'abord vous devriez utiliser le Functional API. Ensuite, vous devez définir la sortie réseau comme sortie plus le résultat de la couche interne, les fusionner en une seule sortie (en concaténant), puis créer une fonction de perte personnalisée qui divise ensuite la sortie fusionnée en deux parties et effectue les calculs de perte seul.

Quelque chose comme:

def customLoss(y_true, y_pred): 
    #loss here 
    internalLayer = Convolution2D()(inputs) #or other layers 
    internalModel = Model(input=inputs, output=internalLayer) 
    tmpOut = Dense(...)(internalModel) 
    mergedOut = merge([tmpOut, mergedOut], mode = "concat", axis = -1) 
    fullModel = Model(input=inputs, output=mergedOut) 

    fullModel.compile(loss = customLoss, optimizer = "whatever") 
+0

Merci pour votre réponse! Je pense que ma principale préoccupation est de savoir comment former ma fonction de perte. Oui, nous pouvons combiner les deux sorties en une, mais lors du calcul de la perte pour la sortie interne (xn '), le customLoss doit avoir accès au modèle lui-même afin d'obtenir l'étiquette pour la sortie interne (xn). xn n'est pas les données d'apprentissage mais une certaine transformation des données d'apprentissage traitées par le modèle. – ljklonepiece

+0

@LiJuekun ne pouvez-vous pas simplement mettre le "label interne" dans la valeur y que vous passez pour s'adapter? –

7

J'ai trouvé un moyen de sortir, au cas où quelqu'un cherche même, j'ai posté ici (basé sur le réseau donné dans ce post):

Le L'idée est de définir la fonction de perte personnalisée et de l'utiliser comme sortie du réseau. (Notation: A est le véritable label de la variable A et A' est la valeur prédite de la variable A)

def customized_loss(args): 
    #A is from the training data 
    #S is the internal state 
    A, A', S, S' = args 
    #customize your own loss components 
    loss1 = K.mean(K.square(A - A'), axis=-1) 
    loss2 = K.mean(K.square(S - S'), axis=-1) 
    #adjust the weight between loss components 
    return 0.5 * loss1 + 0.5 * loss2 

def model(): 
    #define other inputs 
    A = Input(...) # define input A 
    #construct your model 
    cnn_model = Sequential() 
    ... 
    # get true internal state 
    S = cnn_model(prev_layer_output0) 
    # get predicted internal state output 
    S' = Dense(...)(prev_layer_output1) 
    # get predicted A output 
    A' = Dense(...)(prev_layer_output2) 
    # customized loss function 
    loss_out = Lambda(customized_loss, output_shape=(1,), name='joint_loss')([A, A', S, S']) 
    model = Model(input=[...], output=[loss_out]) 
    return model 

    def train(): 
     m = model() 
     opt = 'adam' 
     model.compile(loss={'joint_loss': lambda y_true, y_pred:y_pred}, optimizer = opt) 
     # train the model 
     .... 
+0

Je sais que cela a été calme pendant un moment maintenant, mais pouvez-vous expliquer ce que A et A 'sont? A 'est la prédiction de A n'est-ce pas? A devrait être le résultat attendu réel, alors pourquoi est-il défini comme une entrée au lieu d'un tableau numpy qui prend des valeurs? – tryingtolearn