1
votes

Obtenir la valeur des sous-chaînes après le fractionnement

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?


2 commentaires

et si une chaîne ne contient pas de filtres.


Ensuite, il devrait renvoyer 0


3 Réponses :


1
votes

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)


1 commentaires

Cela donne IndexError: index de liste hors de portée



1
votes

Utilisation d'expressions régulières - documentation pour plus d'informations

my_dict[layer_names]


3 commentaires

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.



1
votes

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*$")


0 commentaires