如何在 Tensorflow-2.0 中绘制 tf.keras 模型?

     2023-02-16     151

关键词:

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

我升级到 Tensorflow 2.0,没有tf.summary.FileWriter("tf_graphs", sess.graph)。我正在查看有关此问题的其他一些 *** 问题,他们说使用tf.compat.v1.summary etc。在 Tensorflow 版本 2 中肯定有一种方法可以绘制和可视化 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

这里也是图形可视化

【讨论】:

another example Plot Model Architecture - General Discussion - TensorFlow Forum discuss.tensorflow.org/t/plot-model-architecture/3700

如何在 Google Colab 中使用 TensorFlow 2.0 将 tf.Keras 模型转换为 TPU?

】如何在GoogleColab中使用TensorFlow2.0将tf.Keras模型转换为TPU?【英文标题】:Howtoconverttf.KerasmodeltoTPUusingTensorFlow2.0inGoogleColab?【发布时间】:2019-08-2717:46:41【问题描述】:由于TF2.0没有tf.contrib层,我如何转换我的模型以在TPU上运行... 查看详情

如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?

】如何在Tensorflow2.0+Keras中进行并行GPU推理?【英文标题】:HowtodoparallelGPUinferencinginTensorflow2.0+Keras?【发布时间】:2020-03-1523:49:56【问题描述】:让我们从我刚开始接触TensorFlow和一般深度学习的前提开始。我有使用tf.Model.train()、... 查看详情

建议在 tensorflow 2.0 中调试 `tf.data.Dataset` 操作

】建议在tensorflow2.0中调试`tf.data.Dataset`操作【英文标题】:advisefordebugging`tf.data.Dataset`operationsintensorflow2.0【发布时间】:2019-10-0301:22:25【问题描述】:对于tf数据集,Panda的df.head()相当于什么?按照文档here,我构建了以下玩具示... 查看详情

TensorFlow 2.0:你需要在每个函数之上添加一个 @tf.function 装饰器吗?

】TensorFlow2.0:你需要在每个函数之上添加一个@tf.function装饰器吗?【英文标题】:TensorFlow2.0:doyouneeda@tf.functiondecoratorontopofeachfunction?【发布时间】:2019-08-0413:14:00【问题描述】:在TensorFlow2.0(目前仍为alpha版本)中,我知道您可... 查看详情

在 TensorFlow 2.0 中实现自定义损失函数

】在TensorFlow2.0中实现自定义损失函数【英文标题】:ImplementcustomlossfunctioninTensorflow2.0【发布时间】:2019-12-1606:06:29【问题描述】:我正在构建时间序列分类模型。数据非常不平衡,所以我决定使用加权交叉熵函数作为我的损失... 查看详情

TensorFlow Hub 模块可以在 TensorFlow 2.0 中使用吗?

】TensorFlowHub模块可以在TensorFlow2.0中使用吗?【英文标题】:CanaTensorFlowHubmodulebeusedinTensorFlow2.0?【发布时间】:2019-08-3006:58:31【问题描述】:我尝试在TensorFlow2.0(alpha)中运行此代码:importtensorflow_hubashub@tf.functiondefelmo(texts):elmo_modul... 查看详情

TensorFlow 2.0 语法变更

】TensorFlow2.0语法变更【英文标题】:Tensorflow2.0syntaxchange【发布时间】:2021-10-2901:42:26【问题描述】:我想运行以下几行代码,它是基于tensorflow1.0语法编写的:importtensorflowastfa=tf.constant(5)b=tf.constant(2)c=tf.constant(3)d=tf.multiply(a,b)e=tf... 查看详情

在 Tensorflow 2.0 中使用 GradientTape() 和 jacobian() 时出错

】在Tensorflow2.0中使用GradientTape()和jacobian()时出错【英文标题】:ErrorwhenworkingwithGradientTape()andjacobian()inTensorflow2.0【发布时间】:2020-04-2223:49:17【问题描述】:我正在使用Python中的Tensorflow2.0中的GradientTape()和jacobian()。这段代码执... 查看详情

为啥 Keras (Tensorflow 2.0) 模型在绘制时不包含矩阵乘法的变量?

