当前位置: 首页 > article >正文

动手学深度学习——FCN代码

这一篇的重点是把上一篇的 FCN 思想真正落到代码上。也就是看清楚这几件事怎么用预训练分类网络做骨干怎么把最后的分类头改成分割头为什么要加1×1卷积怎么用转置卷积把输出恢复到原图大小最后如何得到像素级预测结果下面我直接给你一版适合发 CSDN 的正文。动手学深度学习——FCN代码1. 前言上一篇我们已经学习了FCN全卷积网络的基本思想。FCN 的核心可以概括为去掉传统分类网络中的全连接层保留卷积结构使用1×1卷积完成类别映射使用转置卷积恢复空间分辨率最终实现像素级分类但如果只理解概念还是不够。这一节我们就结合代码真正把 FCN 的实现流程串起来。这也是《动手学深度学习》里非常典型的风格先讲清楚原理再通过简洁代码把整个模型搭起来。2. FCN 代码的整体思路李沐这里实现 FCN核心思路其实非常清晰第一步加载预训练卷积网络通常使用已经在分类任务上训练好的网络作为特征提取骨干。第二步去掉最后的全连接分类层因为语义分割不需要整图分类输出而需要空间预测图。第三步加入1×1卷积层把高维特征映射到类别数通道。第四步加入转置卷积层把较小的特征图恢复到接近原图大小。第五步输出每个像素的类别分数最终就能得到语义分割结果。所以整套代码其实是在做一件事把分类网络改造成分割网络。3. 加载预训练网络李沐这里常见的做法是直接用 torchvision 里的 ResNet 作为骨干网络例如import torch from torch import nn from torchvision import models pretrained_net models.resnet18(weightsmodels.ResNet18_Weights.DEFAULT)这里的pretrained_net就是一个已经在 ImageNet 上训练过的分类模型。为什么要这么做因为预训练网络已经学到了比较强的图像特征提取能力比如边缘纹理形状更高层语义模式所以在做语义分割时不需要从零开始训练整个特征提取部分。4. 为什么不能直接用原始 ResNet 做分割ResNet 原本是做图像分类的。它最后的输出流程一般是卷积特征提取全局平均池化全连接层输出类别但语义分割需要的是保留空间结构并输出每个位置的类别预测所以原本的全局平均池化全连接层这些都会把空间信息压缩掉不适合分割任务。因此必须对网络进行改造。5. 截取卷积主干部分常见写法如下net nn.Sequential(*list(pretrained_net.children())[:-2])这一行非常关键。它在做什么pretrained_net.children()会把 ResNet 的各个子模块按顺序取出来。而[:-2]表示去掉最后两个模块对于 ResNet 来说最后两个通常是全局平均池化层全连接层所以这一句的意义就是保留卷积特征提取部分去掉分类头。这样net的输出就不再是单个类别向量而是一个二维特征图。6. 验证主干网络输出形状例如我们可以喂一个输入看看X torch.rand(size(1, 3, 320, 480)) Y net(X) Y.shape如果使用 ResNet18输出通常会是torch.Size([1, 512, 10, 15])这说明输入图像大小是320 × 480经过卷积和下采样后特征图变成了10 × 15通道数为512这意味着什么说明网络已经把图像压缩得很厉害了虽然语义特征更强了但空间分辨率也明显降低了。所以后面必须进行上采样。7. 加入1×1卷积做类别预测假设我们的分割任务有 21 个类别例如 VOC 数据集那么就需要把512个通道映射成21个类别通道。常见写法如下num_classes 21 net.add_module(final_conv, nn.Conv2d(512, num_classes, kernel_size1))这里的1×1卷积层非常重要。它的作用是对每个空间位置上的 512 维特征做线性变换输出 21 个类别分数。也就是说对于特征图上的每个位置这一层都会预测属于背景的分数属于飞机的分数属于自行车的分数...属于第 21 类的分数所以1×1卷积本质上就是逐像素分类器8. 为什么1×1卷积特别适合这里因为我们现在不是想继续扩大感受野而是想对每个位置已有的通道特征做“类别变换”。1×1卷积刚好能实现这一点不改变空间尺寸只改变通道数对每个位置独立地做特征映射所以它非常适合作为分割头中的类别预测层。9. 加入转置卷积恢复分辨率前面输出特征图是[1, 21, 10, 15]但原图是[1, 3, 320, 480]显然10 × 15太小了不能直接作为最终分割结果。所以需要把它上采样回去。常见写法如下net.add_module( transpose_conv, nn.ConvTranspose2d(num_classes, num_classes, kernel_size64, padding16, stride32) )这一层就是转置卷积层。它的作用是把10 × 15的低分辨率类别特征图恢复到320 × 480左右的高分辨率预测图。10. 为什么这里输入输出通道数都是num_classes这一点很值得解释。在转置卷积之前特征图已经被1×1卷积变成了通道数 类别数也就是说每个通道都对应一个类别得分图。那么转置卷积此时要做的不再是重新提特征而是把这些类别得分图放大回更高分辨率所以输入输出通道数都可以保持为num_classes。换句话说1×1卷积负责“把特征变成类别得分”转置卷积负责“把类别得分图放大”11. 验证完整 FCN 输出形状完整模型后我们可以再跑一次X torch.rand(size(1, 3, 320, 480)) Y net(X) Y.shape输出通常是torch.Size([1, 21, 320, 480])这就很关键了。它说明对于一张320 × 480的图片模型输出了一个21 × 320 × 480的张量也就是说对于图像中的每一个像素位置模型都会输出 21 个类别分数。接着只需要在类别维度上取最大值就能得到最终类别图。12. 最终像素预测结果怎么得到假设模型输出为Y.shape (N, C, H, W)其中N是 batch sizeC是类别数H, W是空间尺寸那么最终预测类别图可以通过pred Y.argmax(dim1)得到。这样pred.shape (N, H, W)其中每个位置的值就是该像素预测的类别编号。这就完成了语义分割模型最核心的一步从类别分数图变成像素类别图。13. 转置卷积权重为什么常常初始化成双线性插值李沐这里还有一个很经典的点就是用双线性插值的方式初始化转置卷积核因为转置卷积本质上承担的是上采样任务。如果一开始权重完全随机放大结果可能很乱。所以更合理的做法是先让它像一个“比较平滑的插值器”再在训练过程中继续学习更合适的参数常见会写一个函数来生成双线性插值核例如def bilinear_kernel(in_channels, out_channels, kernel_size): factor (kernel_size 1) // 2 if kernel_size % 2 1: center factor - 1 else: center factor - 0.5 og (torch.arange(kernel_size).reshape(-1, 1), torch.arange(kernel_size).reshape(1, -1)) filt (1 - torch.abs(og[0] - center) / factor) * \ (1 - torch.abs(og[1] - center) / factor) weight torch.zeros((in_channels, out_channels, kernel_size, kernel_size)) weight[range(in_channels), range(out_channels), :, :] filt return weight然后把这个权重赋给转置卷积层。14. 为什么这种初始化合理因为语义分割里上采样至少应该先具备一个“平滑放大”的能力。而双线性插值正是经典的上采样方式之一。所以这种初始化相当于告诉模型一开始你先别乱学先像一个合理的插值器那样工作。然后训练再逐步把它调整成更适合当前任务的上采样核。这是一种非常实用的工程技巧。15. FCN 代码的完整逻辑可以怎么记这一节代码其实可以浓缩成一条清晰主线第一步拿预训练 ResNet 做骨干保留强大的卷积特征提取能力。第二步去掉分类头因为分割不需要整图分类。第三步加1×1卷积把高维特征变成每个类别的分数图。第四步加转置卷积把低分辨率分数图恢复到原图大小。第五步逐像素取最大类别得到最终分割预测图。只要把这五步记住FCN 代码整体就不容易乱。16. FCN 为什么说是“把分类网络改成分割网络”的典型代表这一节代码特别能体现 FCN 的思想本质它并没有重新设计一个完全陌生的新网络而是在已有分类 CNN 基础上做结构改造这说明一个很重要的深度学习思路许多视觉任务之间并不是完全割裂的它们常常能共享底层特征提取结构只是在输出层和任务头上做调整。FCN 就是这种“任务迁移式网络改造”的经典案例。17. 这一节代码最该掌握什么如果从学习重点来看这篇最需要掌握的是下面几件事。17.1[:-2]去掉分类头明白为什么要截断预训练网络。17.21×1卷积映射类别明白为什么它是逐像素分类器。17.3 转置卷积恢复分辨率明白它为什么是 FCN 输出高分辨率预测图的关键。17.4 输出张量形状含义搞清楚(N, C, H, W)表示什么。17.5argmax(dim1)的作用知道最终怎么把类别分数图变成预测类别图。18. 本节总结这一节我们学习了 FCN 的代码实现核心内容可以总结为以下几点。18.1 FCN 常用预训练分类网络做骨干例如 ResNet可以直接复用其卷积特征提取部分。18.2 去掉分类头后保留空间特征图这是从分类网络转向分割网络的关键第一步。18.31×1卷积负责输出类别分数图把每个空间位置的高维特征映射到类别维度。18.4 转置卷积负责上采样把较小的类别分数图恢复到原图大小。18.5 最终通过argmax得到像素级类别预测图从而完成语义分割。19. 学习感悟这一节非常有代表性因为它让我们真正看到一个经典模型并不一定复杂到看不懂关键是要能把它拆成几个功能明确的模块。FCN 代码其实并不花哨但思想很强用成熟分类网络提特征用1×1卷积做逐位置分类用转置卷积恢复空间尺寸整个过程非常有“工程拼装感”同时又很优雅。这也是为什么 FCN 在深度学习视觉发展史里地位很高。

