【深度學習系列】CNN模型的可視化

2021-02-20 Python愛好者社區

點擊上圖,立即開啟AI急速修煉

作者:Charlotte    高級算法工程師 ,博客專家;

擅長用通俗易懂的方式講解深度學習和機器學習算法,熟悉Tensorflow,PaddlePaddle等深度學習框架,負責過多個機器學習落地項目,如垃圾評論自動過濾,用戶分級精準營銷,分布式深度學習平臺搭建等,都取了的不錯的效果。

博客專欄:https://www.cnblogs.com/charlotte77/

前文傳送門:

【好書推薦&學習階段】三個月教你從零入門深度學習

【深度學習系列】PaddlePaddle之手寫數字識別

【深度學習系列】卷積神經網絡CNN原理詳解(一)——基本原理

【深度學習系列】PaddlePaddle之數據預處理

  【深度學習系列】卷積神經網絡詳解(二)——自己手寫一個卷積神經網絡

  【深度學習系列】用PaddlePaddle和Tensorflow進行圖像分類

  【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡AlexNet

  【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡Vgg

  【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡GoogLeNet

  【深度學習系列】用PaddlePaddle和Tensorflow實現GoogLeNet InceptionV2/V3/V4

  【深度學習系列】關於PaddlePaddle的一些避「坑」技巧

前面幾篇文章講到了卷積神經網絡CNN,但是對於它在每一層提取到的特徵以及訓練的過程可能還是不太明白,所以這節主要通過模型的可視化來神經網絡在每一層中是如何訓練的。我們知道,神經網絡本身包含了一系列特徵提取器,理想的feature map應該是稀疏的以及包含典型的局部信息。通過模型可視化能有一些直觀的認識並幫助我們調試模型,比如:feature map與原圖很接近,說明它沒有學到什麼特徵;或者它幾乎是一個純色的圖,說明它太過稀疏,可能是我們feature map數太多了(feature_map數太多也反映了卷積核太小)。可視化有很多種,比如:feature map可視化、權重可視化等等,我以feature map可視化為例。

 

模型可視化

  

因為我沒有搜到用paddlepaddle在imagenet 1000分類的數據集上預訓練好的googLeNet inception v3,所以用了keras做實驗,以下圖作為輸入:

  取網絡的前15層,每層取前3個feature map。

  北汽紳寶D50 feature map:

從左往右看,可以看到整個特徵提取的過程,有的分離背景、有的提取輪廓,有的提取色差,但也能發現10、11層中間兩個feature map是純色的,可能這一層feature map數有點多了,另外北汽紳寶D50的光暈對feature map中光暈的影響也能比較明顯看到。

把北汽紳寶D50 第1、4、7層的feature map以及第1, 4, 7, 10, 11, 14, 17層的feature map分別做平均,可視化如下:


代碼實踐

