Keras 模型如何可视化

我用 tf.keras 定义了一些模型,但是貌似没办法直接转换成 Tensorboard 支持的格式?

tf.GraphDef () 拿到的是空
keras.utils.plot_model 也报错: Model object has no attribute _container_nodes

请问有没有好的办法可以作 keras model 可视化?

代码如下:

import tensorflow as tf
import tf.keras

model = keras.Sequential ()
model.add (keras.layers.LSTM (3, input_shape=(2,1))
model.add (keras.layers.Dense (1))

for node in tf.GraphDef ().node:
    if node:
        print (node.op)  # 什么都看不到

# 报错
keras.utils.plot_model (model, to_file='model.png')

发帖人:舟 3332,时间: 2018-4-20 14:47:25

我不确定你是怎么用 tf.keras 定义模型的,你的代码貌似有些问题。如果你是想用 TensorBoard 看 Keras 模型,可以用 keras.callbacks.TensorBoard。以 Keras 教程里的简单模型为例:

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import TensorBoard

model = Sequential ()
model.add (Dense (32, activation='relu', input_dim=100))
model.add (Dense (1, activation='sigmoid'))
model.compile (optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
tbcb = TensorBoard (log_dir='.')

# Generate dummy data
import numpy as np
data = np.random.random ((1000, 100))
labels = np.random.randint (2, size=(1000, 1))

# Train the model, iterating on the data in batches of 32 samples
model.fit (data, labels, epochs=10, batch_size=32, callbacks=[tbcb])

数据记录在了当前工作文件夹下("."),用 tensorboard --logdir=.即可看到计算图和相关记录。


yunhai_luo,发表于 2018-4-20 15:15:10

感谢大神指点。

我现在可以在 TensorBoard 里面看到模型了。但是还是不是特别理解为什么 tf.GraphDef ().node 拿到的东西是空的。以及 keras.utils.plot_model (model, to_file='model.png') 会报错

另外我用的是 tf.keras 也就是
import tensorflow.python.keras


舟 3332(提问者),发表于 2018-4-20 19:43:59

我还真不知道 tensorflow 里有 keras 可以这样用,不好意思。你看,我这根本不是大神啊


yunhai_luo,2018-4-21 03:35

TF 这么多方法没有人能都知道呢~ 一起进步~


舟 3332,2018-4-21 07:27

tf.GraphDef () 是实例化一个新的 GraphDef 对象,跟你的计算图没有任何关系,自然是空的。如果你想输出所有节点的操作,应该从你当前的计算图入手:

import tensorflow as tf

model = tf.keras.Sequential ()
model.add (tf.keras.layers.LSTM (3, input_shape=(2,1)))
model.add (tf.keras.layers.Dense (1))

for node in tf.get_default_graph ().as_graph_def ().node:
    print (node.op)

至于 keras.utils.plot_model (model, to_file=‘model.png’) 报错,你应该把错误内容放上来。我估计你的错误是:

---------------------------------------------------------------------------
AttributeError  Traceback (most recent call last)
<ipython-input-1-f126cbd05746> in <module>()
      9 
     10 # 报错
---> 11 keras.utils.plot_model (model, to_file='model.png')

E:\Anaconda3\envs\tf\lib\site-packages\tensorflow\python\keras\_impl\keras\utils\vis_utils.py in plot_model (model, to_file, show_shapes, show_layer_names, rankdir)
    147           'LR' creates a horizontal plot.
    148   """
--> 149   dot = model_to_dot (model, show_shapes, show_layer_names, rankdir)
    150   _, extension = os.path.splitext (to_file)
    151   if not extension:

E:\Anaconda3\envs\tf\lib\site-packages\tensorflow\python\keras\_impl\keras\utils\vis_utils.py in model_to_dot (model, show_shapes, show_layer_names, rankdir)
    121     for i, node in enumerate (layer._inbound_nodes):
    122       node_key = layer.name + '_ib-' + str (i)
--> 123       if node_key in model._container_nodes:
    124         for inbound_layer in node.inbound_layers:
    125           inbound_layer_id = str (id (inbound_layer))

AttributeError: 'Model' object has no attribute '_container_nodes'

如果是这样,那么这是 bug,Github 上提到过


yunhai_luo,发表于 2018-4-21 03:32:32

需要指定 tensorboard --logdir=.来确定输出目录,查看 log 和图


neverchange,发表于 2018-7-4 16:04:27