1. 程式人生 > 程式設計 >使用Tensorflow實現視覺化中間層和卷積層

使用Tensorflow實現視覺化中間層和卷積層

為了檢視網路訓練的效果或者便於調參、更改結構等,我們常常將訓練網路過程中的loss、accurcy等引數。

除此之外,有時我們也想要檢視訓練好的網路中間層輸出和卷積核上面表達了什麼內容,這可以幫助我們思考CNN的內在機制、調整網路結構或者把這些視覺化內容貼在論文當中輔助說明訓練的效果等。

中間層和卷積核的視覺化有多種方法,整理如下:

1. 以矩陣(matrix)格式手動輸出影象:

用簡單的LeNet網路訓練MNIST資料集作為示例:

x = tf.placeholder(tf.float32,[None,784]) 

x_image = tf.reshape(x,[-1,28,1])    
W_conv1 = weight_variable([5,5,1,32]) # 第一個卷積層的32個卷積核  
b_conv1 = bias_variable([32])  
# 第一個卷積層:  
h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1) + b_conv1)
h_pool1 = max_pool(h_conv1)  # 第一個池化層    

訓練結束後,第一個卷積層共有32個5*5大小的卷積核:W_conv1,要視覺化第10個卷積核:

from PIL import Image
import numpy as np
#from mnist_try001 import W_conv1

img1 = (W_conv1.eval()) # 將張量轉換為numpy陣列
W_conv1_10 = img1[:,:,9] 

W_conv1_10 = np.asmatrix(W_conv1_10) # 將陣列轉換為矩陣格式
W_conv1_10_visual = Image.fromarray(W_conv1_10 * 255.0 / W_conv1_10.max()) # 畫素值歸一化,Image.fromarray方法的輸入範圍是[0~255]
W_conv1_10_visual.show()

2. 通過反捲積方式輸出中間層和卷積核影象:

import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

x = tf.placeholder(tf.float32,784])
mnist = input_data.read_data_sets('/TensorflowCode/MNIST_data',one_hot=True)

h_conv2 = tf.nn.relu(tf.nn.conv2d(h_pool1,W_conv2,strides=[1,1],padding='SAME') + b_conv2) #14*14*64
# 視覺化第二層輸出的影象
input_image = mnist.train.images[100] # 輸入一幅指定影象,mnist.train.images[100]尺寸為[784,],即1維:[1,784]
conv2 = sess.run(h_conv2,feed_dict={x:input_image}) # [64,14,1] 若前面網路中加入了dropout,這裡的feed_dict中不要忘記加上keep_prob: 0.5
conv2 = sess.run(tf.reshape(conv2,[64,14]))
conv2 = np.sum(conv2,axis = 0) # 對中間層影象各通道求和,作為輸出影象
h_conv1 = np.asmatrix(h_conv1) # 將conv2陣列轉換成矩陣格式
h_conv1 = Image.fromarray(h_conv1 * 255.0 / h_conv1.max()) # 矩陣數值歸一化
h_conv1.show() # 輸出14*14的灰度影象

視覺化卷積核和上面的方法完全一樣,把h_conv2改成卷積核就可以了(如W_conv1_10),可以同是輸出多個卷積核。

中間層影象如下:(已經完全看不出是數字了)

或者用 matplotlib.pyplot代替上面的Image方法,可以直接輸出彩色影象:

# 輸出第一層的32個卷積核(5×5*32)
import matplotlib.pyplot as plt

input_image = mnist.train.images[100]
W_conv1 = sess.run(W_conv1,feed_dict={x:input_image})   
W_conv1 = sess.run(tf.reshape(conv1_16,[32,5]))
fig1,ax1 = plt.subplots(nrows=1,ncols=32,figsize = (32,1))
for i in range(32):
  ax1[i].imshow( W_conv1[i][0])           
plt.title('W_conv1 32×5×5')
plt.show()

以上這篇使用Tensorflow實現視覺化中間層和卷積層就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。