进一步理解卷积神经网络,对卷积网络可视化

简介: 笔记

随着深度学习的快速发展,卷积神经网络应用于各个方面,图像的分类、目标检测、图像分割等等。很多人,包括自己也是,在刚学习这些内容的时候只是看了相关理论后,然后就把数据集扔进网络开始“炼丹”。但在训练和检测过程中,虽然得到最终的分类或检测效果,却并不知道中间到底发生了什么,神经网络就犹如黑盒一样。所以想把卷积网络的处理过程进一步可视化,更好的理解中间到底发生了什么。也是作为个人学习笔记,欢迎大家讨论学习。


这里先以图像分类为例(目标检测以后有计划再进行整理)。分类网络代码参考b站up主Bubbliiiing(个人很多东西也是和这位大佬学习的,所以关于网络方面的讲解我这里不过多再说


分类主干网络我选用的是经典的VGG16做猫狗分类。下面接入正题。

我们可以通过卷积核对图像逐步提取特征。这里我使用的是pytorch来举例,

先读取图片:

img = plt.imread(r'./cat.jpg')
plt.imshow(img)
plt.show()

image.jpeg

读入的图片为numpy形式,可以用torch.tensor(img,dtype=torch.float32) / 255,转换为tensor形式。此时的图片shape为(H,W,C),需要利用**permute(2, 0, 1).unsqueeze(0)**进行维度的转换。其中unsqueeze(0)就是在最前面加一个维度,即batch_size这一维度。那么此时的图像shape将变为【1,3,H, W】才可进行卷积


设计一个卷积核:nn.Conv2d(3,3,3,1,1)【为了简单为例方便展示,我这里输出还是3通道,卷积核的权重可以自己定义,但这里我使用的默认的,只是为了演示一下】

 conv1 = nn.Conv2d(3,3,3,1,1)
 conv1_img = conv1(img)
 # 下述代码是为了显示卷积后的图像
 img1 = conv1_img.squeeze(0).permute(1,2,0)*255  # 转化维度,并且转化为0~255,数值类型转为uint8
 img1 = img1.detach().numpy()  # tensor 变为numpy
 img1 = img1.astype('uint8')

卷积后的图像如下【每次卷积后的效果是不同的,因为Conv2d权重不是固定值】:

2.png

然后我们在来看下每个通道卷积后提取特征的效果

3.png

可以看到每个通道提取的纹理特征是不一样的,网络在训练过程会不断的更新卷积核的权重,等最终提取到的特征能满足绝大多数猫的特征的时候就可以了,然后将这个权重保存下来就是我们最终得到的权重文件了。


接下来我们再看一下图像进过已经训练好的VGG16分类网络【有关VGG16网络讲解网上有很多资料,我这里不在讲了】

我们先来看下分类效果:4.png

同样的,我们可以看一下网络最终在每个通道提取的特征是什么样的【通道太多,我只展现部分的】,黄色部分都是经过激活函数激活后得到的,可以认为是该通道这一区域有识别的物体。

5.png

可以计算每个通道提取的特征平均值,然后筛选出哪个通道平均特征值最大,再将该通道和原始图像叠加后看看效果图


image.jpeg

image.jpeg

再通过nn.Linear()进行分类,这个分类后的结果是hard target形式,类似这种形式[ 13.6133, -13.4983],预测的是二分类,假如13.6133代表预测的猫,-13.4983代表预测的狗,因为猫得到的值最大,所以得到的分类结果是猫【注意这还不是概率值,需要再经过softmax进行soft操作得到概率值】。然后可以再通过np.max()函数筛选出最大的概率值即可。


实现卷积可视化,有助于我们进一步看到这个“黑盒”中到底发生了什么,进一步理解卷积神经网络。


文章写的比较粗糙,可能还有些地方没有写到,望谅解。

目录
相关文章
|
11天前
|
机器学习/深度学习 编解码 算法
YOLOv5改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】
在YOLOv5的GFLOPs计算量中,卷积占了其中大多数的比列,为了减少计算量,研究人员提出了用EfficientNet代替backbone。本文给大家带来的教程是**将原来的主干网络替换为EfficientNet。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。
|
13天前
|
机器学习/深度学习 编解码 边缘计算
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
本文介绍了如何在YOLOv5中用ShuffleNetV2替换卷积以减少计算量。ShuffleNetV2是一个轻量级网络,采用深度可分离卷积、通道重组和多尺度特征融合技术。文中提供了一个逐步教程,包括ShuffleNetV2模块的代码实现和在YOLOv5配置文件中的添加方法。此外,还分享了完整的代码链接和GFLOPs的比较,显示了GFLOPs的显著减少。该教程适合初学者实践,以提升深度学习目标检测技能。
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
|
2天前
|
机器学习/深度学习 数据可视化 计算机视觉
【YOLOv8改进】MCA:用于图像识别的深度卷积神经网络中的多维协作注意力 (论文笔记+引入代码)
YOLO目标检测专栏介绍了YOLO的创新改进和实战案例,包括多维协作注意力(MCA)机制,它通过三分支架构同时处理通道、高度和宽度注意力,提高CNN性能。MCA设计了自适应组合和门控机制,增强特征表示,且保持轻量化。该模块适用于各种CNN,实验证明其在图像识别任务上的优越性。此外,文章还展示了如何在YOLOv8中引入MCA层的代码实现和相关任务配置。
|
3天前
|
机器学习/深度学习 人工智能 算法
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
17 0
|
5天前
|
机器学习/深度学习 自然语言处理 算法
深入解析深度学习中的卷积神经网络:从理论到实践
深入解析深度学习中的卷积神经网络:从理论到实践
23 0
|
5天前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8 | 卷积模块 | 提高网络的灵活性和表征能力的动态卷积【附代码+小白可上手】
本教程介绍了如何在YOLOv8中使用动态卷积提升网络性能和灵活性。动态卷积利用注意力机制动态选择和组合卷积核,适应输入数据特征,解决了轻量级CNN的局限。文中提供了详细步骤教读者如何添加和修改代码,包括在`conv.py`中添加`Dynamic_conv2d`模块,更新`init.py`、`task.py`和`yaml`配置文件。此外,还分享了完整代码和进阶技巧,帮助深度学习初学者实践目标检测。参考[YOLOv8改进](https://blog.csdn.net/m0_67647321/category_12548649.html)专栏获取更多详情。
|
10天前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8改进 | 融合模块 | 用Resblock+CBAM卷积替换Conv【轻量化网络】
在这个教程中,介绍了如何将YOLOv8的目标检测模型改进,用Resblock+CBAM替换原有的卷积层。Resblock基于ResNet的残差学习思想,减少信息丢失,而CBAM是通道和空间注意力模块,增强网络对特征的感知。教程详细解释了ResNet和CBAM的原理,并提供了代码示例展示如何在YOLOv8中实现这一改进。此外,还给出了新增的yaml配置文件示例以及如何注册模块和执行程序。作者分享了完整的代码,并对比了改进前后的GFLOPs计算量,强调了这种改进在提升性能的同时可能增加计算需求。教程适合深度学习初学者实践和提升YOLO系列模型的性能。
|
13天前
|
机器学习/深度学习 人工智能 算法
食物识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
食物识别系统采用TensorFlow的ResNet50模型,训练了包含11类食物的数据集,生成高精度H5模型。系统整合Django框架,提供网页平台,用户可上传图片进行食物识别。效果图片展示成功识别各类食物。[查看演示视频、代码及安装指南](https://www.yuque.com/ziwu/yygu3z/yhd6a7vai4o9iuys?singleDoc#)。项目利用深度学习的卷积神经网络(CNN),其局部感受野和权重共享机制适于图像识别,广泛应用于医疗图像分析等领域。示例代码展示了一个使用TensorFlow训练的简单CNN模型,用于MNIST手写数字识别。
38 3
|
18天前
|
机器学习/深度学习 算法 PyTorch
卷积神经网络的结构组成与解释(详细介绍)
卷积神经网络的结构组成与解释(详细介绍)
41 0
|
18天前
|
机器学习/深度学习 算法 数据挖掘
深度学习500问——Chapter05: 卷积神经网络(CNN)(4)
深度学习500问——Chapter05: 卷积神经网络(CNN)(4)
28 1