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 np


def plot_images(images, number, path, title, gray = False):
    plt.figure()
    plt.title(title)
    order = 1
    for 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 + 1

    plt.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) / 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.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 np


def plot_images(images, number, path, title, gray = False):
    plt.figure()
    plt.title(title)
    order = 1
    for 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 + 1

    plt.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) / 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.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 np


def plot_images(images, number, path, title, gray = False):
    plt.figure()
    plt.title(title)
    order = 1
    for 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 + 1

    plt.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) / 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.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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/249604.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“Java 已死、前端已凉”?技术变革与编程语言前景:Java和前端的探讨

前端已死话题概论 本文讨论了近期IT圈中流传的“Java 已死、前端已凉”言论。我们审视了这些言论的真实性,并深入探讨了技术行业的演变和新兴技术的出现对编程语言和前端开发的影响。通过分析历史发展、当前趋势和未来展望,我们提供了对这些话题更深层次…

装修干货,新房装修防水细节要注意!福州中宅装饰,福州装修

水管破裂,墙面起泡,地面渗水……这些水涨船高的问题,你遇到过吗?如果经常遇到,那么你需要了解一些关于防水的干货知识。今天,我就来分享一些装修防水的小技巧和经验,帮助你摆脱装修“水淋淋”的…

Bootstrap 响应式实用工具-来自Twitter,目前最受欢迎的前端框架

Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发。这些可以通过媒体查询结合大型、小型和中型设备,实现内容对设备的显示和隐藏。 需要谨慎使用这些工具,避免在同一个站点创建完全不同的版本。响应式实用工具目前只适用于块和表切换。 超小屏幕 手机 (<…

黑马点评05分布式锁 1互斥锁和过期时间

实战篇-09.分布式锁-基本原理和不同实现方式对比_哔哩哔哩_bilibili 1.分布式锁 因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器&#xff0c;所以需要一个jvm外部的锁来共享。 2.redis setnx互斥锁 加锁解锁即可 2.1不释放锁可能死锁 redis 的setnx不会自动释放锁…

四十二、Redis

目录 一、简介 二、Redis基础 三、Redis的持久化 四、Redis主从、哨兵、分片集群安装 五、Redis主从 六、Redis哨兵 七、Redis分片集群 一、简介 Redis是一个内存中的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。它的数据结构包括字符串、列表、集合…

zabbix批量添加端口监控

背景 以前做监控的时候&#xff0c;一台机器上就几个重要端口&#xff0c;手动添加一下监控就可以了。这次公司一个新业务上了很多服务器&#xff0c;每台服务器上的业务端口很多&#xff0c;而且还不一样。着手动添加会累死人的。所以想zabbix怎么批量添加端口监控。通过查了…

Flink的处理函数

之前的流处理API&#xff0c;无论是基本的转换、聚合&#xff0c;还是更为复杂的窗口操作&#xff0c;其实都是基于DataStream进行转换的&#xff0c;所以可以统称为DataStream API。 在Flink更底层&#xff0c;我们可以不定义任何具体的算子&#xff08;比如map&#xff0c;f…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑碳交易机制的含风电电力系统日前优化调度》

解读标题 "考虑碳交易机制的含风电电力系统日前优化调度" 意味着在该研究或应用中&#xff0c;对含有风电的电力系统进行日前优化调度&#xff0c;并考虑了碳交易机制。 具体解读如下&#xff1a; "含风电电力系统"&#xff1a;指涉及到风能作为电力系统的…

前端设计模式之旅:命令模式

引言 使用命令模式&#xff0c;我们可以将执行特定任务的对象与调用该方法的对象解耦。 核心思想 命令模式的核心思想是将请求封装成一个对象&#xff0c;从而使请求的发起者和请求的执行者解耦。 请求的发起者只需要知道如何创建命令对象并将其传递给请求者&#xff0c;而不需…

Python基础入门第四节,第五节课笔记

第四节 第一个条件语句 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... else: 条件不成立执行的代码1 条件不成立执行的代码2 …… 代码如下: 身高 float(input("请输入您的身高(米):")) if 身高 >1.3:print(f您的身高是{身高},已经超过1.3米,您需…

python+appium自动化常见操作

1、点击、输入操作 #点击 driver.find_element(id,com.lemon.lemonban:id/navigation_my).click() #输入 driver.find_element(id,com.lemon.lemonban:id/et_password).send_keys(abc)2、隐形等待 driver.implicitly_wait(10)3、显性等待 #显性等待 locator (xpath,xpath) wai…

数学公式推导中 “:=“和“:=“的区别

A:B 将A定义为&#xff08;记为&#xff0c;令为&#xff09;B A:B 将B定义为&#xff08;记为&#xff0c;令为&#xff09;A

fckeditor编辑器在Chrome浏览器下编辑时多出空格解决方法

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 结尾语网络的梦想 dedecms网站后台采用fckedi…

『OPEN3D』1.5.1 动手实现点云暴力最近邻

本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html?spm=1001.2014.3001.5482https://blog.csdn.net/qq_41366026/category_12186023.html?spm=1001.2014.3001.5482 1、暴力最近邻法 暴力最近邻法 (Brute-force Nearest Neighbour Search,BF 搜索) 是…

《人工智能导论》知识思维导图梳理【第6章节】

文章目录 第六章 知识图谱1 知识图谱概述2 知识图谱相关概念3 知识图谱的逻辑结构4 知识图谱的数据存储5 知识图谱的构建过程6 例题 markdown内容的分享 第六章 知识图谱 1 知识图谱概述 2 知识图谱相关概念 3 知识图谱的逻辑结构 4 知识图谱的数据存储 5 知识图谱的构建过程 6…

论文阅读——Mask DINO(cvpr2023)

DINO是检测&#xff0c;Mask DINO是检测分割。 几个模型对比&#xff1a; 传统的检测分割中&#xff0c;检测头和分割头是平行的&#xff0c;Mask DINO使用二分图匹配bipartite matching提高匹配结果的准确性。 box对大的类别不计算损失&#xff0c;因为太大了&#xff0c;会…

Gitee:远程仓库步骤

第一步&#xff1a;新建仓库 第二步&#xff1a;初始化本地仓库&#xff0c;git init 创建分支 git branch 新分支名 第三步&#xff1a;git add . &#xff1a;添加到暂存区 第四步&#xff1a;git config –global user.email关联邮箱&#xff0c;user.name用户名 第…

UE5 Landscaping MapBox 学习笔记

1. Landscaping MapBox 操作录屏 https://www.bilibili.com/video/BV113411U7T9/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 安装Landscaping与LandscapingMapbox两个插件 打开Landscaping窗口&#xff0c;这里应该要在Proj…

【CDP】CDP 集群通过Knox 访问Yarn Web UI,无法跳转到Flink Web UI 问题解决

一、前言 记录下在CDP 环境中&#xff0c;通过Knox 访问Yarn Web UI&#xff0c;无法跳转到Flink Web UI 的BUG 解决方法。 二、问题复现 登录 Knox Web UI 找到任一 Flink 任务 点击 ApplicationMaster 跳转 Flink WEB UI 出问题 内容空白&#xff0c;无法正常跳转到…

python 小程序学生选课系统源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 学生&#xff1a; 登录&#xff0c;选课&#xff08;查看课程及选择&#xff09;&#xff0c;我的成绩&#xff0c;…