一.全卷积网络FCN

1. 介绍

语义分割是对图像中的每个像素分类,全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 ,与前面在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络通过转置卷积层将中间层特征图的高和宽变换回输入图像的尺寸,因此输出的类别预测与输入图像在像素级别上具有一一对应关系:通道维的输出即该位置对应像素的类别预测。

2. 模型构造

如下图所示为全卷积网络模型最基本的设计,全卷积网络先使用卷积神经网络抽取图像特征,然后通过 1×1 卷积层将通道数变换为类别个数(1x1卷积层作用:融合相同空间位置上面的通道信息,改变通道数,减少计算量,能够降低对边缘特征位置(锐化)敏感性),最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。 因此,模型输出与输入图像的高和宽相同,且最终输出通道包含了该空间位置像素的类别预测。

下面使用在ImageNet数据集上预训练的ResNet-18模型来提取图像特征,注意ResNet-18模型的最后几层包括全局平均汇聚层和全连接层,而全卷积网络中不需要它们。

import torch
import d2l.torch
import torchvision
from torch import nn
from torch.nn import functional as F
pretrained_net = torchvision.models.resnet18(pretrained=True)
list(pretrained_net.children())

接下来创建一个全卷积网络net,它复制了ResNet-18中前面大部分的预训练层,除了最后的全局平均汇聚层和全连接层,给定高为320和宽为480的输入,net的前向传播将输入的高和宽减小至原来的 1/32 ,即10和15。

net = nn.Sequential(*list(pretrained_net.children())[:-2])
num_classes = 21
X =torch.rand(size=(1,3,320,480))
Y = net(X)
Y.shape

接下来使用1×11\times11×1卷积层将输出通道数转换为Pascal VOC2012数据集的类数(21类)。最后需要将特征图的高度和宽度增加32倍,从而将其变回输入图像的高和宽。
卷积层输出形状的计算方法:由于(320−64+16×2+32)/32=10(320-64+16\times2+32)/32=10(320−64+16×2+32)/32=10且(480−64+16×2+32)/32=15(480-64+16\times2+32)/32=15(480−64+16×2+32)/32=15,因此构造一个步幅为323232的转置卷积层,并将卷积核的高和宽设为646464,填充为161616。这是因为需要将经过net前向传播后得到的特征图形状大小(h=10,w=15)变为输入的形状大小(h=320,w=480),因此需要将特征图高和宽扩大32倍,根据转置卷积的尺寸形状计算方法(上一篇博客转置卷积计算方法:(李沐动手学深度学习V2-转置卷积和代码实现)),需要满足K = 2P+S条件,由于K=64,S = 32,因此P=16。也即是如果步幅为sss,填充为s/2s/2s/2(假设s/2s/2s/2是整数)且卷积核的高和宽为2s2s2s,转置卷积核会将输入的高和宽分别放大sss倍。

3. 转置卷积初始化

