深度學習模型的可視化技術總結


可視化技術總結

關鍵字 :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下午


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM