TensorFlow神经网络中间层的可视化

2023-12-16 18:28

本文主要是介绍TensorFlow神经网络中间层的可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TensorFlow神经网络中间层的可视化

  • TensorFlow神经网络中间层的可视化
    • 1. 训练网络并保存为.h5文件
    • 2. 通过.h5文件导入网络
    • 3. 可视化网络中间层结果
      • (1)索引取层可视化
      • (2)通过名字取层可视化

TensorFlow神经网络中间层的可视化

1. 训练网络并保存为.h5文件

我们使用AlexNet为例,任务是手写数字识别,训练集使用手写数字集(mnist)。

网络的结构(我们使用的是28x28的黑白图):
在这里插入图片描述

网络搭建和训练的代码

# 最终版
import os.path
import tensorflow as tf
import matplotlib.pyplot as plt
import cv2# 画出训练过程的准确率和损失值的图像
def plotTrainHistory(history, train, val):plt.plot(history[train])plt.plot(history[val])plt.title('Train History')plt.xlabel('Epoch')plt.ylabel(train)plt.legend(['train', 'validation'], loc = 'upper left')plt.show()(xTrain, yTrain), (xTest, yTest) = tf.keras.datasets.mnist.load_data()xTrain = tf.expand_dims(xTrain, axis = 3)
xTest = tf.expand_dims(xTest, axis = 3)
print(f"训练集数据大小:{xTrain.shape}")
print(f"训练集标签大小:{yTrain.shape}")
print(f"测试集数据大小:{xTest.shape}")
print(f"测试集标签大小:{yTest.shape}")# 归一化
xTrainNormalize = tf.cast(xTrain, tf.float32) / 255
xTestNormalize = tf.cast(xTest, tf.float32) / 255
# 数据独热编码
yTrainOneHot = tf.keras.utils.to_categorical(yTrain)
yTestOneHot = tf.keras.utils.to_categorical(yTest)model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(filters = 96, kernel_size = 11, strides = 4, input_shape = (28, 28, 1),padding = 'SAME', activation = tf.keras.activations.relu),tf.keras.layers.BatchNormalization(),tf.keras.layers.MaxPool2D(pool_size = 3, strides = 2, padding = 'SAME'),tf.keras.layers.Conv2D(filters = 256, kernel_size = 5, strides = 1,padding = 'SAME', activation = tf.keras.activations.relu),tf.keras.layers.BatchNormalization(),tf.keras.layers.MaxPool2D(pool_size = 3, strides = 2, padding = 'SAME'),tf.keras.layers.Conv2D(filters = 384, kernel_size = 3, strides = 1,padding = 'SAME', activation = tf.keras.activations.relu),tf.keras.layers.Conv2D(filters = 384, kernel_size = 3, strides = 1,padding = 'SAME', activation = tf.keras.activations.relu),tf.keras.layers.Conv2D(filters = 256, kernel_size = 3, strides = 1,padding = 'SAME', activation = tf.keras.activations.relu),tf.keras.layers.MaxPool2D(pool_size = 3, strides = 2, padding = 'SAME'),tf.keras.layers.Flatten(),tf.keras.layers.Dense(4096, activation = tf.keras.activations.relu),tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(4096, activation = tf.keras.activations.relu),tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(10, activation = tf.keras.activations.softmax)
])weightsPath = './AlexNetModel/'callback = tf.keras.callbacks.ModelCheckpoint(filepath = weightsPath,save_best_only = True,save_weights_only = True,verbose = 1
)model.compile(loss = tf.keras.losses.CategoricalCrossentropy(),optimizer = tf.keras.optimizers.Adam(),metrics = ['accuracy']
)model.summary()# 不存在就训练模型
print('参数文件不存在,即将训练模型')
modelTrain = model.fit(xTrainNormalize, yTrainOneHot, validation_split = 0.2,epochs = 20, batch_size = 300, verbose = 1, callbacks = [callback]
)
model.save("./model.h5")
plotTrainHistory(modelTrain.history, 'loss', 'val_loss')
plotTrainHistory(modelTrain.history, 'accuracy', 'val_accuracy')

2. 通过.h5文件导入网络