# -*- coding: utf-8 -*-from keras.applications import InceptionV3from keras.applications.inception_v3 import preprocess_inputfrom keras.preprocessing import imagefrom keras.models import Modelfrom keras.applications.imagenet_utils import decode_predictionsimport numpy as npimport cv2from cv2 import *import matplotlib.pyplot as pltimport scipy as spfrom scipy.misc import toimagedef test_opencv():    # 加載攝像頭    cam = VideoCapture(0)  # 0 -> 攝像頭序號,如果有兩個三個四個攝像頭,要調用哪一個數字往上加嘛    # 抓拍 5 張小圖片    for x in range(0, 5):        s, img = cam.read()        if s:            imwrite("o-" + str(x) + ".jpg", img)def load_original(img_path):    # 把原始圖片壓縮為 299*299大小    im_original = cv2.resize(cv2.imread(img_path), (299, 299))    im_converted = cv2.cvtColor(im_original, cv2.COLOR_BGR2RGB)    plt.figure(0)    plt.subplot(211)    plt.imshow(im_converted)    return im_originaldef load_fine_tune_googlenet_v3(img):    # 加載fine-tuning googlenet v3模型,並做預測    model = InceptionV3(include_top=True, weights='imagenet')    model.summary()    x = image.img_to_array(img)    x = np.expand_dims(x, axis=0)    x = preprocess_input(x)    preds = model.predict(x)    print('Predicted:', decode_predictions(preds))    plt.subplot(212)    plt.plot(preds.ravel())    plt.show()    return model, xdef extract_features(ins, layer_id, filters, layer_num):    '''    提取指定模型指定層指定數目的feature map並輸出到一幅圖上.    :param ins: 模型實例    :param layer_id: 提取指定層特徵    :param filters: 每層提取的feature map數    :param layer_num: 一共提取多少層feature map    :return: None    '''    if len(ins) != 2:        print('parameter error:(model, instance)')        return None    model = ins[0]    x = ins[1]    if type(layer_id) == type(1):        model_extractfeatures = Model(input=model.input, output=model.get_layer(index=layer_id).output)    else:        model_extractfeatures = Model(input=model.input, output=model.get_layer(name=layer_id).output)    fc2_features = model_extractfeatures.predict(x)    if filters > len(fc2_features[0][0][0]):        print('layer number error.', len(fc2_features[0][0][0]),',',filters)        return None    for i in range(filters):        plt.subplots_adjust(left=0, right=1, bottom=0, top=1)        plt.subplot(filters, layer_num, layer_id + 1 + i * layer_num)        plt.axis("off")        if i < len(fc2_features[0][0][0]):            plt.imshow(fc2_features[0, :, :, i])# 層數、模型、卷積核數def extract_features_batch(layer_num, model, filters):    '''    批量提取特徵    :param layer_num: 層數    :param model: 模型    :param filters: feature map數    :return: None    '''    plt.figure(figsize=(filters, layer_num))    plt.subplot(filters, layer_num, 1)    for i in range(layer_num):        extract_features(model, i, filters, layer_num)    plt.savefig('sample.jpg')    plt.show()def extract_features_with_layers(layers_extract):    '''    提取hypercolumn並可視化.    :param layers_extract: 指定層列表    :return: None    '''    hc = extract_hypercolumn(x[0], layers_extract, x[1])    ave = np.average(hc.transpose(1, 2, 0), axis=2)    plt.imshow(ave)    plt.show()def extract_hypercolumn(model, layer_indexes, instance):    '''    提取指定模型指定層的hypercolumn向量    :param model: 模型    :param layer_indexes: 層id    :param instance: 模型    :return:    '''    feature_maps = []    for i in layer_indexes:        feature_maps.append(Model(input=model.input, output=model.get_layer(index=i).output).predict(instance))    hypercolumns = []    for convmap in feature_maps:        for i in convmap[0][0][0]:            upscaled = sp.misc.imresize(convmap[0, :, :, i], size=(299, 299), mode="F", interp='bilinear')            hypercolumns.append(upscaled)    return np.asarray(hypercolumns)if __name__ == '__main__':    img_path = '~/auto1.jpg'    img = load_original(img_path)    x = load_fine_tune_googlenet_v3(img)    extract_features_batch(15, x, 3)    extract_features_with_layers([1, 4, 7])    extract_features_with_layers([1, 4, 7, 10, 11, 14, 17])

總結

  

還有一些網站做的關於CNN的可視化做的非常不錯,譬如這個網站:http://shixialiu.com/publications/cnnvis/demo/,大家可以在訓練的時候採取不同的卷積核尺寸和個數對照來看訓練的中間過程。最近PaddlePaddle也開源了可視化工具VisaulDL,下篇文章我們講講paddlepaddle的visualDL和tesorflow的tensorboard。

從零開始學人工智慧

下圖掃碼了解本文作者胡老師的系列課程吧!

限時優惠6.18折!

