0

Je veux ajouter de nouveaux noeuds à la couche de sortie pour former plus tard, je fais:Ajout de nouveaux noeuds à la couche de sortie Keras

def add_outputs(self, n_new_outputs): 
    out = self.model.get_layer('fc8').output 
    last_layer = self.model.get_layer('fc7').output 
    out2 = Dense(n_new_outputs, activation='softmax', name='fc9')(last_layer) 
    output = merge([out, out2], mode='concat') 
    self.model = Model(input=self.model.input, output=output) 

'fc7' est la couche entièrement connecté avant que la couche de sortie 'fc8' . Je m'efforce d'avoir juste la dernière couche avec out = self.model.get_layer('fc8').output mais la sortie est tout le modèle. Y a-t-il un moyen de prendre seulement une couche à partir d'un réseau? Peut-être theres autre moyen plus facile de le faire ....

Merci!

Répondre

0

Enfin je trouve une solution:

1) obtenir les poids de la dernière couche

2) ajouter des zéros aux poids et initialiser au hasard ses connexions

3) pop la couche de sortie et créer un nouveau

4) Ensemble de nouveaux poids pour la nouvelle couche

ici le code:

def add_outputs(self, n_new_outputs): 
     #Increment the number of outputs 
     self.n_outputs += n_new_outputs 
     weights = self.model.get_layer('fc8').get_weights() 
     #Adding new weights, weights will be 0 and the connections random 
     shape = weights[0].shape[0] 
     weights[1] = np.concatenate((weights[1], np.zeros(n_new_outputs)), axis=0) 
     weights[0] = np.concatenate((weights[0], -0.0001 * np.random.random_sample((shape, n_new_outputs)) + 0.0001), axis=1) 
     #Deleting the old output layer 
     self.model.layers.pop() 
     last_layer = self.model.get_layer('batchnormalization_1').output 
     #New output layer 
     out = Dense(self.n_outputs, activation='softmax', name='fc8')(last_layer) 
     self.model = Model(input=self.model.input, output=out) 
     #set weights to the layer 
     self.model.get_layer('fc8').set_weights(weights) 
     print(weights[0])