У меня есть файл JSON, который выглядит примерно так:

{
    "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)"
        }
    ]
}

Я хочу получить информацию о том, какой слой присутствует в файле JSON. Например, Conv2D, MaxPooling2D, Flatten () и т. Д.

Кроме того, я хочу знать значение строк, таких как фильтры, kernel_size, шага, активации и т. Д.

Я попытался получить имя слоя, выполнив это:

with open('model.json','r') as fb:
    con = json.load(fb)
con['layers'][0]['L1'].split('(', 1)[0].rstrip()

Вывод: 'Conv2d'. Точно так же я получил другие названия слоев.

Мне нужна помощь, чтобы получить значение фильтров (например, 64 в L1).

Я пытался сделать это:

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))']

Но все же я не понимаю ценность.

У кого-нибудь есть идеи, как получить эту информацию?

1
Ashutosh Mishra 28 Июн 2019 в 07:38

3 ответа

Лучший ответ

Использование регулярных выражений - документация для дальнейшего использования.

import re

string_lst = ['filters','kernel_size','stride','activation']
my_dict = {}
for key,value in con['layers'][0].items():
    my_dict[key] = {}
    layer_names = value.split('(')[0].rstrip()
    my_dict[key][layer_names] = {}
    for i in string_lst:
        match = re.search(i+'(.+?), ', value)
        if match:
            filters = match.group(1).split("=")[1].strip()
            my_dict[key][layer_names][i] = filters

    if len(my_dict[key][layer_names]) <= 0:
        del my_dict[key]

print(my_dict)

O / P :

{
    'L1': {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, '
    L2': {'MaxPooling2D': {'stride': '(2,2)'}}, 'L3': {'Conv2D': 
    {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L4': {'MaxPooling2D': {'stride': '(2,2)'}}, 'L5': 
    {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L6': {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L7': {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L8': {'MaxPooling2D': {'stride': '(2,2)'}}, 'L10': {'Dense': {'activation': "'softmax'"}}, 
    'L12': {'Dense': {'activation': "'softmax'"}}, 'L14': {'Dense': {'activation': "'softmax'"}}
}

JSON содержит повторяющиеся имена слоев, если вы хотите уникальные записи, тогда замените все строки

my_dict[key][layer_names]

< Сильный > TO

my_dict[layer_names]

И удалите эту my_dict[key] = {} строку

1
bharatk 28 Июн 2019 в 06:23

Я бы сделал это в два этапа. Сначала сделайте регулярное выражение для имени внешнего фильтра и содержимого

re.compile(r"^\s*([^(]*)\s*\((.*)\)\s*$")

Здесь есть две группы: name и содержимое, заключенное в круглые скобки (...)

Затем сделайте регулярное выражение для разделения на запятые, которые не заключены в скобки. Подробное объяснение можно найти здесь.

re.compile(r',\s*(?![^()]*\))')

Демо-версия :

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)

Печать :

Conv2D
['filters = 64', 'kernel_size=(2,2)', "padding='same"]
1
flakes 28 Июн 2019 в 05:09

ОБНОВЛЕНИЕ: Используя регулярное выражение, вы можете извлечь ключевые аргументы. Затем разделите на '=', чтобы найти значение каждого ключевого аргумента для каждого слоя.

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
Wytamma Wirth 28 Июн 2019 в 05:11