Par exemple, si je charge le modèle de quelqu'un d'autre, voici ce que je vois:

enter image description here

Je veux obtenir la représentation de code de ceci, par exemple:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
... etc

Je ne dis pas que ce qui précède est correct, mais je veux savoir s'il existe un moyen pour moi de reconstruire physiquement le modèle en code, y compris toutes les fonctions d'activation?

Je suppose que je peux lire le résumé, mais je ne sais pas si je pourrai en déterminer l'activation.

Comment ferait-on cela?

0
K Split X 26 août 2020 à 22:43

3 réponses

Meilleure réponse

Si vous avez un modèle enregistré avec une architecture complète avec ses états d'entraînement. c'est à dire que vous avez utilisé quelque chose comme ça.

model.save('myfirstmodel.h5')

Vous pouvez utiliser

pprint(model.to_json())
pprint(model.to_yaml())

Sortie pour json:

('{"class_name": "Sequential", "config": {"name": "sequential", "layers": '
 '[{"class_name": "InputLayer", "config": {"batch_input_shape": [null, 13], '
 '"dtype": "float32", "sparse": false, "ragged": false, "name": "d1_input"}}, '
 '{"class_name": "Dense", "config": {"name": "d1", "trainable": true, '
 '"batch_input_shape": [null, 13], "dtype": "float32", "units": 4, '
 '"activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": '
 '"Ones", "config": {}}, "bias_initializer": {"class_name": "Zeros", "config": '
 '{}}, "kernel_regularizer": null, "bias_regularizer": null, '
 '"activity_regularizer": null, "kernel_constraint": null, "bias_constraint": '
 'null}}, {"class_name": "Dense", "config": {"name": "d2", "trainable": true, '
 '"dtype": "float32", "units": 6, "activation": "relu", "use_bias": true, '
 '"kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": '
 'null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, '
 '"kernel_regularizer": null, "bias_regularizer": null, '
 '"activity_regularizer": null, "kernel_constraint": null, "bias_constraint": '
 'null}}, {"class_name": "Dropout", "config": {"name": "dropout", "trainable": '
 'true, "dtype": "float32", "rate": 0.2, "noise_shape": null, "seed": null}}, '
 '{"class_name": "Dense", "config": {"name": "out", "trainable": true, '
 '"dtype": "float32", "units": 2, "activation": "sigmoid", "use_bias": true, '
 '"kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": '
 'null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, '
 '"kernel_regularizer": null, "bias_regularizer": null, '
 '"activity_regularizer": null, "kernel_constraint": null, "bias_constraint": '
 'null}}]}, "keras_version": "2.4.0", "backend": "tensorflow"}')

Cependant, si vous avez un modèle figé dans lequel vos moyens normaux ne fonctionnent pas, vous pouvez jeter un oeil à la structure du modèle en utilisant netron. Il montre l'architecture par couches ainsi que les fonctions d'activation utilisées, les paramètres ainsi que leurs poids. Vous pouvez télécharger ces pondérations sous forme de tableaux NumPy.

Vous pouvez utiliser Netron pour trouver l'architecture du modèle ainsi que les poids. En utilisant ces informations structurelles, vous pouvez reconstruire votre modèle.

Voir Lien.

Vous obtenez une sortie comme celle-ci: Mon modèle

3
Aniket Bote 26 août 2020 à 20:05

La réponse est NON . Il n'y a aucun moyen dans tf ou Keras d'obtenir une représentation de code à partir d'un fichier de modèle ou de YAML ou JSON. Mais oui, vous pouvez écrire un morceau de code qui fera ce travail. Cela devrait être assez simple. Si vous enregistrez votre modèle comme suit:

model.to_yaml()

Il enregistre la configuration de votre modèle ainsi que les fonctions d'activation. Tout ce dont vous avez besoin pour parcourir les couches une par une et ajouter la représentation de code de la couche. Mais la fonction de perte peut être un problème pour vous.

Btw, si vous souhaitez recycler le modèle enregistré, vous n'avez pas besoin de la structure de code. Tout ce que vous pouvez, c'est simplement charger et former. Ne congelez aucune couche. Il recyclera et mettra à jour tous les poids de chemin.

0
Nazmul Hasan 27 août 2020 à 01:38

Vous pouvez utiliser model.get_config() pour obtenir un dict de toutes les informations dont vous avez besoin pour ré-instancier un modèle identique (du moins en théorie, car cela dépend de chaque couche du modèle ayant un {{X2 }} elle-même, ce qui n'a pas toujours été le cas dans le passé).

Si votre modèle importé se comporte correctement, vous pourrez peut-être même créer un modèle clone simplement en faisant

new_model = tf.keras.Model.from_config(model.get_config())

Cela ne fonctionnera pas toujours, donc en général, vous pouvez simplement commencer par model.get_config() pour inspecter les détails d'un modèle.

1
Artem Mavrin 26 août 2020 à 19:53