2017-10-20 23 views
1

Lorsque j'initialise et charge des poids sur un modèle, j'obtiens une précision de 67% pour la sortie.Keras layer.set_weights ne modifie pas la couche. Pourquoi?

model.load_weights(path+'results/finetune_train_last_layer.h5') 
batches = model.get_batches(path, shuffle=False, batch_size=128, class_mode=None) 
preds = model.predict_generator(batches, batches.nb_sample) 
matches = 0 
for guess, ans in zip(np.argmax(preds, axis=1), batches.classes): 
    if guess == ans: 
     matches += 1 
print('%s/%s' % (matches, len(batches.classes))) 

532/792 

Les couches sont correctement chargées. C'est la même précision que j'ai obtenue lors de mon dernier entraînement pour ces poids avant que je les sauve.

Cependant, lorsque j'essaie de créer un nouveau modèle avec des couches identiques aux dernières couches de model et de copier les poids, ils n'ont pas les mêmes poids. Comment est-ce possible?

no_drop_model = Sequential([ 
    MaxPooling2D(input_shape=(512, 14, 14)), 
    Flatten(), 
    Dense(4096, activation='relu'), 
    Dropout(0.), 
    Dense(4096, activation='relu'), 
    Dropout(0.), 
    Dense(120, activation='softmax') 
]) 
for ndl, fcl in zip(no_drop_model.layers, model.layers[31:]): 
    print(type(ndl), type(fcl)) 
    ndl.set_weights(fcl.get_weights()) 
    if ndl.get_weights(): 
     print(np.array_equiv(ndl.get_weights(), fcl.get_weights())) 

Sortie:

(<class 'keras.layers.pooling.MaxPooling2D'>, <class 'keras.layers.pooling.MaxPooling2D'>) 
(<class 'keras.layers.core.Flatten'>, <class 'keras.layers.core.Flatten'>) 
(<class 'keras.layers.core.Dense'>, <class 'keras.layers.core.Dense'>) 
False 
(<class 'keras.layers.core.Dropout'>, <class 'keras.layers.core.Dropout'>) 
(<class 'keras.layers.core.Dense'>, <class 'keras.layers.core.Dense'>) 
False 
(<class 'keras.layers.core.Dropout'>, <class 'keras.layers.core.Dropout'>) 
(<class 'keras.layers.core.Dense'>, <class 'keras.layers.core.Dense'>) 
False 

Répondre

0

La valeur de retour de model.get_weights() est une liste de tableaux numpy pas un seul de tableau. Vous devriez comparer les poids comme ceci:

def create_model(): 
    i = Input((2,)) 
    o = Dense(3)(i) 
    return Model(i, o) 

model1 = create_model() 
model2 = create_model() 

for w1, w2 in zip(model1.get_weights(), model2.get_weights()): 
    print(np.array_equiv(w1, w2)) 

model2.set_weights(model1.get_weights()) 
print 'Weights after:' 
for w1, w2 in zip(model1.get_weights(), model2.get_weights()): 
    print(np.array_equiv(w1, w2)) 

Cela produira la sortie suivante:

False 
True 
Weights after: 
True 
True 

Le deuxième élément de la liste de poids correspond à des valeurs de polarisation qui sont initialisés à zéro, de sorte que les valeurs sont le même avant de copier les poids.

+0

Nice! Beaucoup plus propre à le faire de cette façon aussi. Merci pour la réponse. –

+0

Veuillez accepter la réponse. –