当前位置: 首页 > 科技观察

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

时间:2023-03-12 16:49:26 科技观察

当我们使用卷积神经网络或递归神经网络或其他变体时,我们通常希望对模型的架构有一个可视化视图,因为通过这种方式我们可以定义和训练时使用多个模型,比较不同层的效果以及它们在结果上的放置顺序。您还可以更好地理解模型结构、激活函数、模型参数形状(神经元数量)等。keras中有一些现成的包来创建我们的神经网络模型的可视化表示。前三个包可以在模型训练之前使用(只需定义和编译模型);但是TensorBoards要求用户在架构可视化之前用准确的数据训练模型。在开始可视化之前,我们需要安装相应的包:pipinstallvisualkeraspipinstallann_visualizerpipinstallgraphviz然后我们创建一个模型,使用这4个包进行可视化:在实际使用中,我们希望通过可视化来比较模型架构,所以三个此处定义了具有不同超参数的CNN模型。我们创建了用户定义的函数来构建具有不同数量的CNN层、池化层和最后一个密集层的三个不同模型。结构1:浅层CNN+分类头defconstruct_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())模型.add(Dense(256,activation='relu'))model.add(Dense(12,activation='softmax'))model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])returnmodel结构2:深层CNN+mlp分类头defsconstruct_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(过滤器=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()returnsmodel架构3:深层CNN+分类头defcconstruct_model(learningRate):smodel=顺序()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),激活='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()returnsmodel有了这3个模型,我们就用4种方法可视化cnnANNVisualizerANNVisualizer的Python结构模块可以用几行代码可视化神经网络。它使用Keras和Python的Graphviz模块来生成整洁的神经网络图。它是最早的可视化包之一,但最近没有更新。我们先介绍他,因为它最早,最著名。ANNVisualizer可视化需要先编译模型model=construct_model()主要参数如下:ann_viz(model,view=True,filename=”network.gv”,title=”MyNeuralNetwork”)model—模型视图Keras—当调用ann_viz()然后显示可视化图形文件名—文件名标题—自定义标题fromann_visualizer.visualizeimportann_vizann_viz(model,view=True,filename=”cconstruct_model”,title=”CNN—Model1—SimpleArchitecture”)上面是使用Visualizer创建的construct_model()的ANN可视化。可以看出如果模型太大,显示效果不会很好,这可能是ANNVisualizer被淘汰的原因之一。VisualKerasVisualkeras可以更轻松地查看Keras中的神经网络设计(单独或作为TensorFlow的一部分)。model1=construct_model()model2=sconstruct_model()model3=cconstruct_model(0.009)从PIL导入visualkerasimportImageFontvisualkeras.layered_view(model1,legend=True)visualkeras.layered_view(model2,legend=True)visualkeras.layered_view(True)model1=construct_model()model2=sconstruct_model()model3=cconstruct_model(0.009)从PIL导入visualkerasimportImageFontvisualkeras.layered_view(model1,legend=True)visualkeras.layered_view(model2,legend=True)visualkeras.layered_view(model2,legend=True)visualkeras.layeredlegend=True)可以通过可视化比较不同层的大小,还是很有用的。KerasModelPlotkeras.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:显示神经元内部使用的Activation函数TensorBoardTensorBoard允许用户可视化不同模型运行的日志。日志记录的范围可以从跟踪任何模型验证指标(跨时期的精度、召回率、RMSE、MAPE和MSE)到创建模型的架构图。它是一个强大的工具,可用于可视化预期模型是否与预期设计相匹配,同时深入了解如何使用操作级图更改模型。我们需要先加载TensorBoard,然后创建一个日志目录。%load_exttensorboardfromdatetimeimportdatetimefromtensorflowimportkeraslogdir="logs/fit/"+datetime.now().strftime("%Y%m%d-%H%M%S")tensorboard_callback=keras.callbacks.TensorBoard(log_dir=logdir)使用KerasTensorBoard回调函数指定训练前的日志目录。然后通过向model.fit()提供此回调来确保数据记录在TensorBoard中。model.fit(X2_train,Y2_train,batch_size=64,epochs=5,callbacks=[tensorboard_callback])X2_train和Y2_train是上面代码中没有体现的训练数据集。您可以将其替换为您自己的任何训练数据。可以看出,TensorBoard始终显示操作级别的图。每一层的架构虽然不明显,但是每一个操作都非常详细。另请注意,与代码相比,该图是颠倒的,因为数据从底部流向顶部。但该图大致类似于Keras模型的描述,具有通向其他计算节点的附加边。