在图像处理中有时需要将图像放大即上采样(upsampling),双线性插值(bilinear interpolation) 是常用的上采样方法之一,它也经常用于初始化转置卷积层。
为了解释双线性插值,假设给定输入图像,计算上采样输出图像上的每个像素。 首先将输出图像的坐标 (

李沐动手学深度学习V2-全卷积网络FCN和代码实现相关推荐

  1. 李沐动手学深度学习v2/总结1

    总结 编码过程 数据 数据预处理 模型 参数,初始化参数 超参数 损失函数,先计算损失,清空梯度(防止有累积的梯度),再对损失后向传播计算损失关于参数的梯度 优化算法,使用优化算法更新参数 训练求参数 ...

  2. 14李沐动手学深度学习v2/权重衰退简洁实现

    # 权重衰退是广泛应用的正则化技术 %matplotlib inline import torch from torch import nn from d2l import torch as d2l ...

  3. 李沐动手学深度学习(pytorch版本)d2lzh_pytorch包的缺少安装问题

    学习深度学习时候,很多人参考的是李沐的动手学深度学习Pytorch版本(附上官方地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/). 在学习3.5.1节 ...

  4. 【李沐动手学深度学习】读书笔记 01前言

    虽然之前已经学过这部分内容和深度学习中的基础知识,但总觉得学的不够系统扎实,所以希望再通过沐神的课程以及书籍,系统条理的学习一遍.在读书过程中,利用导图做了一下梳理,形成了这个读书笔记.如有侵权,请联 ...

  5. 关于李沐动手学深度学习(d2l)pytorch环境本地配置

    本地安装d2l 由于之前试了很多次d2l课本的安装方法失败了,这里提供一种我可以成功安装d2l包的方法. pytorch安装 首先安装cuda.cudnn.pytroch(gpu版本).可以参考这篇文 ...

  6. 李沐动手学深度学习:08 线性回归(代码逐行理解)

    目录 一.相关资料连接 1.1 李沐视频 1.2 代码.PPT 二.代码及笔记(使用Jupyter Notebook) 2.1 线性回归从零开始实现 2.1.1 基本概念 2.1.2 基础优化算法 2 ...

  7. windows上配置深度学习(李沐-动手学深度学习)

    1.安装miniconda windows下安装,去清华大学开源镜像下载,速度比较快. 选中Miniconda3-latest-Windos-x86_64.exe下载安装包(目前最新的是py3.9) ...

  8. 李沐动手学深度学习第四章-4.9.环境和分布偏移

    我们从来没有想过数据最初从哪里来?以及我们计划最终如何处理模型的输出? 根据测试集的精度衡量,模型表现得非常出色. 但是当数据分布突然改变时,模型在部署中会出现灾难性的失败. 解决方案很简单(要求&q ...

  9. 李沐动手学深度学习笔记---含并行连结的网络 GoogLeNet / Inception V3

    Inception块:  Inception块由四条并行路径组成.前三条路径使用窗口大小为1 × 1.3 × 3和5 × 5的卷积层, 从不同空间大小中提取信息.中间的两条路径在输入上执行1 × 1卷 ...

最新文章

  1. JS中字符串的相关操作
  2. 深入理解分布式技术 - ServiceMesh 服务网格
  3. 请写出sfr和sbit的语句格式_习题_C51语言答案
  4. C#中break,continue,return,,goto,throw的区别(转)
  5. 【003】【深入解析Java中volatile关键字的作用】
  6. 第一章 项目管理引论
  7. JavaScript+HTML 实现贪吃蛇简陋版
  8. 文件类型识别工具:TrID(trid)下载安装及使用
  9. 计算机网络arp表作用,arp映射表是什么?有什么作用
  10. Redis下载安装-Windows版本
  11. 最全iOS12捷径库收集整理,iOS12捷径推荐
  12. 攻防世界-logmein
  13. 使用模型压缩库Distiller遇到的问题
  14. Debian 11 安装,超详细!
  15. MySQL数据库管理员用户密码忘记了怎么办?
  16. 关于在word中插入页码以及目录的操作
  17. 【Android SDM660源码分析】- 04 - UEFI ABL LinuxLoader 代码分析
  18. java安全学习(一)
  19. FBI树--字符二叉树
  20. 艾肯Cube 4Nano MicU声卡等型号安装调试教程

热门文章

  1. 大厂面试算法(二)搜索算法
  2. itools安装ipa压缩包
  3. 如何在Qlikview图表表达式中添加多个筛选条件?
  4. <JDBC> 获取数据库连接的五种方式:你真的get到了吗?
  5. 无效库(可能不是php库),ThinkPHP设置了数据库session,写入无效的问题
  6. 11道腾讯微信面试过程的随口题,道道经典,学到就是赚到
  7. 在react中用echarts实现3d地球
  8. 使用 C# 开发智能手机软件:推箱子(四)
  9. DAY 2 循环、随机数练习 - 年会抽奖程序京牌摇号小程序
  10. opencv3和qt5计算机视觉应用开发在线阅览_摄影系统开发多少钱