关键字 :Visualizing intermediate convnet outputs ,Deep Visulization Toolshtml
lizhen
星期四, 06. 九月 2018 03:25下午 修改
---python
卷积神经网络的可视化方法能够分为两种方式:git
这个论坛的帖子必定要看
这篇帖子给出了绘制图片的方法,写的很不错,仍是有不少地方还须要修改,好比: 保存数据的save()方法有待修改, 图片的显示过程应该是在训练完毕以后,对模型恢复的时候进行的,而不该该把训练代码和可视化代码放在一块儿等等.
tensorflow的计算过程都是以tensor的形式输出的, 须要想本法从tensor转换成np.ndarray类型, 而后再使用 openCV,pandas,matplotlib等绘图工具库来绘制图像.github
将tensor-->np.ndarray只需调用sess.run(tensor)便可;
接下来是使用绘图工具绘制图片了,
plt提供了对矩阵的绘制绘制方法: plt.matshow()
函数, 该函数能够能够将numpy的矩阵做为输入参数,并绘制出来. 简而言之. 就是能够把训练之后的tensor以图片的方式显示出来.浏览器
假如,以nmnist的数据为例;输入的tensor的大小是(1,28,28,64); 这属于tensorflow的基本输入格式(numbers, height,width,channels)网络
卷积之后会有64张特征图,大小是28*28;
第一张图片的特征图应该为:[0,:,:,1], 第二张特征图是[0,:,:,2],以此类推session
每张特征图的显示方式以下:框架
print ("Size of 'conv2' is %s" % (conv2.shape,)) # 输出结果为:Size of 'conv2' is (1, 28, 28, 64) # 绘制每张特征图,迭代64次 for i in range(64): plt.matshow(conv2[0, :, :, i], cmap=plt.get_cmap('gray')) plt.title(str(i) + "th conv2") # 添加标题 plt.colorbar() # 添加条码框 plt.show() # 显示图片 plt.save('路径') # 保存图片
卷积核在不少深度学习框架中一般也是以tensor的形式存在,因此在显示的方式上并无太大的区别;
对tensorflow来讲, 获取权重值还须要经过上下文的session.run方法才能得到ide
# 可视化 weights wc1 = sess.run(weights['wc1']) # print ("Size of 'wc1' is %s" % (wc1.shape,)) # 绘制 for i in range(3): plt.matshow(wc1[:, :, 0, i], cmap=plt.get_cmap('gray')) plt.title(str(i) + "th conv filter") plt.colorbar() plt.show()
TensorFlow中的可视化方法是经过tensorBoard、tf.summary和tf.summary.FileWriter这三个模块相互合做来完成的。
tf.summary中提供了在训练过程当中记录每次训练数据的函数,
tf.summary.FileWriter能够把全部tf.summary的记录保存到本地
tensorBoard 用来渲染记录数据,并用浏览器的方式查看图片函数
能够根据tensorflow 的官网文档写出来,再次不赘述, tensorflow也有详细的官方文档,见索引[11] TensorBoard: Visualizing Learning
借助tensorflow的可视化工具实现可视化,能够分为如下5步:
指定变量名称的方式有两种:
(1) 使用tf.variable_scope()指定名称
(2) 在建立name变量的时候,传入name参数
具体使用方式以下:
(1) 使用tf.variable_scope()指定名称的方式:
with tf.variable_scope('conv1') as scope: # 变量的声明代码
(2) 在建立name变量的时候,传入name参数的方式:
在tensorflow中,能够为每个操做和tensor设置名称
var = tf.get_variable(name, shape, initializer=initializer) weight_decay = tf.multiply(x=tf.nn.l2_loss(var), y=wd, name='weight_loss')
为变量起名字之后, tensorflow会默认记录weight/biases的每次变化, 并在后期绘制成曲线图.;除此之外若是须要记录其余参数的变化, tf.summary.
提供了histogram()
, scalar()
,image()
用来记录变量
tf.summary.scalar() 主要用于描绘画loss曲线和accuary曲线时会用到.
函数说明:
scalar(name, tensor, collections=None, family=None)
name: 给节点起名字, 所起的名字会做为图片的名称
tensor: 要记录的变量
使用方法:
python tf.summary.scalar('stddev/'+name,stddev)
效果图:
通常是用来显示训练过程当中变量的分布状况
histogram(name, values, collections=None, family=None)
函数说明:
name: 给节点起名字, 所起的名字会做为图片的名称
tensor: 要记录的变量
使用方法:
tf.summary.histogram(var.op.name + '/gradients', grad) tf.summary.histogram(tensor_name + '/activations', x)
效果图:
通常是对矩阵可视化, 能够可视化特征图和权重. 将【计算图】中的【图像数据】写入TensorFlow中的【日志文件】,以便为未来tensorboard的可视化作准备
tf.summary.image(name,tensor, max_outputs=3, collections=None, family=None) :
函数说明:
tensor的格式应该是[batch_size, height, width, channels],而且数据类型必须为uint8,即全部的像素值在0~255
此方法不只能够绘制图像, 还能够绘制权重和特征图
使用方法:
101 tf.summary.image('images',images) .... 172 for i in range(64): 173 tf.summary.image('conv1-feature',tf.slice(conv1,[0,0,0,i],[-1,-1,-1,1])) 174 tf.summary.image('conv-kernal',tf.slice(kernel,[0,0,0,i],[-1,-1,-1,1]))
效果图:
注意, 在sess.run()以前, 以上的操做仅仅是定义 . 并没执行.
在执行以前, 须要把全部的图合并在一块儿, 调用tf.summary.merge_all()能够实现.
再次注意, 这里须要在每次训练迭代的时候,经过sess.run()的方式调用.每调用一次,会把当前的数据记录下来.
summary_op = tf.summary.merge_all() for i in range(epochs): xxxxxx sess.run(summary_op)
这一步最为关键, 关系到数据是否可以记录而且保存下来
summary_writer = tf.summary.FileWriter(FLAGS.train_dir,graph_def=sess.graph_def) ... # 在训练过程当中调用: for step in xrange(FLAGS.max_steps): .... if step % 100 == 0: summary_str = sess.run(summary_op) # 记录数据 summary_writer.add_summary(summary_str, step) # 保存绘图数据 # Save the model checkpoint periodically. if step % 1000 == 0 or (step + 1) == FLAGS.max_steps: #保存训练数据 checkpoint_path = os.path.join(FLAGS.train_dir, 'model.ckpt') saver.save(sess, checkpoint_path, global_step=step) # saver ....
待模型训练结束,能够经过tensorborad --logdir '<保存的路径>'
就能够查看可视化后的数据. 更多呢详细参数经过 tensorborad --lhelp
能够得到.
How convolutional neural networks see the world
问题集合
RuntimeError: Invalid DISPLAY variable
[1] tensorflowtutorials卷积神经网络可视化
[2] 卷积神经网络实战(可视化部分)——使用keras识别猫咪 (英文部分)
[3] 用TensorFlow可视化卷积层的方法
[4] Visualizing parts of Convolutional Neural Networks using Keras and Cats
[5] Visualizing CNN filters with keras
[6] Keras: visualizing the output of an intermediate layer
[7] pytorch-cnn-visualizations
[8] Deep Visualization:可视化并理解CNN
[9] Visualizing and Understanding Convolutional Networks
[10][Matplotlib imshow/matshow display values on plot](https://stackoverflow.com/questions/21712047/matplotlib-imshow-matshow-display-values-on-plot)
[11] TensorBoard: Visualizing Learning
[12] 【Tensorflow_DL_Note17】TensorFlow可视化学习4_tf.summary模块的详解
[13] 一个大牛的博客
接下来的安排:
借助深度学习工具重写梯度降低
Guided Back-propagation in TensorFlow
星期五, 10. 八月 2018 03:19下午