zoukankan      html  css  js  c++  java
  • 深度学习模型的可视化技术总结

    可视化技术总结

    关键字 :Visualizing intermediate convnet outputs ,Deep Visulization Tools


    lizhen
    星期四, 06. 九月 2018 03:25下午 修改

    卷积神经网络的可视化方法可以分为两种方式:

    1. 保存训练后的权重等个训练参数的value以后,** 即借助绘图工具可视化**,
    2. 借助深度学习的可视化的工具也能实现可视化. 比如tensorflow下面的tensorBorad; PyTorch下面的tensorBoradX, Matlab的Deep Visulization Toolbox, 借助绘图工具可视化

    1. 借助绘图工具可视化

    这个论坛的帖子一定要看
    这篇帖子给出了绘制图片的方法,写的很不错,还是有很多地方还需要修改,比如: 保存数据的save()方法有待修改, 图片的显示过程应该是在训练完毕之后,对模型恢复的时候进行的,而不应该把训练代码和可视化代码放在一起等等.
    tensorflow的计算过程都是以tensor的形式输出的, 需要想本法从tensor转换成np.ndarray类型, 然后再使用 openCV,pandas,matplotlib等绘图工具库来绘制图像.

    将tensor-->np.ndarray只需调用sess.run(tensor)即可;
    接下来是使用绘图工具绘制图片了,
    plt提供了对矩阵的绘制绘制方法: plt.matshow()函数, 该函数可以可以将numpy的矩阵作为输入参数,并绘制出来. 简而言之. 就是可以把训练以后的tensor以图片的方式显示出来.

    1.1 如何可视化特征图?

    假如,以nmnist的数据为例;输入的tensor的大小是(1,28,28,64); 这属于tensorflow的基本输入格式(numbers, height,width,channels)

    卷积以后会有64张特征图,大小是28*28;
    第一张图片的特征图应该为:[0,:,:,1], 第二张特征图是[0,:,:,2],以此类推

    每张特征图的显示方式如下:

    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('路径') # 保存图片
    

    原始图片

    卷积后的特征图可视化效果

    卷积核可视化后的效果

    1.2 如何可视化 kernel?

    卷积核在很多深度学习框架中通常也是以tensor的形式存在,所以在显示的方式上并没有太大的区别;
    对tensorflow来说, 获取权重值还需要通过上下文的session.run方法才能获得

    # 可视化 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() 
    

    卷积核

    卷积核

    卷积核

    2. 借助深度学习工具

    A. Tensorflow

    TensorFlow中的可视化方法是通过tensorBoard、tf.summary和tf.summary.FileWriter这三个模块相互合作来完成的。
    tf.summary中提供了在训练过程中记录每次训练数据的函数,
    tf.summary.FileWriter可以把所有tf.summary的记录保存到本地
    tensorBoard 用来渲染记录数据,并用浏览器的方式查看图片

    可以根据tensorflow 的官网文档写出来,再次不赘述, tensorflow也有详细的官方文档,见索引[11] TensorBoard: Visualizing Learning

    借助tensorflow的可视化工具实现可视化,可以分为以下5步:

    1. 声明数据的变量,
    2. 使用tf.summary()记录变量
    3. 使用 tf.summary.merge_all()合并所有的图
    4. 使用tf.summary.FileWriter保存数据
    5. tensorBoard浏览记录

    step 1. 指定绘制的变量名称:

    指定变量名称的方式有两种:
    (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')
    

    Step 2. 记录变量:

    为变量起名字以后, tensorflow会默认记录weight/biases的每次变化, 并在后期绘制成曲线图.;除此以外如果需要记录其他参数的变化, tf.summary.提供了histogram(), scalar(),image()用来记录变量

    tf.summary.scalar()

    tf.summary.scalar() 主要用于描绘画loss曲线和accuary曲线时会用到.
    函数说明:
    scalar(name, tensor, collections=None, family=None)
    name: 给节点起名字, 所起的名字会作为图片的名称
    tensor: 要记录的变量
    使用方法:

    tf.summary.scalar('stddev/'+name,stddev)
    

    效果图:

    tf.summary.scalar效果

    tf.summary.histogram

    一般是用来显示训练过程中变量的分布情况
    histogram(name, values, collections=None, family=None)
    函数说明:
    name: 给节点起名字, 所起的名字会作为图片的名称
    tensor: 要记录的变量
    使用方法:

    tf.summary.histogram(var.op.name + '/gradients', grad)
    tf.summary.histogram(tensor_name + '/activations', x)
    

    效果图:

    tf.summary.histogram

    tf.summary.image

    一般是对矩阵可视化, 可以可视化特征图和权重. 将【计算图】中的【图像数据】写入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]))
    
    

    效果图:

    step 4. 记录像数据

    注意, 在sess.run()之前, 以上的操作仅仅是定义 . 并没执行.
    在执行之前, 需要把所有的图合并在一起, 调用tf.summary.merge_all()可以实现.
    再次注意, 这里需要在每次训练迭代的时候,通过sess.run()的方式调用.每调用一次,会把当前的数据记录下来.

    summary_op = tf.summary.merge_all()
    
    for i in range(epochs):
         xxxxxx
         sess.run(summary_op)
         
    

    step 5. 保存数据

    这一步最为关键, 关系到数据是否能够记录并且保存下来

     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
            
            ....
    

    Step6. tensorborad渲染

    待模型训练结束,可以通过tensorborad --logdir '<保存的路径>' 就可以查看可视化后的数据. 更多呢详细参数通过 tensorborad --lhelp可以获得.

    B keras

    How convolutional neural networks see the world

    问题集合
    RuntimeError: Invalid DISPLAY variable

    3参考文献

    [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
    [11] TensorBoard: Visualizing Learning
    [12] 【Tensorflow_DL_Note17】TensorFlow可视化学习4_tf.summary模块的详解
    [13] 一个大牛的博客
    接下来的安排:
    借助深度学习工具重写梯度下降
    Guided Back-propagation in TensorFlow

    星期五, 10. 八月 2018 03:19下午

  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/greentomlee/p/9599277.html
Copyright © 2011-2022 走看看