python - 拆分后获取子字符串的值
问题描述
我有一个看起来像这样的 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() 等。
另外,我想知道过滤器、内核大小、步幅、激活等字符串的值。
我尝试通过这样做来获取图层名称:
with open('model.json','r') as fb:
con = json.load(fb)
con['layers'][0]['L1'].split('(', 1)[0].rstrip()
输出是'Conv2d'
。同样,我得到了其他图层名称。
我需要帮助的是获取过滤器的值(例如 L1 中的 64)。
我试过这样做:
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))']
但我仍然没有得到价值。
有谁知道如何获取这些信息?
解决方案
更新:使用正则表达式,您可以提取关键字参数。然后拆分“=”以查找每个层的每个关键字参数的值。
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)
推荐阅读
- python - Python中的字符串相似性方法 - NGram?雅罗·温克勒?
- python - TypeError:预期的 str、字节或 os.PathLike 对象,而不是 GeojsonFile
- swift - 传递带有包装属性的对象不允许在(设置)上编译
- animation - TabView 的 SwiftUI 动画选项卡
- c - 关于 fscanf 的问题。两者哪个更好?
- javascript - 是否可以改变父母使用javascript?
- python-3.x - 带有字典的附加列表具有相同的值。美丽汤数据
- php - 连接三个表并在一个查询 SQL 中显示值
- javascript - XMLHttpRequest 加载 XML 文件的不良行为
- winapi - ChangeDisplaySettings 似乎只适用于主监视器(返回 DISP_CHANGE_BADMODE)