相关文章:

动手学深度学习——FCN代码

这一篇的重点是把上一篇的 FCN 思想真正落到代码上。 也就是看清楚这几件事:怎么用预训练分类网络做骨干怎么把最后的分类头改成分割头为什么要加 11 卷积怎么用转置卷积把输出恢复到原图大小最后如何得到像素级预测结果下面我直接给你一版适合发 CSDN 的正文。动手…...

从Bellman-Ford到SPFA:图解最短路径算法的优化之路

从Bellman-Ford到SPFA:图解最短路径算法的优化之路 在解决单源最短路径问题时,算法选择往往需要在效率与通用性之间寻找平衡。Bellman-Ford算法以其处理负权边的能力著称,但其固定时间复杂度的特性使其在某些场景下显得效率不足。而SPFA&…...

用DDRNet-23-slim在RTX 3060笔记本上搞定细胞图像分割:从数据标注到模型测试的完整避坑记录

在RTX 3060笔记本上实现细胞图像分割:DDRNet-23-slim实战全流程解析 当我在生物实验室第一次看到显微镜下的细胞图像时,立刻被那些复杂的结构吸引了。作为一名刚接触医学图像处理的研究生,我迫切希望能用AI技术自动识别不同类型的细胞。但实验…...

Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接芬

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

告别繁琐手动配置:OpCore-Simplify 三步搞定黑苹果 EFI 自动生成