】为啥Keras(Tensorflow2.0)模型在绘制时不包含矩阵乘法的变量?【英文标题】:WhydoestheKeras(Tensorflow2.0)modeldoesnotincludethevariablesofmatrixmultiplication,whenplotted?为什么Keras(Tensorflow2.0)模型在绘制时不包含矩阵乘法的变量?【发布时间】:20... 查看详情

“tensorflow”没有属性“会话”-TensorFlow 2.0

】“tensorflow”没有属性“会话”-TensorFlow2.0【英文标题】:\'tensorflow\'hasnoattribute\'Session\'-TensorFlow2.0【发布时间】:2020-04-0717:36:26【问题描述】:我遇到了Session模块的问题。importtensorflowastfn1=tf.constant(3.0)n2=tf.constant(4.0)print(n1)sess=... 查看详情

在 Tensorflow 2.0 中使用自定义层时,渐变返回 None

】在Tensorflow2.0中使用自定义层时,渐变返回None【英文标题】:WhenusecustomlayerinTensorflow2.0,thegradientreturnsNone【发布时间】:2022-01-1812:38:01【问题描述】:我设计了一个自定义层,像这样使用:classSquaredWeightedLayer(tf.keras.layers.Layer):d... 查看详情

如何在 tfds.load() 之后在 TensorFlow 2.0 中应用数据增强

】如何在tfds.load()之后在TensorFlow2.0中应用数据增强【英文标题】:HowtoapplydataaugmentationinTensorFlow2.0aftertfds.load()【发布时间】:2019-08-0401:58:15【问题描述】:我正在关注thisguide。它展示了如何使用tfds.load()方法从新的TensorFlow数据集... 查看详情

Tensorflow 2.0:自定义 keras 指标导致 tf.function 回溯警告

】Tensorflow2.0:自定义keras指标导致tf.function回溯警告【英文标题】:Tensorflow2.0:customkerasmetriccausedtf.functionretracingwarning【发布时间】:2020-03-0721:27:51【问题描述】:当我使用以下自定义指标(keras样式)时:fromsklearn.metricsimportclassi... 查看详情

如何在 tensorflow 2.0 w/keras 中保存/恢复大型模型?

】如何在tensorflow2.0w/keras中保存/恢复大型模型?【英文标题】:Howtosave/restorelargemodelintensorflow2.0w/keras?【发布时间】:2019-09-1823:12:09【问题描述】:我有一个使用新的tensorflow2.0和混合keras和tensorflow制作的大型自定义模型。我想保... 查看详情

如何在 tensorflow 2.0 中更改用于训练和评估的图像数量?

】如何在tensorflow2.0中更改用于训练和评估的图像数量?【英文标题】:Howtochangethenumberofimagestousefortrainingandevaluatingintensorflow2.0?【发布时间】:2019-09-1713:35:32【问题描述】:Fashion-MNIST数据集自动返回60,000张图像用于训练和10,000张... 查看详情

如何在 TensorFlow 2.0 中使用 Dataset.window() 方法创建的窗口?

】如何在TensorFlow2.0中使用Dataset.window()方法创建的窗口?【英文标题】:HowtousewindowscreatedbytheDataset.window()methodinTensorFlow2.0?【发布时间】:2019-08-2102:17:54【问题描述】:我正在尝试使用TensorFlow2.0创建一个数据集,该数据集将返回... 查看详情

如何在 Tensorflow 2.0 中使用 K.get_session 或如何迁移它?

】如何在Tensorflow2.0中使用K.get_session或如何迁移它?【英文标题】:HowtouseK.get_sessioninTensorflow2.0orhowtomigrateit?【发布时间】:2020-02-0322:31:35【问题描述】:def__init__(self,**kwargs):self.__dict__.update(self._defaults)#setupdefaultvaluesself._ 查看详情

如何在 python 中使用 tf-idf svm sklearn 绘制文本分类

】如何在python中使用tf-idfsvmsklearn绘制文本分类【英文标题】:Howtoplotthetextclassificationusingtf-idfsvmsklearninpython【发布时间】:2018-10-2409:14:34【问题描述】:我已经按照thistutorial的教程使用tf-idf和SVM实现了文本分类分类工作正常。现... 查看详情