您好,登錄后才能下訂單哦!
為了查看網絡訓練的效果或者便于調參、更改結構等,我們常常將訓練網絡過程中的loss、accurcy等參數。
除此之外,有時我們也想要查看訓練好的網絡中間層輸出和卷積核上面表達了什么內容,這可以幫助我們思考CNN的內在機制、調整網絡結構或者把這些可視化內容貼在論文當中輔助說明訓練的效果等。
中間層和卷積核的可視化有多種方法,整理如下:
1. 以矩陣(matrix)格式手動輸出圖像:
用簡單的LeNet網絡訓練MNIST數據集作為示例:
x = tf.placeholder(tf.float32, [None, 784]) x_image = tf.reshape(x, [-1,28,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, [None, 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, 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, 14 ,1] 若前面網絡中加入了dropout,這里的feed_dict中不要忘記加上keep_prob: 0.5 conv2 = sess.run(tf.reshape(conv2 , [64, 1, 14, 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, 1, 5, 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實現可視化中間層和卷積層就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。