告别繁琐手动配置:OpCore-Simplify 三步搞定黑苹果 EFI 自动生成 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果系统配置的复…...

SOA架构实战:从企业服务总线(ESB)到微服务的演进之路

SOA架构实战:从企业服务总线(ESB)到微服务的演进之路 当企业IT系统从单体架构迈向分布式架构时,SOA(面向服务的架构)曾是最重要的技术范式之一。然而随着云计算和容器技术的普及,传统的ESB(企业服务总线&am…...

猫抓浏览器扩展终极指南:如何快速免费下载任何在线视频资源

猫抓浏览器扩展终极指南:如何快速免费下载任何在线视频资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-catch…...

别只盯着IV曲线!用Silvaco TCAD深挖电阻仿真的5个隐藏玩法

别只盯着IV曲线!用Silvaco TCAD深挖电阻仿真的5个隐藏玩法 在半导体器件仿真领域,电阻模型常被视为入门级的"Hello World"案例。但正是这种看似简单的结构,往往蕴含着最基础却最容易被忽视的物理本质。本文将带你跳出标准例程的框…...

终极指南:如何让Mac原生支持MKV等视频格式的Finder预览和缩略图

终极指南:如何让Mac原生支持MKV等视频格式的Finder预览和缩略图 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https…...

终极指南:EuroSAT数据集深度解析与遥感图像分类性能优化

终极指南:EuroSAT数据集深度解析与遥感图像分类性能优化 【免费下载链接】EuroSAT EuroSAT: Land Use and Land Cover Classification with Sentinel-2 项目地址: https://gitcode.com/gh_mirrors/eu/EuroSAT EuroSAT数据集是遥感图像分类领域的重要基准&…...

终极指南:用wiliwili在Switch等游戏主机上解锁B站全功能体验

终极指南:用wiliwili在Switch等游戏主机上解锁B站全功能体验 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 还在为S…...

突破帧率限制:WaveTools鸣潮工具箱的架构设计与性能调优实践

突破帧率限制:WaveTools鸣潮工具箱的架构设计与性能调优实践 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 在PC游戏性能优化领域,帧率解锁、画质调节和数据可视化是三个核心技术挑…...

解密智能媒体嗅探:高效捕获网页资源的终极方案

解密智能媒体嗅探:高效捕获网页资源的终极方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓插件是一款功能强大的浏览器资源嗅探…...

dbgpt7.0 docker部署实战:从基础配置到高级定制

1. 环境准备与基础部署 DB-GPT 7.0作为新一代企业级AI开发框架,其Docker化部署方案大幅降低了使用门槛。我们先从最基础的运行环境搭建说起,这里我推荐使用Ubuntu 22.04 LTS作为宿主系统,这个版本对NVIDIA GPU的支持最为友好。实测在16GB内存…...

从RTL到ATPG:手把手带你走一遍Tessent Shell的Flat Design DFT完整流程(含避坑点)

从RTL到ATPG:Tessent Shell Flat Design DFT全流程实战指南 在芯片设计领域,测试设计(DFT)正变得越来越关键。随着工艺节点不断演进,芯片复杂度呈指数级增长,传统的人工测试方法已无法满足现代SoC的测试需求。Mentor Graphics&…...

告别环境配置焦虑:保姆级教程搞定博流BL616 RISC-V开发环境(Win/Linux双平台)

从零征服RISC-V:BL616双平台开发环境全攻略 第一次接触博流BL616这类RISC-V芯片时,最令人头疼的莫过于开发环境的搭建。不同操作系统下的工具链差异、晦涩难懂的交叉编译概念、复杂的路径配置……这些门槛让不少开发者望而却步。本文将彻底解决这些问题…...

Z-Image-Turbo_Sugar脸部Lora提示词进阶:融合服饰/妆容/光影的Sugar风格组合技

Z-Image-Turbo_Sugar脸部Lora提示词进阶:融合服饰/妆容/光影的Sugar风格组合技 1. 快速上手Sugar脸部Lora模型 如果你已经部署好了Z-Image-Turbo_Sugar脸部Lora模型,现在最想知道的一定是怎么用它生成更好看的Sugar风格脸部图片。这个模型专门针对那种…...

Z-Image-Turbo保姆级部署教程:3步搞定,16G显卡就能跑出照片级AI画作

Z-Image-Turbo保姆级部署教程:3步搞定,16G显卡就能跑出照片级AI画作 1. 为什么选择Z-Image-Turbo Z-Image-Turbo是阿里巴巴通义实验室开源的高效AI图像生成模型,作为Z-Image的蒸馏版本,它带来了几个令人惊喜的特性: …...

当AI变成“奶奶”:大型语言模型的情感化漏洞与安全博弈

1. 当AI学会"哄孙子":揭秘"奶奶漏洞"的温情陷阱 去年测试ChatGPT时,我让模型扮演临终前的祖母,结果它真的开始用颤抖的语调回忆"我们"的童年往事。这个看似温馨的场景背后,藏着大型语言模型最危险的…...

别再明文传手机号了!一个登录Session搞定SM2国密加密,保护前端查询条件完整流程

敏感数据加密传输实战:基于SM2国密算法的前端查询条件保护方案 在数字化业务快速发展的今天,数据安全已成为开发者不可忽视的核心议题。特别是涉及用户手机号、身份证号等敏感信息的传输,传统的明文方式存在严重安全隐患。本文将介绍一种轻量…...

FinalBurn Neo:开启你的街机复古游戏宝库之旅

FinalBurn Neo:开启你的街机复古游戏宝库之旅 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo 你是否曾怀念那些在街机厅度过的美好时光?那些投币、摇杆、按键的清脆声响&#xf…...

终极指南:如何用wiliwili在游戏主机上打造完美B站观影体验 [特殊字符][特殊字符]

终极指南:如何用wiliwili在游戏主机上打造完美B站观影体验 🎮📺 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending…...

G-Helper:华硕笔记本性能调校的终极轻量级解决方案

G-Helper:华硕笔记本性能调校的终极轻量级解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar,…...

S7-1200与S7-1500的Profinet IO通信实战:从硬件配置到数据传输全流程解析

S7-1200与S7-1500的Profinet IO通信实战:从硬件配置到数据传输全流程解析 在工业自动化领域,稳定可靠的设备通信是实现智能制造的基础。作为西门子PLC家族中的主力机型,S7-1200和S7-1500系列控制器凭借其出色的性能和灵活的通信能力&#xff…...

ACE-Step入门指南:零基础小白也能玩的AI音乐生成工具

ACE-Step入门指南:零基础小白也能玩的AI音乐生成工具 1. 什么是ACE-Step? ACE-Step是一款由ACE Studio与阶跃星辰联合推出的开源音乐生成模型。它最大的特点就是让音乐创作变得像打字一样简单——不需要懂乐理、不需要会乐器,只要输入文字描…...

终极免费虚拟光驱解决方案:WinCDEmu完整使用指南

终极免费虚拟光驱解决方案:WinCDEmu完整使用指南 【免费下载链接】WinCDEmu 项目地址: https://gitcode.com/gh_mirrors/wi/WinCDEmu 还在为找不到光驱而烦恼吗?还在为ISO文件无法直接访问而困扰吗?WinCDEmu为您提供了一站式的虚拟光…...

探索游戏文本提取新境界:Textractor实战指南

探索游戏文本提取新境界:Textractor实战指南 【免费下载链接】Textractor Extracts text from video games and visual novels. Highly extensible. 项目地址: https://gitcode.com/gh_mirrors/te/Textractor 你是否曾经遇到过这样的情况?玩一款精…...

Lychee-Rerank与Node.js后端集成指南:构建高性能排序服务

Lychee-Rerank与Node.js后端集成指南:构建高性能排序服务 如果你正在用Node.js开发一个搜索或者推荐系统,是不是经常遇到这样的问题:用户搜“苹果”,结果既出现了水果,也出现了手机,甚至还有电影&#xff…...

App-Installer:如何在iOS设备上告别电脑,轻松安装第三方应用?

App-Installer:如何在iOS设备上告别电脑,轻松安装第三方应用? 【免费下载链接】App-Installer On-device IPA installer 项目地址: https://gitcode.com/gh_mirrors/ap/App-Installer 你是否曾在手机上找到一款心仪的IPA文件&#xff…...

从零构建低延迟LLM服务:冷启动优化必须掌握的6个底层机制——CUDA Graph复用、PagedAttention预占、FlashAttention内核绑定

第一章:大模型工程化中的冷启动优化 2026奇点智能技术大会(https://ml-summit.org) 大模型在首次部署或新任务接入时,常面临推理延迟高、首 token 时间(TTFT)超长、显存预热不足等典型冷启动问题。这些问题源于权重未加载至 GPU …...