把刚才训练得到的模型重新读取,并且重新加载数据集

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as npdef plot_images(images, number, path, title, gray = False):plt.figure()plt.title(title)order = 1for i in range(0, number):plt.subplot(3, 3, order)if gray:plt.imshow(images[:, :, 0, i], cmap = 'gray')else:plt.imshow(images[:, :, 0, i])plt.colorbar()order = order + 1plt.savefig("./{}.png".format(path))plt.show()if __name__ == '__main__':weightsPath = './AlexNetModel/'(xTrain, yTrain), (xTest, yTest) = tf.keras.datasets.mnist.load_data()xTrain = tf.expand_dims(xTrain, axis = 3)xTest = tf.expand_dims(xTest, axis = 3)# print(f"训练集数据大小:{xTrain.shape}")# print(f"训练集标签大小:{yTrain.shape}")# print(f"测试集数据大小:{xTest.shape}")# print(f"测试集标签大小:{yTest.shape}")# 归一化xTrainNormalize = tf.cast(xTrain, tf.float32) / 255xTestNormalize = tf.cast(xTest, tf.float32) / 255# 数据独热编码yTrainOneHot = tf.keras.utils.to_categorical(yTrain)yTestOneHot = tf.keras.utils.to_categorical(yTest)model = tf.keras.models.load_model("model.h5")model.summary()print('Layer Number', len(model.layers))sample = xTrainNormalize[0]plt.imshow(sample)plt.colorbar()plt.savefig('./train.png')

3. 可视化网络中间层结果

测试的数字,5

在这里插入图片描述

(1)索引取层可视化

model.layers中存放着这个神经网络的全部层,它是一个list类型变量

AlexNet一共16层(卷积层、全连接层、池化层等都算入),全部存储在里面

model = tf.keras.models.load_model("model.h5")
print('Layer Number', len(model.layers))

可视化的时候我们取出一部分层,然后来预测,预测结果就是取出来这部分层的结果,因此就看到了中间层的结果

output = tf.keras.models.Sequential([tf.keras.layers.InputLayer(input_shape = (28, 28, 1)),model.layers[0],model.layers[1],model.layers[2],
]).predict(sample)
print('output.shape', output.shape)
plot_images(output, 9, '5_Conv2D_BN_MP_1', str(output.shape))

查看三层的结果,即Conv2D+BN+MaxPool,结果是 (28, 4, 1, 96),这里画出前9个

在这里插入图片描述
把这96个叠加在一起的结果

t = output[:, :, 0, 0]
for i in range(1, output.shape[3]):t = t + output[:, :, 0, i]
plt.imshow(t)
plt.colorbar()
plt.savefig('./5_Conv2D_BN_MP_1_All.png')

在这里插入图片描述
下面的代码是画出神经网络三个中间层的结果

在这里插入图片描述

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as npdef plot_images(images, number, path, title, gray = False):plt.figure()plt.title(title)order = 1for i in range(0, number):plt.subplot(3, 3, order)if gray:plt.imshow(images[:, :, 0, i], cmap = 'gray')else:plt.imshow(images[:, :, 0, i])plt.colorbar()order = order + 1plt.savefig("./{}.png".format(path))plt.show()if __name__ == '__main__':weightsPath = './AlexNetModel/'(xTrain, yTrain), (xTest, yTest) = tf.keras.datasets.mnist.load_data()xTrain = tf.expand_dims(xTrain, axis = 3)xTest = tf.expand_dims(xTest, axis = 3)# print(f"训练集数据大小:{xTrain.shape}")# print(f"训练集标签大小:{yTrain.shape}")# print(f"测试集数据大小:{xTest.shape}")# print(f"测试集标签大小:{yTest.shape}")# 归一化xTrainNormalize = tf.cast(xTrain, tf.float32) / 255xTestNormalize = tf.cast(xTest, tf.float32) / 255# 数据独热编码yTrainOneHot = tf.keras.utils.to_categorical(yTrain)yTestOneHot = tf.keras.utils.to_categorical(yTest)model = tf.keras.models.load_model("model.h5")model.summary()print('Layer Number', len(model.layers))sample = xTrainNormalize[0]plt.imshow(sample)plt.colorbar()plt.savefig('./train.png')output = tf.keras.models.Sequential([tf.keras.layers.InputLayer(input_shape = (28, 28, 1)),model.layers[0],model.layers[1],model.layers[2],]).predict(sample)print('output.shape', output.shape)plot_images(output, 9, '5_Conv2D_BN_MP_1', str(output.shape))t = output[:, :, 0, 0]for i in range(1, output.shape[3]):t = t + output[:, :, 0, i]plt.imshow(t)plt.colorbar()plt.savefig('./5_Conv2D_BN_MP_1_All.png')output = tf.keras.models.Sequential([tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),model.layers[0],model.layers[1],model.layers[2],model.layers[3],model.layers[4],model.layers[5],]).predict(sample)print('output.shape', output.shape)plot_images(output, 9, '5_Conv2D_BN_MP_2', str(output.shape))t = output[:, :, 0, 0]for i in range(1, output.shape[3]):t = t + output[:, :, 0, i]plt.imshow(t)plt.colorbar()plt.savefig('./5_Conv2D_BN_MP_2_All.png')output = tf.keras.models.Sequential([tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),model.layers[0],model.layers[1],model.layers[2],model.layers[3],model.layers[4],model.layers[5],model.layers[6],model.layers[7],model.layers[8],model.layers[9],]).predict(sample)print('output.shape', output.shape)plot_images(output, 9, '5_Conv2D_3_MP', str(output.shape))t = output[:, :, 0, 0]for i in range(1, output.shape[3]):t = t + output[:, :, 0, i]plt.imshow(t)plt.colorbar()plt.savefig('./5_Conv2D_3_MP_All.png')

