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下午

  • 相关阅读:
    Qt之重启应用程序
    Qt之密码框不可选中、复制、粘贴、无右键菜单等
    Qt之国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)
    HTTP全部报文首部字段
    工厂模式
    《Qt 实战一二三》
    Qt之国际化
    Java如何读取XML文件 具体实现
    href脱离iframe显示
    iframe并排横着显示
  • 原文地址:https://www.cnblogs.com/greentomlee/p/9599277.html
Copyright © 2011-2022 走看看