可视化CNN和特征图

作者:Ahzam Ejaz

来源:DeepHub IMBA


卷积神经网络(cnn)是一种神经网络,通常用于图像分类、目标检测和其他计算机视觉任务。CNN的关键组件之一是特征图,它是通过对图像应用卷积滤波器生成的输入图像的表示。

e13b29446e61a189592dad30d55d3c27.png


理解卷积层

1、卷积操作

卷积的概念是CNN操作的核心。卷积是一种数学运算,它把两个函数结合起来产生第三个函数。在cnn的上下文中,这两个函数是输入图像和滤波器,而得到的结果就是特征图。

2、卷积的层

卷积层包括在输入图像上滑动滤波器,并计算滤波器与输入图像的相应补丁之间的点积。然后将结果输出值存储在特征映射中的相应位置。通过应用多个过滤器,每个过滤器检测一个不同的特征,我们可以生成多个特征映射。

3、重要参数

Stride:Stride 是指卷积滤波器在卷积运算过程中在输入数据上移动的步长。

Padding:Padding是指在应用卷积操作之前在输入图像或特征映射的边界周围添加额外像素。

Padding的目的是控制输出特征图的大小,保证滤波窗口能够覆盖输入图像或特征图的边缘。如果没有填充,过滤器窗口将无法覆盖输入数据的边缘,导致输出特征映射的大小减小和信息丢失。有两种类型的填充“valid”和“same”。

81a60edbc763148c08d73913021efe2a.png

kernel/filter:kernel(也称为filter 或 weight )是一个可学习参数的小矩阵,用于从输入数据中提取特征。

在下图中,输入图像的大小为(5,5),过滤器filter 的大小为(3,3),绿色为输入图像,黄色区域为该图像的过滤器。在输入图像上滑动滤波器,计算滤波器与输入图像的相应像素之间的点积。Padding是valid (也就是没有填充)。stride值为1。

f80ab3a528a3a600dfda27d00c78a527.gif

4、特征图

特征图是卷积神经网络(CNN)中卷积层的输出。它们是二维数组,包含卷积滤波器从输入图像或信号中提取的特征。

卷积层中特征图的数量对应于该层中使用的过滤器的数量。每个过滤器通过对输入数据应用卷积操作来生成单个特征映射。

特征图的大小取决于输入数据的大小,卷积操作中使用的过滤器、填充和步幅的大小。通常,随着我们深入网络,特征图的大小会减小,而特征图的数量会增加。特征图的大小可以用以下公式计算:

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

这个公式非常重要,因为在计算输出时肯定会用到,所以一定要记住

来自一个卷积层的特征映射作为网络中下一层的输入数据。随着层数的增加,网络能够学习越来越复杂和抽象的特征。通过结合来自多层的特征,网络可以识别输入数据中的复杂模式,并做出准确的预测。


特征图可视化

这里我们使用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导入一张图像,并将其大小调整为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()

55aacdc1fb5e8eda200b5ef4b1a58488.png

将图像输入到模型中得到特征图

 
 
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()

40040f9acc24a583d01bfec4f7f4e87f.png


总结

通过可视化CNN不同层的特征图,可以更好地理解网络在处理图像时“看到”的是什么。例如,第一层可能会学习简单的特征,如边缘和角落,而后面的层可能会学习更抽象的特征,如特定物体的存在。通过查看特征图,我们还可以识别图像中对网络决策过程重要的区域。

END

欢迎加入Imagination GPU与人工智能交流2群

05a31655a8a72a4dbdda3b11dca03044.jpeg

入群请加小编微信:eetrend89

(添加请备注公司名和职称)

推荐阅读

对话Imagination中国区董事长:以GPU为支点加强软硬件协同,助力数字化转型

白农:Imagination将继续致力于推进车规半导体IP技术创新和应用

df55701f0538c30ee69b9681c4009fbe.jpeg

Imagination Technologies 是一家总部位于英国的公司,致力于研发芯片和软件知识产权(IP),基于Imagination IP的产品已在全球数十亿人的电话、汽车、家庭和工作 场所中使用。获取更多物联网、智能穿戴、通信、汽车电子、图形图像开发等前沿技术信息,欢迎关注 Imagination Tech!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值