0和5的结果

在这里插入图片描述

(2)通过名字取层可视化

模型的**summary()**成员函数可以查看网络每一层名字和参数情况

model.summary()

博客中使用的AlexNet每一层名字和参数情况
在这里插入图片描述
通过名字来取中间层,并且预测得到中间层可视化结果

在这里插入图片描述
如果我们要看这个池化层的结果,这样写代码

model = tf.keras.models.load_model("../model.h5")
model.summary()sample = xTrainNormalize[0]
plt.imshow(sample)
plt.colorbar()
plt.savefig('./train.png')output = tf.keras.models.Model(inputs=model.get_layer('conv2d').input,outputs=model.get_layer('max_pooling2d').output
).predict(sample)

通过get_layer获取指定名字的层

inputs指定输入层,outputs指定输出层

每一层的名字可以在创建的时候使用name参数指定

...
tf.keras.layers.Conv2D(filters = 96, kernel_size = 11, strides = 4, input_shape = (28, 28, 1),padding = 'SAME', activation = tf.keras.activations.relu, name = 'Conv2D_1'),
...

每一层的名字红色框框出

在这里插入图片描述

下面是例子:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as npdef plot_images(images, number, path, title, gray = False):plt.figure()plt.title(title)order = 1for i in range(0, number):plt.subplot(3, 3, order)if gray:plt.imshow(images[:, :, 0, i], cmap = 'gray')else:plt.imshow(images[:, :, 0, i])plt.colorbar()order = order + 1plt.savefig("./{}.png".format(path))plt.show()if __name__ == '__main__':(xTrain, yTrain), (xTest, yTest) = tf.keras.datasets.mnist.load_data()xTrain = tf.expand_dims(xTrain, axis = 3)xTest = tf.expand_dims(xTest, axis = 3)# 归一化xTrainNormalize = tf.cast(xTrain, tf.float32) / 255xTestNormalize = tf.cast(xTest, tf.float32) / 255# 数据独热编码yTrainOneHot = tf.keras.utils.to_categorical(yTrain)yTestOneHot = tf.keras.utils.to_categorical(yTest)model = tf.keras.models.load_model("../model.h5")model.summary()sample = xTrainNormalize[0]plt.imshow(sample)plt.colorbar()plt.savefig('./train.png')output = tf.keras.models.Model(inputs=model.get_layer('conv2d').input,outputs=model.get_layer('max_pooling2d').output).predict(sample)# output = tf.keras.models.Sequential([#     tf.keras.layers.InputLayer(input_shape = (28, 28, 1)),#     model.layers[0],#     model.layers[1],#     model.layers[2],# ]).predict(sample)print('output.shape', output.shape)# plot_images(output, 9, '5_Conv2D_BN_MP_1', str(output.shape))

这篇关于TensorFlow神经网络中间层的可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/501442

相关文章

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

基于SSM+Vue+MySQL的可视化高校公寓管理系统

系统展示 管理员界面 宿管界面 学生界面 系统背景   当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前,不接受信息改革带来的信息技术的企业随时面临被淘汰,被取代的风险。所以当今,各个行业领域,不管是传统的教育行业

机器学习之监督学习(三)神经网络

机器学习之监督学习(三)神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一:TensorFlow搭建神经网络 4. 反向传播梯度下降 Back Propagation Gradient Descent模块二:激活函数 activ

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

win10不用anaconda安装tensorflow-cpu并导入pycharm

记录一下防止忘了 一、前提:已经安装了python3.6.4,想用tensorflow的包 二、在pycharm中File-Settings-Project Interpreter点“+”号导入很慢,所以直接在cmd中使用 pip install -i https://mirrors.aliyun.com/pypi/simple tensorflow-cpu下载好,默认下载的tensorflow

图神经网络(2)预备知识

1. 图的基本概念         对于接触过数据结构和算法的读者来说,图并不是一个陌生的概念。一个图由一些顶点也称为节点和连接这些顶点的边组成。给定一个图G=(V,E),  其 中V={V1,V2,…,Vn}  是一个具有 n 个顶点的集合。 1.1邻接矩阵         我们用邻接矩阵A∈Rn×n表示顶点之间的连接关系。 如果顶点 vi和vj之间有连接,就表示(vi,vj)  组成了

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算法Seq2Seq端到端神经网络算法 总结 自然语言处理系列六十三 神经网络算法》LSTM长短期记忆神经网络算法 长短期记忆网络(LSTM,Long S