反捲積實現卷積層特徵的可視化

前言與背景:

很多論文都提到可視化卷積層的特徵圖,如這篇SCI二區的IEEE論文,最早提出可視化卷積層工作的好像是2014年的一篇頂會。

這篇論文有一部分的工作就是可視化卷積層的輸出,它選擇了可視化第一層卷積層和最後一層池化層,認爲這樣有助於理解與解釋卷積神經網絡。一般觀點都認爲卷積神經網絡是先提取低層次特徵(例如點、線),再提前高層次的抽象特徵。

實現方法:

我用的深度學習框架是TensorFlow,關鍵的函數是tf.transpose,實現反捲積,具體如下:

注-這段代碼是在模型已經訓練完成的後面進行

            # imput image
            fig2, ax2 = plt.subplots(figsize=(299, 299))
            ax2.imshow(np.reshape(training_images[1], (299, 299, 3)))
            plt.xticks([])
            plt.yticks([])
            plt.show()

            # 第一層的卷積輸出的特徵圖
            input_image = training_images[1:2]
            conv1_32 = sess.run(net_1, feed_dict={images: input_image})  # 第一層有32個卷積核,valid填充,149*149
            conv1_transpose = sess.run(tf.transpose(conv1_32, [3, 0, 1, 2]))  # 3,0,1,2是一個可視化的設置
            print(conv1_transpose.shape)  # (32, 1, 149, 149)
            fig3, ax3 = plt.subplots(nrows=8, ncols=4, figsize=(40, 80))
            conv1_index = 0
            for i in range(8):
                for k in range(4):
                    ax3[i][k].imshow(conv1_transpose[conv1_index][0])  # tensor的切片[row, column]
                    ax3[i][k].set_xticks([])
                    ax3[i][k].set_yticks([])
                    conv1_index = conv1_index + 1

            plt.subplots_adjust(wspace=0.1, hspace=0.1)
            save_file = RESULT_PATH + 'conv1.jpg'
            plt.savefig(save_file, format='jpg')

我是以inception_v4模型爲演示模型,net_1是第一個卷積層的結果,如下圖的深色處

實驗結果:

輸入圖像:這原本是1個70*70的大腦白質連接矩陣,通過插值算法變成了299*299,是爲了滿足實驗模型的遷移學習要求。

第一個卷積層的特徵圖,32個(因爲有32個卷積核)                           第四個卷積層(並行),96+64=160

                               

在前面的卷積層還可以看出一些連接矩陣的模樣,在後期就看不出來了

21卷積層(並行),96+96+96+96=384個

 

一些小bug

(1)一開始我是定義net_1爲全局變量,在代碼的開頭寫了global net_1, 可是在主函數裏反捲積還是找不到net_1這個變量,於是我改成了返回的方法,即讓inception_v4_base這個函數多返回出net_1,就可以了。

(2)一開始我測試的時候是,犯了一個白癡問題,需要寫成ax3[0][0]。

(3)最關鍵的問題,GUI的顯示爲了適應窗口大小,顯示的圖片不準確!需要保存出來,怪不得我之前怎麼都無法消除子圖的間隔。

例如這是在matplotlib的GUI界面裏顯示是左圖,然後直接保存出來後就如右圖

左圖:                                     右圖:      

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章