社区计算机视觉课程文档

ResNet(残差网络)

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

ResNet(残差网络)

人们认为具有更多层的网络更有效,因为添加更多层可以提高模型性能。

随着网络变得更深,提取的特征可以得到进一步丰富,例如在 VGG16 和 VGG19 中看到的。

一个问题出现了:“学习网络是否像堆叠更多层一样容易”?通过归一化初始化和中间归一化层解决了回答这个问题的一个障碍——梯度消失问题。

然而,一个新的问题出现了:退化问题。随着神经网络变得更深,准确率趋于饱和并迅速下降。比较浅层和深层普通网络的实验表明,更深的模型表现出更高的训练和测试误差,这表明在有效训练更深层次的架构方面存在根本性挑战。这种退化并不是由于过拟合造成的,而是因为当网络变得更深时,训练误差会增加。添加的层没有近似于恒等函数。

ResNet 的残差连接释放了极深网络的潜力,与之前的架构相比,准确率大幅提升。

ResNet 架构

  • 残差块。来源:ResNet 论文 residual

ResNet 的构建块设计为恒等函数,保留输入信息的同时支持学习。这种方法确保了有效的权重优化,并防止了网络变得更深时的退化。

ResNet 的构建块可以在图中显示,来源 ResNet 论文。

resnet_building_block

快捷连接执行恒等映射,其输出被添加到堆叠层的输出中。恒等快捷连接既不添加额外的参数也不增加计算复杂度,这些连接绕过层,为信息流创建直接路径,并且它们使神经网络能够学习残差函数 (F)。

我们可以总结 ResNet 网络 -> 普通网络 + 快捷方式!

对于操作 (F(x) + x),(F(x)) 和 (x) 应该具有相同的维度。ResNet 使用两种技术来实现这一点

  • 零填充快捷方式,通过添加具有零值的通道来保持维度,而无需引入需要学习的额外参数。
  • 投影快捷方式,在必要时使用 1x1 卷积来调整维度,这涉及一些额外的可学习参数。

在更深的 ResNet 架构(如 ResNet 50、101 和 152)中,使用专门的“瓶颈构建块”来管理参数复杂度并保持效率,同时支持更深入的学习。

ResNet 代码

在 ImageNet 上预训练的深度残差网络

下面您可以看到如何使用 transformers 库加载带有图像分类头的预训练 ResNet。

from transformers import ResNetForImageClassification

model = ResNetForImageClassification.from_pretrained("microsoft/resnet-50")

model.eval()

所有预训练模型都期望输入图像以类似的方式进行归一化,即形状为 (3 x H x W) 的 3 通道 RGB 图像的小批量,其中 H 和 W 预计至少为 224。图像必须加载到 [0, 1] 的范围内,然后使用均值 = [0.485, 0.456, 0.406] 和标准差 = [0.229, 0.224, 0.225] 进行归一化。

这是一个示例执行。此示例可在 Hugging Face 文档 中找到。

from transformers import AutoFeatureExtractor, ResNetForImageClassification
import torch
from datasets import load_dataset

dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]

feature_extractor = AutoFeatureExtractor.from_pretrained("microsoft/resnet-50")
model = ResNetForImageClassification.from_pretrained("microsoft/resnet-50")

inputs = feature_extractor(image, return_tensors="pt")

with torch.no_grad():
    logits = model(**inputs).logits

# model predicts one of the 1000 ImageNet classes
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])

参考文献

< > 在 GitHub 上更新