使用Tensorflow实现可视化中间层和卷积层


Posted in Python onJanuary 24, 2020

为了查看网络训练的效果或者便于调参、更改结构等,我们常常将训练网络过程中的loss、accurcy等参数。

除此之外,有时我们也想要查看训练好的网络中间层输出和卷积核上面表达了什么内容,这可以帮助我们思考CNN的内在机制、调整网络结构或者把这些可视化内容贴在论文当中辅助说明训练的效果等。

中间层和卷积核的可视化有多种方法,整理如下:

1. 以矩阵(matrix)格式手动输出图像:

用简单的LeNet网络训练MNIST数据集作为示例:

x = tf.placeholder(tf.float32, [None, 784]) 

x_image = tf.reshape(x, [-1,28,28,1])    
W_conv1 = weight_variable([5, 5, 1, 32]) # 第一个卷积层的32个卷积核  
b_conv1 = bias_variable([32])  
# 第一个卷积层:  
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool(h_conv1)  # 第一个池化层

训练结束后,第一个卷积层共有32个5*5大小的卷积核:W_conv1,要可视化第10个卷积核:

from PIL import Image
import numpy as np
#from mnist_try001 import W_conv1

img1 = (W_conv1.eval()) # 将张量转换为numpy数组
W_conv1_10 = img1[:,:,:,9] 

W_conv1_10 = np.asmatrix(W_conv1_10) # 将数组转换为矩阵格式
W_conv1_10_visual = Image.fromarray(W_conv1_10 * 255.0 / W_conv1_10.max()) # 像素值归一化,Image.fromarray方法的输入范围是[0~255]
W_conv1_10_visual.show()

2. 通过反卷积方式输出中间层和卷积核图像:

import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

x = tf.placeholder(tf.float32, [None, 784])
mnist = input_data.read_data_sets('/TensorflowCode/MNIST_data', one_hot=True)

h_conv2 = tf.nn.relu(tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding='SAME') + b_conv2) #14*14*64
# 可视化第二层输出的图像
input_image = mnist.train.images[100] # 输入一幅指定图像,mnist.train.images[100]尺寸为[784,],即1维:[1,784]
conv2 = sess.run(h_conv2, feed_dict={x:input_image}) # [64, 14, 14 ,1] 若前面网络中加入了dropout,这里的feed_dict中不要忘记加上keep_prob: 0.5
conv2 = sess.run(tf.reshape(conv2 , [64, 1, 14, 14]))
conv2 = np.sum(conv2,axis = 0) # 对中间层图像各通道求和,作为输出图像
h_conv1 = np.asmatrix(h_conv1) # 将conv2数组转换成矩阵格式
h_conv1 = Image.fromarray(h_conv1 * 255.0 / h_conv1.max()) # 矩阵数值归一化
h_conv1.show() # 输出14*14的灰度图像

可视化卷积核和上面的方法完全一样,把h_conv2改成卷积核就可以了(如W_conv1_10),可以同是输出多个卷积核。

中间层图像如下:(已经完全看不出是数字了)

使用Tensorflow实现可视化中间层和卷积层

或者用 matplotlib.pyplot代替上面的Image方法,可以直接输出彩色图像:

# 输出第一层的32个卷积核(5×5*32)
import matplotlib.pyplot as plt

input_image = mnist.train.images[100]
W_conv1 = sess.run(W_conv1, feed_dict={x:input_image})   
W_conv1 = sess.run(tf.reshape(conv1_16, [32, 1, 5, 5]))
fig1,ax1 = plt.subplots(nrows=1, ncols=32, figsize = (32,1))
for i in range(32):
  ax1[i].imshow( W_conv1[i][0])           
plt.title('W_conv1 32×5×5')
plt.show()

以上这篇使用Tensorflow实现可视化中间层和卷积层就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现二分法算法实例
Feb 02 Python
python输出指定月份日历的方法
Apr 23 Python
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
深入解答关于Python的11道基本面试题
Apr 01 Python
Python实现基于二叉树存储结构的堆排序算法示例
Dec 08 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
Python3解释器知识点总结
Feb 19 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 #Python
keras获得某一层或者某层权重的输出实例
Jan 24 #Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 #Python
关于Keras模型可视化教程及关键问题的解决
Jan 24 #Python
基于keras 模型、结构、权重保存的实现
Jan 24 #Python
Python 文件数据读写的具体实现
Jan 24 #Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 #Python
You might like
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
jsonp原理及使用
2013/10/28 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
js实现简易ATM功能
2020/10/27 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
现代化办公人员工作的自我评价
2013/10/16 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
倡导文明标语
2014/06/16 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
农村党支部承诺书
2015/04/30 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
php字符串倒叙
2021/04/01 PHP
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
SQL 聚合、分组和排序
2021/11/11 MySQL
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang