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