使用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之模拟鼠标键盘动作具体实现
Dec 30 Python
Python中用Decorator来简化元编程的教程
Apr 13 Python
python实现ping的方法
Jul 06 Python
简单谈谈Python流程控制语句
Dec 04 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
python+selenium识别验证码并登录的示例代码
Dec 21 Python
Django中的Model操作表的实现
Jul 24 Python
Python爬虫文件下载图文教程
Dec 23 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
20行Python代码实现视频字符化功能
Apr 13 Python
Python pip安装第三方库实现过程解析
Jul 09 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
vue多次循环操作示例
2019/02/08 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
Python+django实现文件上传
2016/01/17 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python线程池threadpool使用篇
2018/04/27 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
大学生简单自荐信
2013/11/10 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL
Android存储中最基本的文件存储方式
2022/04/30 Java/Android