博客專欄

EEPW首頁 > 博客 > 可視化CNN和特征圖

可視化CNN和特征圖

發(fā)布人:數(shù)據(jù)派THU 時間:2023-07-17 來源:工程師 發(fā)布文章
卷積神經(jīng)網(wǎng)絡(cnn)是一種神經(jīng)網(wǎng)絡,通常用于圖像分類、目標檢測和其他計算機視覺任務。CNN的關鍵組件之一是特征圖,它是通過對圖像應用卷積濾波器生成的輸入圖像的表示。


圖片


理解卷積層


1、卷積操作
卷積的概念是CNN操作的核心。卷積是一種數(shù)學運算,它把兩個函數(shù)結(jié)合起來產(chǎn)生第三個函數(shù)。在cnn的上下文中,這兩個函數(shù)是輸入圖像和濾波器,而得到的結(jié)果就是特征圖。
2、卷積的層
卷積層包括在輸入圖像上滑動濾波器,并計算濾波器與輸入圖像的相應補丁之間的點積。然后將結(jié)果輸出值存儲在特征映射中的相應位置。通過應用多個過濾器,每個過濾器檢測一個不同的特征,我們可以生成多個特征映射。
3、重要參數(shù)
Stride: Stride 是指卷積濾波器在卷積運算過程中在輸入數(shù)據(jù)上移動的步長。
Padding:Padding是指在應用卷積操作之前在輸入圖像或特征映射的邊界周圍添加額外像素。
Padding的目的是控制輸出特征圖的大小,保證濾波窗口能夠覆蓋輸入圖像或特征圖的邊緣。如果沒有填充,過濾器窗口將無法覆蓋輸入數(shù)據(jù)的邊緣,導致輸出特征映射的大小減小和信息丟失。有兩種類型的填充“valid”和“same”。
圖片
kernel/filter :kernel(也稱為filter 或 weight )是一個可學習參數(shù)的小矩陣,用于從輸入數(shù)據(jù)中提取特征。
在下圖中,輸入圖像的大小為(5,5),過濾器filter 的大小為(3,3),綠色為輸入圖像,黃色區(qū)域為該圖像的過濾器。在輸入圖像上滑動濾波器,計算濾波器與輸入圖像的相應像素之間的點積。Padding是valid (也就是沒有填充)。stride值為1。圖片
4、特征圖:
特征圖是卷積神經(jīng)網(wǎng)絡(CNN)中卷積層的輸出。它們是二維數(shù)組,包含卷積濾波器從輸入圖像或信號中提取的特征。
卷積層中特征圖的數(shù)量對應于該層中使用的過濾器的數(shù)量。每個過濾器通過對輸入數(shù)據(jù)應用卷積操作來生成單個特征映射。
特征圖的大小取決于輸入數(shù)據(jù)的大小,卷積操作中使用的過濾器、填充和步幅的大小。通常,隨著我們深入網(wǎng)絡,特征圖的大小會減小,而特征圖的數(shù)量會增加。特征圖的大小可以用以下公式計算:

 Output_Size = (Input_Size  -  Filter_Size + 2 * Padding) / Stride + 1


這個公式非常重要,因為在計算輸出時肯定會用到,所以一定要記住
來自一個卷積層的特征映射作為網(wǎng)絡中下一層的輸入數(shù)據(jù)。隨著層數(shù)的增加,網(wǎng)絡能夠?qū)W習越來越復雜和抽象的特征。通過結(jié)合來自多層的特征,網(wǎng)絡可以識別輸入數(shù)據(jù)中的復雜模式,并做出準確的預測。

特征圖可視化


這里我們使用TF作為框架進行演示

 ## Importing libraries # Image processing library import cv2 # Keras from tensorflow import keras # In Keras, the layers module provides a set of pre-built layer classes that can be used to construct neural networks. from keras import layers # For ploting graphs and images import matplotlib.pyplot as plt import numpy as np


使用OpenCV導入一張圖像,并將其大小調(diào)整為224 x 224像素。

 img_size = (224, 224) file_name = "./data/archive/flowers/iris/10802001213_7687db7f0c_c.jpg" img = cv2.imread(file_name)      # reading the image img = cv2.resize(img, img_size)


我們添加2個卷積層:

 model = keras.Sequential() filters = 16 model.add(layers.Conv2D(input_shape = (224, 224, 3),filters = filters, kernel_size= 3)) model.add(layers.Conv2D(filters = filters, kernel_size= 3))


從卷積層中獲取過濾器。

 filters, bias = model.layers[0].get_weights() min_filter = filters.min() max_filter = filters.max() filters = (filters - min_filter) / (max_filter - min_filter)p


可視化

 figure = plt.figure(figsize= (10, 20)) filters_count = filters.shape[-1] channels = filters.shape[0] index = 1 for channel in range(channels):     for filter in range(filters_count):         plt.subplot(filters_count, channels, index)         plt.imshow(filters[channel, :, :, filter])         plt.xticks([])         plt.yticks([])         index+=1 plt.show()


圖片
將圖像輸入到模型中得到特征圖





 normalized_img = (img - img.min()) / (img.max() - img.min()) normalized_img =  normalized_img.reshape(-1, 224, 224, 3) feature_map = model.predict(normalized_img)


特征圖需要進行歸一化這樣才可以在matplotlib中顯示

 feature_map = (feature_map - feature_map.min())/ (feature_map.max() - feature_map.min())


提取特征圖并顯示

 total_imgs = feature_map.shape[0] no_features = feature_map.shape[-1] fig = plt.figure(figsize=(10, 50)) index = 1  for image_no in range(total_imgs):     for feature in range(no_features):         # plotting for 16 filters that produced 16 feature maps         plt.subplot(no_features, 3, index)         plt.imshow(feature_map[image_no, :, :, feature], cmap="gray")         plt.xticks([])         plt.yticks([])         index+=1 plt.show()


圖片


總結(jié)


通過可視化CNN不同層的特征圖,可以更好地理解網(wǎng)絡在處理圖像時“看到”的是什么。例如,第一層可能會學習簡單的特征,如邊緣和角落,而后面的層可能會學習更抽象的特征,如特定物體的存在。通過查看特征圖,我們還可以識別圖像中對網(wǎng)絡決策過程重要的區(qū)域。


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



關鍵詞: AI

相關推薦

技術專區(qū)

關閉