相關焦點

  • Keras 深度學習模型可視化
    深度學習可視化深度學習的過程是一個黑盒子,模型通過大量的權重去學習擬合輸入的數據和學習目標,模型的性能很大程度上取決於模型的輸入的數據;深度學習的擬合效果往往出乎我們的的想像,但是模型如何擬合數據和學習目標之間的關係,我們知之甚少。
  • 深度學習模型的對抗樣本與可視化生成工具AdvTool
    對抗樣本的由來深度學習近年來領來了飛速的發展,使得人工智慧在圖像識別、語音識別等任務的能力上有了質的提高。人們開始在無人車、無人機、機器人等智能無人系統中利用深度學習理論搭建的模型。不幸的是,研究[1]發現基於神經網絡的深度學習模型脆弱無比,特別容易被欺騙。
  • 深度學習概述:NLP vs CNN
    最初的人工智慧和深度學習算法比較簡單,就像我們所知的簡單感知器模型和單層神經網絡一樣。隨著時間的推移和更加專注的研究,我們已經擁有了具有多層結構的複雜神經網絡。一些公司在他們的軟體和服務中使用了LSTMs、GANs、變分自編碼器等算法。本文在以下部分列出了人工智慧領域當前最熱門的技術以及正在研究這些熱門技術的公司。看了這些創新之後,準備好大吃一驚吧。
  • CNN可視化技術總結
    在不少論文的末尾都有可視化卷積核來分析提出的模型,該方法值得了解。三、類可視化前面我們介紹了兩種可視化方法,特徵圖可視化和卷積核可視化,這兩種方法在論文中都比較常見,這兩種更多的是用於分析模型在某一層學習到的東西。
  • CNN結構設計和可視化工具
    整理盤點常用的神經網絡結構可視化工具一共盤點22個cnn可視化工具,其各有特點,我也只用過其中的兩三個。
  • 深度學習 CNN 和 RNN 等模型簡介
    導讀:深度學習自從2006年以後已經 "火" 了十多年了,目前大家看到的,最普遍的應用成果是在計算機視覺、語音識別和自然語言處理 ( NLP )。最近工業界也在努力地擴展它的應用場景,比如遊戲、內容推薦和廣告匹配等等。
  • 【深度學習】PyTorch深度學習訓練可視化工具visdom
    在進行深度學習實驗時
  • 【深度學習系列】用PaddlePaddle和Tensorflow進行圖像分類
    點擊上圖,立即開啟AI急速修煉作者:Charlotte    高級算法工程師 ,博客專家;擅長用通俗易懂的方式講解深度學習和機器學習算法,熟悉Tensorflow,PaddlePaddle等深度學習框架,負責過多個機器學習落地項目,如垃圾評論自動過濾,用戶分級精準營銷,分布式深度學習平臺搭建等,都取了的不錯的效果。
  • CNN超參數優化和可視化技巧詳解
    王小新 編譯自 Towards Data Science量子位 出品 | 公眾號 QbitAI在深度學習中,有許多不同的深度網絡結構,包括卷積神經網絡
  • 新年福利 | 2019深度學習工具匯總
    剛開始接觸深度學習,第一個使用的工具就是:DeepLearnToolbox,一個用於深度學習的Matlab工具箱。深度學習作為機器學習的一個新領域,它的重點是學習深層次的數據模型,其主要靈感來自於人腦表面的深度分層體系結構,深度學習理論的一個很好的概述是學習人工智慧的深層架構。這個工具箱比較簡單,當時我就做了一個手寫數字和人臉分類(AR人臉資料庫)。
  • 深度學習用於目標檢測的論文及代碼集錦
    各模型效果對比如下R-FCN可視化示例如下特徵映射可視化如下您可能感興趣深度學習用於文本摘要的論文及代碼集錦深度學習用於機器翻譯的論文及代碼集錦深度學習用於序列標註中的論文及代碼集錦深度學習用於NLP(分詞
  • CNN的一些可視化方法!
    註:本文所有資料均來自Keras之父、Google人工智慧研究員Francois Chollet的大作:《Python深度學習》,建議大家直接去看原文,這裡只是結合樓主的理解做點筆記。引言有一些同學認為深度學習、神經網絡什麼的就是一個黑盒子,沒辦法、也不需要分析其內部的工作方式。
  • PyTorch 深度學習訓練可視化工具 visdom
    重磅乾貨,第一時間送達     在進行深度學習實驗時
  • 微軟開源的深度學習模型轉換工具MMdnn
    【導讀】MMdnn是微軟開源的用於不同深度學習框架(Caffe, Keras, MXNet, Tensorflow
  • 深度學習工程化神器Keras教程:《Keras深度學習進階》隨書代碼
    【導讀】Keras是目前最好用的深度學習框架之一,具有非常完備和友好的工程化API接口。
  • 【從零開始學Mask RCNN】二,Mask RCNN框架整體把握
    最終,這部分的輸出為rpn_rois:rpn_rois:[IMAGES_PER_GPU, num_rois, (y1, x1, y2, x2)]接下來根據候選框的實際大小(歸一化的候選框需要映射回原圖大小)為候選框選擇合適的RPN特徵層,再利用ROI Align處理得到我們最終需要的大小相等一系列子圖。
  • 易用的新深度學習框架Keras簡介及使用
    (其實還有很多其他的深度學習框架都是比較容易用的。)1. Keras簡介Keras是基於Theano的一個深度學習框架,它的設計參考了Torch,用Python語言編寫,是一個高度模塊化的神經網絡庫,支持GPU和CPU。
  • 深度學習100+經典模型TensorFlow與Pytorch代碼實現大集合
    【導讀】深度學習在過去十年獲得了極大進展,出現很多新的模型,並且伴隨TensorFlow和Pytorch框架的出現,有很多實現,但對於初學者和很多從業人員
  • 主流的深度學習模型有哪些?
    作者:阿薩姆 | 普華永道 數據科學家量子位 已獲授權編輯發布轉載請聯繫原作者深度學習大熱以後各種模型層出不窮,很多朋友都在問到底什麼是
  • 圖解3種常見的深度學習網絡結構:FC、CNN、RNN
    本文將為讀者介紹三種模型的基本概念以及它們各自適用的場景。作者:劉祥龍 楊晴虹 胡曉光 於佃海 白浩傑 深度學習技術及應用國家工程實驗室 百度技術學院楊晴虹,博士,中科院系列高級工程師,北航軟體學院人工智慧專業主講教師,美國南康乃狄克州立大學圖書信息科學訪問學者,美國耶魯大學技術創新實驗室數據分析專家。胡曉光,百度傑出研發架構師,10餘年自然語言處理研發經驗,參與的機器翻譯項目獲得國家科技進步二等獎,現負責飛槳核心訓練框架和模型算法的研發,致力於打造最好用的深度學習平臺。