【问题标题】:neural network summary to dataframe神经网络摘要到数据框
【发布时间】:2020-09-11 08:02:40
【问题描述】:

我们可以通过

访问神经网络的摘要
model.summary()

但是有什么办法可以把这个结果转换成dataframe,这样我们就可以比较不同模型的特征了?

【问题讨论】:

标签: dataframe tensorflow keras neural-network


【解决方案1】:

是的,您可以通过使用 print_fn 参数将输出保存到字符串然后将其解析为 DataFrame 来实现:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import re
import pandas as pd

model = Sequential()
model.add(Dense(2, input_dim=1, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

stringlist = []
model.summary(print_fn=lambda x: stringlist.append(x))
summ_string = "\n".join(stringlist)
print(summ_string) # entire summary in a variable

table = stringlist[1:-4][1::2] # take every other element and remove appendix

new_table = []
for entry in table:
    entry = re.split(r'\s{2,}', entry)[:-1] # remove whitespace
    new_table.append(entry)

df = pd.DataFrame(new_table[1:], columns=new_table[0])
print(df.head())

输出:

      Layer (type) Output Shape Param #
0    dense (Dense)    (None, 2)       4
1  dense_1 (Dense)    (None, 1)       3

【讨论】:

  • 这是一个非常棒的sn-p!感谢您的帮助!
【解决方案2】:

我接受了@runDOSrun 的回答并对其进行了一些调整以使其更全面,因为它在您有多个连接的情况下无法正常工作。

import pandas as pd
import re
from tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2

def clean(x):
    return x.replace('[0][0]','').replace('(','').replace(')','').replace('[','').replace(']','')

def magic(x):
    tmp = re.split(r'\s{1,}',clean(x))
    return tmp

input_shape = (540,960,3)
model = InceptionResNetV2(input_shape)

width = 250
stringlist = []
model.summary(width, print_fn=lambda x: stringlist.append(x))
summ_string = "".join(stringlist)
splitstr1 = f"={{{width}}}"
splitstr2 = f"_{{{width}}}"
tmptable = re.split(splitstr1,summ_string)
header = re.split(splitstr2, tmptable[0])
header = re.split(r'\s{2,}', header[1])[:-1]
table = re.split(splitstr2, tmptable[1])

df = pd.DataFrame(columns=header)
for index,entry in enumerate(table):
    entry = re.split(r'\s{2,}', entry)[:-1]
    df.loc[index] = {header[0] : entry[0],
                     header[1] : tuple([int(e) for e in clean(entry[1]).split(', ')[1:]]),
                     header[2] : int(entry[2]),
                     header[3] : [clean(e) for e in entry[3:]]}
df['layername'],df['type'] = zip(*df['Layer (type)'].map(magic))
df['kernels'] = [e[-1:][0] for e in df['Output Shape']]

给出以下示例输出:

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2013-06-06
    • 2014-10-03
    • 2020-05-10
    • 2014-01-15
    相关资源
    最近更新 更多