使用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中对列表排序实例
Jan 04 Python
用Python进行TCP网络编程的教程
Apr 29 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
python实现折半查找和归并排序算法
Apr 14 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
python3大文件解压和基本操作
Dec 15 Python
python判断完全平方数的方法
Nov 13 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
10个Python面试常问的问题(小结)
Nov 20 Python
opencv-python的RGB与BGR互转方式
Jun 02 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
在python里面运用多继承方法详解
2019/07/01 Python
django在开发中取消外键约束的实现
2020/05/20 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
Python 如何测试文件是否存在
2020/07/31 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
一套英文Java笔试题面试题
2016/04/21 面试题
工商管理实习生自我鉴定范文
2013/12/18 职场文书
幼儿教育感言
2014/02/05 职场文书
教师节商场活动方案
2014/02/13 职场文书
医德医风个人总结
2015/02/28 职场文书
产品调价通知函
2015/04/20 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android
小程序实现侧滑删除功能
2022/06/25 Javascript