【问题标题】:How to graph tf.keras model in Tensorflow-2.0?如何在 Tensorflow-2.0 中绘制 tf.keras 模型?
【发布时间】:2019-11-03 12:24:22
【问题描述】:

我升级到 Tensorflow 2.0,没有tf.summary.FileWriter("tf_graphs", sess.graph)。我正在查看有关此问题的其他一些 StackOverflow 问题,他们说使用tf.compat.v1.summary etc。在 Tensorflow 版本 2 中肯定有一种方法可以绘制和可视化 tf.keras 模型。它是什么?我正在寻找像下面这样的张量板输出。谢谢!

【问题讨论】:

    标签: python-3.x tensorflow tensorboard tensorflow2.0 tf.keras


    【解决方案1】:

    您可以可视化任何tf.function 修饰函数的图形,但首先,您必须跟踪其执行情况。

    可视化 Keras 模型的图形意味着可视化它的 call 方法。

    默认情况下,此方法没有tf.function 修饰,因此您必须将模型调用包装在正确修饰的函数中并执行它。

    import tensorflow as tf
    
    model = tf.keras.Sequential(
        [
            tf.keras.layers.Flatten(input_shape=(28, 28)),
            tf.keras.layers.Dense(32, activation="relu"),
            tf.keras.layers.Dropout(0.2),
            tf.keras.layers.Dense(10, activation="softmax"),
        ]
    )
    
    
    @tf.function
    def traceme(x):
        return model(x)
    
    
    logdir = "log"
    writer = tf.summary.create_file_writer(logdir)
    tf.summary.trace_on(graph=True, profiler=True)
    # Forward pass
    traceme(tf.zeros((1, 28, 28, 1)))
    with writer.as_default():
        tf.summary.trace_export(name="model_trace", step=0, profiler_outdir=logdir)
    

    【讨论】:

    • 这是一个很好的答案,谢谢!但是,我仍然无法访问 TensorBoard 中的运行信息。是的,探查器设置为 true。有什么想法吗?
    • 分析本身。 Tensorboard 不显示任何运行时信息,例如我图表中节点的执行时间或内存消耗。如果它显示给你,可能对我来说还有另一个问题。
    • 我唯一的建议是阅读本指南 tensorflow.org/tensorboard/tensorboard_profiling_keras 并使用 Chromium/Chrome(是的,其他浏览器无法使用,因为配置文件使用了 chrome 的某些部分)
    • ProfilerNotRunningError: Cannot stop profiling. No profiler is running. 在 Windows 上。有什么帮助吗?
    • @Crispy13 将对tf.summary.trace_export 的调用封装在try: except: pass 中为我解决了这个问题,但不知道为什么
    【解决方案2】:

    根据docs,一旦您的模型经过训练,您就可以使用 Tensorboard 来可视化图表。

    首先,定义您的模型并运行它。然后,打开 Tensorboard 并切换到 Graph 选项卡。


    最小可编译示例

    此示例取自文档。首先,定义您的模型和数据。

    # Relevant imports.
    %load_ext tensorboard
    
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from datetime import datetime
    from packaging import version
    
    import tensorflow as tf
    from tensorflow import keras
    
    # Define the model.
    model = keras.models.Sequential([
        keras.layers.Flatten(input_shape=(28, 28)),
        keras.layers.Dense(32, activation='relu'),
        keras.layers.Dropout(0.2),
        keras.layers.Dense(10, activation='softmax')
    ])
    
    model.compile(
        optimizer='adam',
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'])
    
    (train_images, train_labels), _ = keras.datasets.fashion_mnist.load_data()
    train_images = train_images / 255.0
    

    接下来,训练您的模型。在这里,您需要为 Tensorboard 定义一个回调,以用于可视化统计数据和图表。

    # Define the Keras TensorBoard callback.
    logdir="logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
    tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
    
    # Train the model.
    model.fit(
        train_images,
        train_labels, 
        batch_size=64,
        epochs=5, 
        callbacks=[tensorboard_callback])
    

    训练结束后,在你的笔记本中运行

    %tensorboard --logdir logs
    

    并切换到导航栏中的 Graph 选项卡:

    你会看到一个看起来很像这样的图表:

    【讨论】:

    • 有没有办法在不先训练的情况下将其可视化?
    • @ColinSteidtmann 我已经查看了多个 GitHub 问题,并且共识似乎是,由于默认情况下启用了急切执行,因此目前不支持 keras 模型。
    • 该死的,感谢您的查找。我知道它仍处于测试阶段,所以我会耐心等待。
    • 这并不完全正确,您可以转换为图形并可视化模型而无需对其进行训练。看我的回答
    • 是的,没错。执行模型是必需的,因为图形是通过跟踪执行来构建的,但不需要训练模型,您可以使用 tf.function 并运行前向传递(如果您只想查看该部分,并且不是训练循环图)
    【解决方案3】:

    这是目前对我有用的东西 (TF 2.0.0),基于 tf.keras.callbacks.TensorBoard 代码:

    # After model has been compiled
    from tensorflow.python.ops import summary_ops_v2
    from tensorflow.python.keras.backend import get_graph
    tb_path = '/tmp/tensorboard/'
    tb_writer = tf.summary.create_file_writer(tb_path)
    with tb_writer.as_default():
        if not model.run_eagerly:
            summary_ops_v2.graph(get_graph(), step=0)
    

    【讨论】:

    • 什么是tb_writer
    • 一个 tf.summary.SummaryWriter 对象。编辑代码来定义它
    【解决方案4】:

    另一个选择是使用这个网站:https://lutzroeder.github.io/netron/

    使用 .h5 或 .tflite 文件生成图表。

    它所基于的 github repo 可以在这里找到: https://github.com/lutzroeder/netron

    【讨论】:

      【解决方案5】:

      这是 tf2.x 的解决方案,Graph visualization of subclassed model/layer

      import tensorflow as tf
      print("TensorFlow version:", tf.__version__)
      
      from tensorflow.keras.layers import Dense, Flatten, Conv2D
      from tensorflow.keras import Model,Input
      
      
      class MyModel(Model):
          def __init__(self, dim):
              super(MyModel, self).__init__()
              self.conv1 = Conv2D(16, 3, activation='relu')
              self.conv2 = Conv2D(32, 3, activation='relu')
              self.conv3 = Conv2D(8, 3, activation='relu')
              self.flatten = Flatten()
              self.d1 = Dense(128, activation='relu')
              self.d2 = Dense(1)
      
          def call(self, x):
              x = self.conv1(x)
              x = self.conv2(x)
              x = self.conv3(x)
              x = self.flatten(x)
              x = self.d1(x)
              return self.d2(x)
          def build_graph(self):
              x = Input(shape=(dim))
              return Model(inputs=[x], outputs=self.call(x))
      
      
      dim = (28, 28, 1)
      
      # Create an instance of the model
      model = MyModel((dim))
      model.build((None, *dim))
      model.build_graph().summary()
      
      
      tf.keras.utils.plot_model(model.build_graph(), to_file="model.png",
                 expand_nested=True, show_shapes=True)
      

      输出是

      TensorFlow version: 2.5.0
      
      Model: "model"
      _________________________________________________________________
      Layer (type)                 Output Shape              Param #   
      =================================================================
      input_1 (InputLayer)         [(None, 28, 28, 1)]       0         
      _________________________________________________________________
      conv2d (Conv2D)              (None, 26, 26, 16)        160       
      _________________________________________________________________
      conv2d_1 (Conv2D)            (None, 24, 24, 32)        4640      
      _________________________________________________________________
      conv2d_2 (Conv2D)            (None, 22, 22, 8)         2312      
      _________________________________________________________________
      flatten (Flatten)            (None, 3872)              0         
      _________________________________________________________________
      dense (Dense)                (None, 128)               495744    
      _________________________________________________________________
      dense_1 (Dense)              (None, 1)                 129       
      =================================================================
      Total params: 502,985
      Trainable params: 502,985
      Non-trainable params: 0
      

      这里也是图形可视化

      【讨论】:

      猜你喜欢
      • 2019-12-16
      • 2019-08-27
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      相关资源
      最近更新 更多