深度学习中的特征图:从低级到高级的特征表示
创作时间:
作者:
@小白创作中心
深度学习中的特征图:从低级到高级的特征表示
引用
CSDN
1.
https://blog.csdn.net/qq_61706514/article/details/144427246
特征图是卷积神经网络(CNN)中非常重要的概念,它反映了网络在不同层次对输入图像的特征表示。从低级特征到高级特征的转变,体现了网络从简单视觉特征到复杂语义信息的逐步抽象过程。本文将通过VGG16模型在不同层次的特征图来详细解释这一过程。
低级特征图
低级特征图包含基础的局部信息,如:
- 边缘:物体轮廓、区域边界
- 颜色:颜色区域分布
- 纹理:物体表面质地、图案
这些特征是图像中最基本的视觉信息,通常在CNN的浅层被提取。
高级特征图
高级特征图包含更抽象的、整体的语义信息,如:
- 物体类别
- 形状和结构:整体形状、部分关系
- 语义关系:物体间空间和功能关系
这些特征通常在CNN的深层被提取,它们是模型进行最终分类决策的重要依据。
用VGG提取不同层次的特征图
为了更直观地理解特征图的变化,我们使用VGG16模型在不同层次提取特征图。以下是具体分析:
第0层(非常浅层,最前面的卷积层)
- 特征类型:基本的边缘、线条、颜色渐变等最简单的视觉特征。
- 特征图表现:图中仍可看到清晰的物体边缘和区域明暗分布。比如,一朵花的轮廓、猫耳朵的轮廓或狗鼻子的亮暗交界线,都在这里突出。
- 注意点:
- 模型此时就像刚刚睁开眼睛,只能识别最基本的线条、点和颜色差异。
- 整张图到处都有特征响应,因为所有的简单变化(亮度、颜色差别)对模型而言都值得注意。
第5层(浅-中层)
- 特征类型:在简单边缘和颜色基础上,提取稍复杂的纹理和局部图案组合。
- 特征图表现:你会看到边缘信息仍然存在,但开始出现对某些特定方向纹理(如垂直或斜线条组合)的更强反应。
- 注意点:
- 模型不再对所有地方均等敏感,而是更倾向对某些方向或形状组合激活。
- 虽然依然看得出物体的基本轮廓,但已经在更细微的纹理结构上有所偏好。
第10层(中层)
- 特征类型:中等复杂度的图像特征——不再是单纯线条,而是局部更加复杂的纹理块、形状碎片。
- 特征图表现:特征图里出现了一些区域化的激活,有的通道可能对圆点纹理感兴趣,有的对斑点或十字形纹理有明显响应。
- 注意点:
- 模型正在把早期层捕捉到的边缘与简单纹理叠加、混合,构成一些稍有意义的局部特征块。
- 虽然你还看不到清晰的“猫脸”或“狗头”,但模型已经在为后续高层判断建立更复杂的“特征原料”。
第17层(深-中间层)
- 特征类型:更抽象、更复杂的局部结构特征,比第10层更高级。
- 特征图表现:特征图往往是一些零散的小亮点分布在各处。每个小亮点可能代表模型对某种特殊局部模式(例如某类纹理组合或部件轮廓)的偏好。
- 注意点:
- 模型不再对整张图很多地方都激活,而是更有选择性地在某些区域闪现亮点。
- 这些小块特征是模型向高级理解迈进的重要阶段,它正尝试把之前的基础纹理和边缘特征组合成对最终识别很有帮助的局部部件。
第28层(非常深层)
- 特征类型:高度抽象化的特征,接近模型的最终决策线索。
- 特征图表现:非常稀疏的亮点。大部分特征图区域很暗,只有极少数像素变亮。
- 注意点:
- 模型在这里已经过滤掉大量与最终分类无关的信息,只保留关键信号。
- 这些小亮点可能代表了特定物种、物体类别独有的“标志性局部特征”。对分类任务来说,这些点是模型判断“这是只猫”“这是只狗”“这是朵花”的最后证据。
代码实现
以下是使用PyTorch实现VGG16模型特征图提取和可视化的完整代码:
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 加载预训练的VGG16模型
model = models.vgg16(pretrained=True)
model.eval() # 设置模型为评估模式
# 定义图像预处理步骤
preprocess = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], # ImageNet的均值
std=[0.229, 0.224, 0.225]) # ImageNet的标准差
])
# 加载图像
img_path = 'dog and cat.jpg' # 替换为您的图像路径
img = Image.open(img_path).convert('RGB')
# 预处理图像
input_tensor = preprocess(img)
input_batch = input_tensor.unsqueeze(0) # 添加批次维度
# 如果有GPU,可将输入移动到GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
input_batch = input_batch.to(device)
model.to(device)
# 定义一个字典来存储特征图
feature_maps = {}
# 定义钩子函数
def get_activation(name):
def hook(model, input, output):
feature_maps[name] = output.detach()
return hook
# 注册多个层的钩子,以获取浅层-中层-深层特征图
model.features[0].register_forward_hook(get_activation('layer0'))
model.features[5].register_forward_hook(get_activation('layer5'))
model.features[10].register_forward_hook(get_activation('layer10'))
model.features[17].register_forward_hook(get_activation('layer17'))
model.features[28].register_forward_hook(get_activation('layer28'))
# 前向传播
with torch.no_grad():
output = model(input_batch)
# 定义一个函数来可视化特征图
def visualize_feature_map(feature_map, num_channels=8, title='Feature Map'):
# feature_map: [B, C, H, W]
feature_map = feature_map.cpu().squeeze(0) # 移除批次维度
C, H, W = feature_map.shape
# 选择前num_channels个通道进行展示
fig, axes = plt.subplots(1, num_channels, figsize=(20, 5))
for i in range(num_channels):
if i >= C:
break
ax = axes[i]
ax.imshow(feature_map[i], cmap='viridis')
ax.axis('off')
ax.set_title(f'Channel {i+1}')
plt.suptitle(title)
plt.show()
# 可视化不同层次的特征图
if 'layer0' in feature_maps:
visualize_feature_map(feature_maps['layer0'], num_channels=8, title='Very Shallow Layer (Layer 0): Low-Level Features')
if 'layer5' in feature_maps:
visualize_feature_map(feature_maps['layer5'], num_channels=8, title='Shallow-Mid Layer (Layer 5): Transitioning Features')
if 'layer10' in feature_maps:
visualize_feature_map(feature_maps['layer10'], num_channels=8, title='Mid Layer (Layer 10): Mid-Level Features')
if 'layer17' in feature_maps:
visualize_feature_map(feature_maps['layer17'], num_channels=8, title='Deep-Mid Layer (Layer 17): More Abstract Features')
if 'layer28' in feature_maps:
visualize_feature_map(feature_maps['layer28'], num_channels=8, title='Very Deep Layer (Layer 28): High-Level Features')
通过这段代码,你可以清晰地看到VGG16模型在不同层次的特征图表现,从而更好地理解深度学习中的特征提取过程。
热门推荐
张壁古堡:晋中千年古城,古代罕见的袖珍城堡!
天然铀:2024年回顾和2025年展望
探讨动物蛋白来源:肉类消费与健康关系研究
注销式回购比例提升,这些上市公司回购玩得是“真功夫”
存储卡与U盘对比揭秘,性能、容量与使用场景全面解析
十种最适合送亲戚的水果有哪些 买什么水果送亲戚比较体面
老年人呼吸系统常见病有哪些?老年呼吸系统疾病的症状与防治
“改善就医感受 提升患者体验”经验交流首场活动在呼市举行
满月酒为什么不能推迟?
一文搞懂大语言模型的发展历程和未来应用场景
预防秋燥伤肺,4大养生食材保护呼吸道
泰坦尼克号:永恒的传说与精妙模型
买房必看:如何快速确定房屋槽钢层位置?
重晶石行业现状深度剖析:市场规模、供需与未来趋势
如何确定房屋中的槽钢层位置?
盘点骨质疏松十大特效药
每周这样吃饭,能改善脂肪肝?坚持这种饮食,能保护肝脏和改善代谢
二面不想去怎么拒绝
狩猎:为行善事,拿起屠刀?
这味药,可煲汤、可泡茶,能化痰润肺!
单眼皮如何变成双眼皮?
槽钢层漏水影响哪一层,如何处理?
乌鸦反哺:一个成语背后的孝道文化
孙颖莎再获殊荣!入选国际奥委会“最强25”,中国运动员唯一代表
《英雄联盟》登录障碍破解:文件损坏或丢失的成因与修复教程
实用新型专利发明人排序方法及其应用
推进职普融通打破职业教育发展“天花板” 87.6%受访者有信心
DLP和LCoS、3LCD、LCD技术有什么区别,全面分析投影技术特点
考研能源类专业就业前景怎么样
火绒:一种古老的引火材料