Python 获取拆分后的子字符串的值
我有一个json文件,看起来像这样:Python 获取拆分后的子字符串的值,python,regex,python-3.x,split,Python,Regex,Python 3.x,Split,我有一个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='zer
{
"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、flatte()等
另外,我想知道字符串的值,比如过滤器、内核大小、步幅、激活等
我尝试通过以下操作获取图层名称:
with open('model.json','r') as fb:
con = json.load(fb)
con['layers'][0]['L1'].split('(', 1)[0].rstrip()
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))']
输出为'Conv2d'
。类似地,我得到了其他图层名称
我需要的帮助是获取过滤器的值(如L1中的64)
我试着这样做:
with open('model.json','r') as fb:
con = json.load(fb)
con['layers'][0]['L1'].split('(', 1)[0].rstrip()
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))']
但我仍然没有得到价值
有人知道如何获取这些信息吗?更新:使用regex可以提取关键字参数。然后在“=”上拆分以查找每个层的每个关键字参数的值
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)
使用正则表达式-供进一步参考
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)
JSON包含重复的层名称,如果需要唯一的记录,请替换所有行
my_dict[key][layer_names]
至
my_dict[layer_names]
然后删除这个
my_dict[key]={}
行我将分两步完成。首先为外部筛选器名称和内容创建一个正则表达式
re.compile(r"^\s*([^(]*)\s*\((.*)\)\s*$")
这有两个组,名称
,以及括号中的内容(…)
然后生成一个正则表达式,在不在括号内的逗号上拆分。你可以看到一个深入的问题
演示:
印刷品:
Conv2D
['filters = 64', 'kernel_size=(2,2)', "padding='same"]
如果字符串不包含筛选器,则该字符串应返回0。当我搜索“激活”时,该字符串不返回字符串。它正在给IndexError:list索引超出范围。例如,在L1中,它应该返回'relu'。是的,它工作了,但现在在内核大小和步长等方面,整个元组都没有返回(例如(3,3))@AshutoshMishra更新了我的答案,现在试试。
Conv2D
['filters = 64', 'kernel_size=(2,2)', "padding='same"]