5

Keras可视化神经网络架构的四种方法

 1 year ago
source link: https://www.51cto.com/article/721775.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Keras可视化神经网络架构的四种方法

作者:Angel Das 2022-11-01 16:02:31

我们在使用卷积神经网络或递归神经网络或其他变体时,通常都希望对模型的架构可以进行可视化的查看,因为这样我们可以 在定义和训练多个模型时,比较不同的层以及它们放置的顺序对结果的影响。还有可以更好地理解模型结构、激活函数、模型参数形状(神经元数量)等

我们在使用卷积神经网络或递归神经网络或其他变体时,通常都希望对模型的架构可以进行可视化的查看,因为这样我们可以 在定义和训练多个模型时,比较不同的层以及它们放置的顺序对结果的影响。还有可以更好地理解模型结构、激活函数、模型参数形状(神经元数量)等。

图片

keras 中有一些现成的包可以创建我们的神经网络模型的可视化表示。前三个包可以在模型训练之前使用(只需要定义和编译模型);但是Tensor Boards 要求用户在架构可视化之前根据准确的数据训练模型。

在开始进行可视化之前,我们先需要安装相应的包:

pip install visualkeras
 pip install ann_visualizer
 pip install graphviz

然后我们创建一个模型,并用这4个包来进行可视化:

在实际使用时我们希望的是通过可视化来对比模型架构,所以这里定义三个具有不同超参数 CNN 模型。我们创建了用户定义的函数来分别构建具有不同数量的 CNN 层、池化层和最后的密集层的三个不同模型。

架构1:浅层CNN+分类头

 def construct_model():
    model = Sequential()
    model.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(128, 128, 1), activation=’relu’))
    model.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
    model.add(MaxPool2D((2, 2)))
    model.add(Flatten())
    model.add(Dense(256, activation=’relu’))model.add(Dense(12, activation=’softmax’))
    model.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
    return model

架构2:深层CNN+mlp分类头

 def sconstruct_model():
    smodel = Sequential()
    smodel.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(128, 128, 3), activation=’relu’))
    smodel.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
    smodel.add(MaxPool2D((2, 2)))
    smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
    smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
    smodel.add(MaxPool2D((2, 2)))
    smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
    smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
    smodel.add(MaxPool2D((2, 2)))
    smodel.add(Flatten())
    smodel.add(Dense(256, activation=’relu’))
    smodel.add(Dense(12, activation=’softmax’))
    #optimizer = Adam(lr=0.001)
    smodel.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
    #model.summary()
    return smodel

架构3:深层CNN+分类头

 def cconstruct_model(learningRate):
    smodel = Sequential()
    smodel.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(128, 128, 1), activation=’relu’))
    smodel.add(Conv2D(filters=32, kernel_size=(3, 3), activation=’relu’))
    smodel.add(MaxPool2D((2, 2)))
    smodel.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
    smodel.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
    smodel.add(MaxPool2D((2, 2)))
    smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
    smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
    smodel.add(MaxPool2D((2, 2)))
    smodel.add(Flatten())
    smodel.add(Dense(256, activation=’relu’))
    smodel.add(Dense(256, activation=’relu’))
    smodel.add(Dense(12, activation=’softmax’))
    optimizer = Adam(lr=learningRate)
    smodel.compile(loss=’categorical_crossentropy’, optimizer=optimizer, metrics=[‘accuracy’])
    smodel.summary()
    return smodel

有了这3个模型,我们将使用4种方法来可视化cnn的结构

ANN Visualizer

ANN Visualizer 的 Python 模块可以通过几行代码来可视化神经网络。它使用 Keras 和 Python 的 Graphviz 模块来生成一个整洁的神经网络图。它是最早的几个可视化包之一,但是最近已经不更新了,我们先介绍他是因为它算是最早出现的,也是最有名的。

ANN Visualizer可视化需要首先编译模型

model=construct_model()

主要参数如下:

  • ann_viz(model, view=True, filename=”network.gv”, title=”MyNeural Network”)
  • model—Keras的模型
  • view—在调用ann_viz()之后显示可视化图形
  • filename—文件名
  • title—自定义标题
from ann_visualizer.visualize import ann_viz
 ann_viz(model, view=True, filename=”cconstruct_model”, title=”CNN — Model 1 — Simple Architecture”)
图片

上面就是使用ANN Visualizer创建的construct_model()的可视化图。可以看到,如果模型太大显示效果不会太好,这可能也是ANN Visualizer被淘汰的一个原因。

Visual Keras

Visualkeras可以更容易地查看Keras的神经网络设计(可以单独查看,也可以作为TensorFlow的一部分)。

model1=construct_model()
 model2=sconstruct_model()
 model3=cconstruct_model(0.009)
 
 import visualkeras
 from PIL import ImageFont
 visualkeras.layered_view(model1, legend=True)
 visualkeras.layered_view(model2, legend=True)
 visualkeras.layered_view(model3, legend=True)
model1=construct_model()
 model2=sconstruct_model()
 model3=cconstruct_model(0.009)
 
 import visualkeras
 from PIL import ImageFont
 visualkeras.layered_view(model1, legend=True)
 visualkeras.layered_view(model2, legend=True)
 visualkeras.layered_view(model3, legend=True)
图片
图片
图片

可以通过可视化来对比出不同层的大小,这个还是很有用的。

Keras Model Plot

keras.utils.plot_model是keras的内建绘制Keras模型函数,它使用了Graphviz和pydot包。从图上可,它不如上面使用的包直观,但它概述了顺序模型的基本体系结构。

tf.keras.utils.plot_model(model1,to_file="model.png",show_shapes=True,show_dtype=False,show_layer_names=True,rankdir="TB",expand_nested=True,dpi=96,layer_range=None,show_layer_activatinotallow=True,)

一下是几个参数的介绍:

  • model: Keras编译后的模型或模型对象的实例
  • to_file:保存的文件名
  • Show_shapes:显示神经网络中每一层的尺寸和形状
  • show_layer_activation:显示神经元内部使用的激活函数
图片

TensorBoard

TensorBoard 允许用户可视化不同模型运行的日志。日志的范围可以从跟踪任何模型验证度量(不同轮次的准确率、召回率、RMSE、MAPE 和 MSE)到创建模型的架构图。它是一个强大的工具,可以可视化预期模型是否与预期设计匹配,同时深入了解如何使用操作级图更改模型。

我们需要先加载 TensorBoard,然后创建一个日志目录。

%load_ext tensorboard
 from datetime import datetime
 from tensorflow import keras
 
 logdir="logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
 tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

使用Keras TensorBoard回调函数,在训练前指定日志目录。然后通过向model.fit()提供这个回调来保证数据被记录在TensorBoard中。

model.fit(X2_train, Y2_train,batch_size=64,epochs=5,callbacks=[tensorboard_callback])

X2_train和Y2_train是上面代码中没有反映的训练数据集。你可以用你自己的任何训练数据来替换它。

图片

可以看到TensorBoard 始终会显示操作级别的图表,虽然对于每一层的架构并不明显,但是对于每一个操作缺失非常详细的。

还需要注意的是,与代码相比该图是上下颠倒的,因为数据从底部流向顶部。但是该图大致类似于 Keras 模型的描述,有额外的边通向其他计算节点。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK