torch-residual-networks

GitHub
581 146 较难 1 次阅读 3周前Zlib图像开发框架
AI 解读 由 AI 自动生成,仅供参考

torch-residual-networks 是基于 Torch 框架对经典论文《Deep Residual Learning for Image Recognition》的开源实现,旨在复现由何恺明等人提出、并荣获 2015 年 ILSVRC 和 COCO 挑战赛冠军的残差网络(ResNet)架构。该工具核心解决了深度神经网络中随着层数增加而出现的梯度消失及模型退化难题,通过引入“残差学习”机制,让深层网络更容易训练且性能更优。

目前,torch-residual-networks 已在 CIFAR 数据集上验证了其有效性,能够稳定收敛并复现论文中的关键实验结果,包括不同模型尺寸、架构变体及优化策略对性能的影响分析。虽然 ImageNet 的大规模训练功能尚在完善中,但其提供的详细实验日志、误差曲线及预训练模型 artifacts,为研究者复现结果提供了极大便利。

这款工具特别适合计算机视觉领域的研究人员和深度学习开发者使用。它不仅帮助使用者快速上手残差网络结构,还支持通过修改代码探索不同的超参数配置(如批归一化动量、替代求解器等)。对于希望深入理解深度残差学习原理或在自定义图像识别任务中应用 ResNet 的技术人员来说,torch-residual-networks 是一个兼具教育意义与实用价值的参考基准。

使用场景

某计算机视觉初创团队正致力于开发一套高精度的工业缺陷检测系统,需要在有限的标注数据上训练极深的神经网络以识别微小瑕疵。

没有 torch-residual-networks 时

  • 深层网络难以收敛:尝试构建超过 20 层的自定义卷积网络时,梯度消失问题严重,模型在 CIFAR-10 数据集上的测试错误率居高不下,无法复现论文中的高性能。
  • 实验复现成本高昂:缺乏经过验证的残差块(Residual Block)标准实现,工程师需花费数周时间手动调试架构细节,且难以确定是代码错误还是算法局限。
  • 训练过程不稳定:在使用不同优化器(如 RMSprop 或 Adagrad)时,损失曲线波动剧烈,缺乏像 Batch Normalization 与残差结构结合后的稳定训练表现。
  • 资源浪费严重:由于架构设计不当,显存占用过高且训练效率低下,导致在 CUDA 环境下的迭代周期被大幅拉长。

使用 torch-residual-networks 后

  • 轻松突破深度瓶颈:直接调用该工具中已验证的 20 层及以上残差网络架构,在 CIFAR-10 上快速复现了低至 8.29% 的测试错误率,成功解决了梯度消失难题。
  • 开箱即用的可靠基线:利用其提供的完整训练脚本和预调参策略(如学习率衰减计划),团队将模型搭建与验证时间从数周缩短至几天,立即获得可信赖的性能基准。
  • 训练稳定且高效:借助工具集成的 cudnn.SpatialBatchNormalization 和优化后的残差连接策略,模型在深层训练时损失曲线平滑收敛,显著提升了调试效率。
  • 透明可复现的实验资产:直接参考其开源的训练日志、误差曲线及保存模型,团队能快速定位自身数据差异,避免了重复造轮子带来的算力浪费。

torch-residual-networks 通过将顶会获奖算法转化为可执行的 Torch 代码,让开发者能站在巨人的肩膀上,以最低成本实现工业级的高精度图像识别。

运行环境要求

操作系统
  • 未说明
GPU

必需 NVIDIA GPU,需支持 CUDA 7.0 及以上

内存

未说明

依赖
notes该项目基于旧的 Torch (Lua) 框架而非 PyTorch 或 Python。安装时需手动克隆并编译 cudnn.torch 库(切换至 R4 分支),并使用 luarocks 安装 nninit。目前仅支持 CIFAR-10 数据集的复现,ImageNet 部分尚未完成。
python不适用 (基于 Lua/Torch)
Torch
cudnn.torch (v4/R4)
nninit
CUDA 7.0+
CuDNN v4+
torch-residual-networks hero image

快速开始

深度残差学习用于图像识别

这是对2015年ILSVRC和COCO挑战赛冠军论文《深度残差学习用于图像识别》(作者:何凯明、张祥雨、任少庆、孙剑)的Torch实现。

已实现的功能: CIFAR数据集可以收敛,与论文一致。

尚未实现的功能: ImageNet数据集。此外,我目前只实现了残差网络瓶颈结构的选项(A)。

目录

更新记录

  • 2016-02-01:添加了他人在ImageNet数据集上关于该架构的初步结果。(我尚未有时间训练ImageNet)
  • 2016-01-21:完成了深层网络上的“替代优化器”实验。这些实验耗时较长。
  • 2016-01-19:
    • 新结果:重新运行了深层网络上的“替代构建块”实验。这些实验的效果更为显著。
    • 增加了目录,以方便查阅。
    • 添加了实验产物(训练损失和测试误差的日志、保存的模型、对源代码所做的补丁等),供希望复现我们结果的好奇者参考。(这些产物在此依据zlib许可证发布。)
  • 2016-01-15:
    • 新的CIFAR结果:我重新运行了所有CIFAR实验并更新了结果。之前存在一些错误:我们仅在训练集的前2,000张图片上进行测试,且是带放回地随机采样。这些新结果随时间推移更加稳定。
  • 2016-01-12:发布CIFAR实验结果。

使用方法

  • 需要至少CUDA 7.0和CuDNN v4。
  • 安装Torch。
  • 安装Torch CuDNN V4库:git clone https://github.com/soumith/cudnn.torch; cd cudnn; git co R4; luarocks make 这将提供cudnn.SpatialBatchNormalization,有助于节省大量内存。
  • 安装nninit:luarocks install nninit
  • 下载 CIFAR 10。 使用--dataRoot <cifar>指定解压后的CIFAR 10文件夹位置。
  • 运行train-cifar.lua

CIFAR:模型大小的影响

本次测试的目标是复现原论文中的图6:

原论文中的图6

我们将模型训练200个epoch(这大约相当于上图中他们的7.8万次迭代)。与原论文相同,我们从0.1的学习率开始,在第80个epoch将其降低到0.01,并在第160个epoch再次降至0.01。

训练损失

训练损失曲线

测试误差

测试误差曲线

模型 我的测试误差 表6中的参考测试误差 实验产物
Nsize=3,20层 0.0829 0.0875 模型损失误差日志,源码提交 + 补丁
Nsize=5,32层 0.0763 0.0751 模型损失误差日志,源码提交 + 补丁
Nsize=7,44层 0.0714 0.0717 模型损失误差日志,源码提交 + 补丁
Nsize=9,56层 0.0694 0.0697 模型损失误差日志,源码提交 + 补丁
Nsize=18,110层,特殊策略¹ 0.0673 0.0661² 模型损失误差日志,源码提交 + 补丁

我们通常可以在0.5%的误差范围内复现论文中的结果。除32层网络外,其他情况下我们的性能都略优于论文中的结果,但这可能只是噪声所致。

¹:对于这次运行,我们在前400次迭代中使用0.001的学习率,随后将其提高到0.1,并按常规方式继续训练。这与原文的结果一致。

²:请注意,论文报告了五次运行中的最佳结果以及平均值。我认为平均值是一种有效的测试协议,但我不喜欢报告“最佳”分数,因为这实际上相当于在测试集上进行训练。(这种报告方式实际上为模型引入了一个额外的参数——从集成中选择哪个模型——而这个参数是针对测试集拟合的)

CIFAR:模型架构的影响

本实验探讨了不同神经网络架构对残差网络内部“构建块”模型的影响。

原始论文使用的“构建块”类似于下图左侧的“参考”模型,包含标准卷积层、批归一化和ReLU激活函数,随后是另一层卷积和批归一化。该架构中唯一有趣的地方在于他们将ReLU放在了加法之后。

我们研究了两种替代策略。

三种不同的CIFAR架构

  • 替代方案1:将批归一化移至加法之后。(中间)这一选择的理由是测试是否对加法的第一项进行归一化是有益的。它源于一种误解,即批归一化总是会将数据归一化为均值为零、方差为1的状态。如果真是如此,构建一个恒等构建块将是不可能的,因为加法的输入始终具有单位方差。然而,事实并非如此。批归一化层具有可学习的缩放和偏置参数,因此输入到批归一化层的数据并不一定会被强制归一化为单位方差。

  • 替代方案2:去掉第二个ReLU。 这一想法的灵感来自于观察到,在参考架构中,输入必须经过ReLU的修改才能传递到输出。这使得恒等连接在技术上几乎不可能实现,因为负数在通过网络的跳跃层时会被始终截断。为了避免这种情况,我们可以将ReLU移到加法之前,或者完全移除它。然而,将ReLU移到加法之前并不正确:这样的架构会确保输出永远不会减少,因为加法的第一个项不可能为负数。另一种选择则是直接移除ReLU,从而牺牲该层的非线性特性。目前尚不清楚哪种方法更好。

为了测试这些策略,我们使用最小的(20层)残差网络模型重复上述实验。

(注:其他实验均采用最左侧的“参考”模型。)

训练损失

测试误差

架构 测试误差
ReLU,BN在加法前(原论文复现) 0.0829
无ReLU,BN在加法前 0.0862
ReLU,BN在加法后 0.0834
无ReLU,BN在加法后 0.0823

所有方法的准确率相差都在0.5%以内。在CIFAR数据集上,移除ReLU并将批归一化移至加法之后似乎带来了一点点改进,但测试误差曲线中的噪声太大,难以可靠地判断出差异。

CIFAR:模型架构对深度网络的影响

上述针对20层网络的实验并未显示出任何显著差异。然而,当评估非常深的网络时,这些差异变得更加明显。我们再次在110层(Nsize=19)网络上重复了上述实验。

训练损失

测试误差

