J'ai un fichier json qui ressemble à ceci:
c = con['layers'][0]['L1'].split('(', 1)[1].rstrip()
c.split(',')
['filters = 8', ' kernel_size=(3', '3)', ' strides=(1', ' 1)', " padding='valid'", " data_format='channels_last'", " activation='relu'", ' use_bias=True', " kernel_initializer='zeros'", " bias_initializer='zeros'", ' kernel_regularizer=regularizers.l1(0.)', ' bias_regularizer=regularizers.l1(0.)', ' activity_regularizer=regularizers.l2(0.)', ' kernel_constraint=max_norm(2.)', ' bias_constraint=max_norm(2.)', ' input_shape=(28', '28', '1))']
Je veux obtenir des informations sur la couche présente dans le fichier json. Exemple, Conv2D, MaxPooling2D, Flatten () etc.
De plus, je veux connaître la valeur des chaînes telles que filters, kernel_size, stride, activation etc.
J'ai essayé d'obtenir le nom de la couche en faisant ceci:
with open('model.json','r') as fb:
con = json.load(fb)
con['layers'][0]['L1'].split('(', 1)[0].rstrip()
La sortie est 'Conv2d' . De même, j'ai d'autres noms de calques.
Ce dont j'ai besoin d'aide, c'est d'obtenir la valeur des filtres (par exemple 64 en L1).
J'ai essayé de faire ceci:
{
"model": "Sequential",
"layers": [
{
"L1": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.), input_shape=(224,224,3))",
"L2": "MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same', data_format='channels_last')",
"L3": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
"L4": "MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same', data_format='channels_last')",
"L5": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
"L6": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
"L7": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
"L8": "MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same', data_format='channels_last')",
"L9": "Flatten()",
"L10": "Dense(4096, activation='softmax', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
"L11": "Dropout(0.4)",
"L12": "Dense(2048, activation='softmax', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
"L13": "Dropout(0.4)",
"L14": "Dense(1000, activation='softmax', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
"L15": "Dropout(0.4)"
}
]
}
Mais je n'obtiens toujours pas la valeur.
Quelqu'un sait-il comment obtenir ces informations?
3 Réponses :
MISE À JOUR: En utilisant regex, vous pouvez extraire les arguments du mot clé. Ensuite, divisez sur '=' pour trouver la valeur de chaque argument de mot-clé pour chaque couche.
import json
import re
with open('model.json','r') as fb:
con = json.load(fb)
for layer_key in con['layers'][0]:
print("Layer: {}".format(layer_key))
layer = con['layers'][0][layer_key]
layers_kwargs = re.sub('^(.*?)\(', '', layer)[:-1]
if not layers_kwargs:
print('No kwargs')
continue
for kwarg in layers_kwargs.split(', '):
kwarg = [i.strip() for i in kwarg.split('=')]
if len(kwarg) != 2:
print('No key', kwarg)
continue
k = kwarg[0]
v = kwarg[1]
print(k,v)
Cela donne IndexError: index de liste hors de portée
Utilisation d'expressions régulières - documentation pour plus d'informations
my_dict[layer_names]
Lorsque je recherche «activation», il ne renvoie pas la chaîne. Par exemple, en L1, il devrait renvoyer «relu».
Oui, cela a fonctionné, mais maintenant dans des choses comme la taille du noyau et la foulée, le tuple entier n'est pas retourné (par exemple (3,3))
@AshutoshMishra J'ai mis à jour ma réponse, essayez maintenant.
Je ferais cela en deux étapes. Commencez par créer une expression régulière pour le nom du filtre externe et le contenu
Conv2D ['filters = 64', 'kernel_size=(2,2)', "padding='same"]
Cela a deux groupes, le nom et le contenu entre parenthèses (.. .)
Ensuite, créez une regex à scinder sur des virgules qui ne sont pas entre parenthèses. Vous pouvez voir une explication détaillée ici
import re main_regex = re.compile(r"^\s*([^(]*)\s*\((.*)\)\s*$") split_regex = re.compile(r',\s*(?![^()]*\))') input = "Conv2D(filters = 64, kernel_size=(2,2), padding='same)" main_match = main_regex.match(input) print(main_match.group(1)) parts = split_regex.split(main_match.group(2)) print(parts)
Démo :
re.compile(r',\s*(?![^()]*\))')
Imprimés:
re.compile(r"^\s*([^(]*)\s*\((.*)\)\s*$")
et si une chaîne ne contient pas de filtres.
Ensuite, il devrait renvoyer 0