从‘猫片’到‘乱码’:跟着PyTorch走完CNN 48层,揭秘特征图消失的真相
当你第一次看到卷积神经网络(CNN)处理图像的过程,可能会觉得既神奇又困惑。一张清晰的猫片,经过几十层卷积操作后,最终变成了一堆看似毫无意义的乱码。这背后到底发生了什么?为什么网络能从这些"乱码"中准确识别出猫?本文将带你深入ResNet-50的48层结构,用PyTorch代码一步步追踪特征图的演变过程,揭示CNN如何通过"信息蒸馏"实现高效识别。
1. 准备工作:搭建特征图可视化环境
要观察特征图的变化,我们需要一个能实时提取各层输出的PyTorch工具链。这里使用ResNet-50作为示例模型,因为它具有清晰的层级结构和广泛的应用基础。
首先安装必要的库:
python复制pip install torch torchvision matplotlib numpy
然后创建一个特征图提取器:
python复制import torch
import torch.nn as nn
from torchvision.models import resnet50
import matplotlib.pyplot as plt
class FeatureExtractor(nn.Module):
def __init__(self):
super().__init__()
self.model = resnet50(pretrained=True)
self.features = []
# 注册hook捕获各层输出
layers = [self.model.layer1, self.model.layer2,
self.model.layer3, self.model.layer4]
for layer in layers:
layer.register_forward_hook(
lambda m, inp, out: self.features.append(out)
)
def forward