结果:

  • 对于深度网络而言,最好将批归一化置于每个构建块层的加法部分之前。这样可以有效地减少输入跳跃路径上的批归一化操作次数。如果每个构建块之后都紧跟着批归一化,那么就存在一条从输入直接通向输出的路径,这条路径会连续经过多个批归一化层。这可能会带来问题,因为每个批归一化层都不是幂等的(多次批归一化的效果会累积)。

  • 移除每个构建块末端的ReLU层似乎能带来小幅提升(约0.6%)。

架构 测试误差 附带资料
ReLU,BN在加法前(原论文复现) 0.0697 模型损失误差日志,源代码提交 + 补丁
无ReLU,BN在加法前 0.0632 模型损失误差日志,源代码提交 + 补丁
ReLU,BN在加法后 0.1356 模型损失误差日志,源代码提交 + 补丁
无ReLU,BN在加法后 0.1230 模型损失误差日志,源代码提交 + 补丁

ImageNet:模型架构的影响(初步)

@ducha-aiki 正在进行 ImageNet 的初步实验。 对于普通的 CaffeNet 网络,@ducha-aiki 发现将批归一化放在 ReLU 层之后,相比放在之前,可能会带来一点小的提升。

其次,CIFAR-10 上的结果往往与 ImageNet 上的结果相矛盾。例如,在 CIFAR 上,带泄露的 ReLU 优于普通 ReLU,但在 ImageNet 上却表现更差。

@ducha-aiki 的更详细结果请见:https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md

CIFAR:其他训练策略(RMSPROP、Adagrad、Adadelta)

我们能否在带有 Nesterov 动量的基本 SGD 更新规则基础上进一步改进?本次实验旨在探究这一点。普遍的观点认为,其他更新规则至少在初期可能收敛得更快,但从长期来看,它们通常无法超越经过精心调优的 SGD。

训练损失曲线

测试误差曲线

在我们的实验中,采用 Nesterov 动量且学习率为 0.1 的普通 SGD 最终达到了最低的测试误差。有趣的是,学习率为 1e-2 的 RMSPROP 虽然训练损失更低,但却出现了过拟合现象。

策略 测试误差
原论文:SGD + Nesterov 动量,1e-1 0.0829
RMSprop,学习率 = 1e-4 0.1677
RMSprop,1e-3 0.1055
RMSprop,1e-2 0.0945
Adadelta¹,rho = 0.3 0.1093
Adagrad,1e-3 0.3536
Adagrad,1e-2 0.1603
Adagrad,1e-1 0.1255

¹:Adadelta 不使用学习率,因此我们没有沿用论文中的学习率策略,而是让其一直运行直到收敛。

有关这些学习策略的更多细节,请参阅 Andrej Karpathy 的 CS231N 笔记

CIFAR:深度网络上的其他训练策略

深度网络更容易出现过拟合问题。与之前的实验不同,除了学习率为 1e-3 的 Adagrad 外,所有模型的损失都低于 0.1,但测试误差却差异很大。再次证明,使用带有 Nesterov 动量的普通 SGD 能够达到最低的误差。

训练损失

测试误差

求解器 测试误差
网络规模=18,原论文:Nesterov,1e-1 0.0697
网络规模=18,RMSprop,1e-4 0.1482
网络规模=18,RMSprop,1e-3 0.0821
网络规模=18,RMSprop,1e-2 0.0768
网络规模=18,RMSprop,1e-1 0.1098
网络规模=18,Adadelta 0.0888
网络规模=18,Adagrad,1e-3 0.3022
网络规模=18,Adagrad,1e-2 0.1321
网络规模=18,Adagrad,1e-1 0.1145

批归一化动量的影响

在我们的实验中,我们使用了基于指数移动平均的批归一化方法,动量值为 0.1,这意味着每次批次处理时,运行均值和标准差会根据当前批次的数据调整其值的 10%。如果动量值为 1.0,则批归一化层只会基于当前批次计算均值和标准差;而动量值为 0 时,批归一化层将不再累积运行均值和标准差的变化。

严格来说,原始批归一化论文建议在每次更新时都基于整个训练集计算均值和标准差。然而,这在实际操作中耗时过长,因此通常采用指数移动平均的方法。

我们尝试观察批归一化动量是否会对结果产生影响。为此,我们测试了几个不同于默认值的动量参数,并引入了一种“动态”更新策略,即动量设置为 1 / (1+n),其中 n 是迄今为止已见过的批次数量(每完成一个 epoch,n 会重置为 0)。这样一来,在某个 epoch 结束时,批归一化层的运行均值和标准差实际上就相当于在整个训练集上计算得出的。

然而,实验结果表明,这些不同的动量设置并未带来显著差异。

测试误差曲线

策略 测试误差
BN,动量 = 1 仅作趣味尝试 0.0863
BN,动量 = 0.01 0.0835
原论文:BN 动量 = 0.1 0.0829
动态策略,每 epoch 重置 0.0822

待办事项:ImageNet

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架