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
Nice! Beaucoup plus propre à le faire de cette façon aussi. Merci pour la réponse. –
Veuillez accepter la réponse. –