47 转置卷积【动手学深度学习v2】】

news2024/11/20 19:28:15

47 转置卷积【动手学深度学习v2】】

深度学习学习笔记
学习视频:https://www.bilibili.com/video/BV17o4y1X7Jn/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=75dce036dc8244310435eaf03de4e330

转置卷积

卷积不会增大输入的高宽,无法通过padding很好的将高宽增加,卷积不断将图片减小的话,语义分割没法很好的把像素级别输出,于是用到转置卷积,能够很好的把输入高宽增大。

操作:每个数 会跟卷积核中每个元素做乘法,得到多个矩阵,然后将这些矩阵加起来。
在这里插入图片描述

为什么称为“转置”:卷积可以等价于矩阵乘法,转置卷积等价于 转置矩阵再相乘。
如果使用卷积将 4 * 4 变成 2 * 2 的话,你可以使用转置卷积将 2 * 2 变回 4 * 4。
在这里插入图片描述
QA

  1. 转置卷积实现将图片放大。
  2. 转置卷积就是反卷积。
  3. 转置卷积可以实现线性插值,但是转置卷积不仅仅做线性插值。
  4. 语义分割要的是标号,不是一直在变的,卷积不断的sum,通道中存入不同的空间信息,虽然高宽变小但是它做了总结,feature map虽然变小了,但是它的信息并没有丢失。
  5. 不断变大:要对每个像素做预测。
  6. 转置卷积不是还原,只是形状发生变化,不是还原值。
  7. 转置卷积不算是上采样,只是为了得到像素的输出。
  8. 卷积+转置卷积有些encoder和decoder的感觉。

47.2 转置卷积是一种卷积

转置卷积是一种卷积,对输入和核做了重新的排列,卷积一般做下采样,转置卷积做上采样。使用同样超参数的卷积核上转置卷积核、卷积是逆变换。
在这里插入图片描述

如何将转置卷积换算为卷积:
列子:输入 2 * 2 核 2 * 2 ,对输入上下左右填充 k -1 (蓝色区域),核做上下左右翻转,然后做正常的卷积,得到 3 * 3 输出 就等价于 转置卷积的输出。
在这里插入图片描述
填充为 p :输入填充 k - p - 1(k 是核窗口),核矩阵同样做上下左右的翻转,然后做卷积(填充为0 ,步幅为1)。
假设填充为p 步幅为1 :在行和列之间插入 s - 1(蓝色部分),再填充 边上,然后卷积得到 4 * 4 输出。
在这里插入图片描述
形状换算
卷积是 + 2p这里有错误
在这里插入图片描述
在这里插入图片描述

转置卷积

import torch
from torch import nn
from d2l import torch as d2l

实现基本的转置卷积运算

# 实现转置卷积的公式 K : kernel(卷积核)
def trans_conv(X, K):
    h, w = K.shape
    # X.shape[0] + h - 1 转置卷积之后的形状(卷积是X.shape[0]-h+1)
    Y = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))
    for i in range(X.shape[0]):
        for j in range(X.shape[1]):
            # 计算
            Y[i:i + h, j:j + w] += X[i, j] * K
    return Y

验证上述实现输出

X = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
trans_conv(X, K)
tensor([[ 0.,  0.,  1.],
        [ 0.,  4.,  6.],
        [ 4., 12.,  9.]])

使用高级API获得相同的结果

# 1 批量大小 1 通道数
X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 2, 2)
# ConvTranspose2d 转置卷积  1, 1 输入输出通道数 bias=False 不需要偏差
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)
tconv.weight.data = K
tconv(X)
tensor([[[[ 0.,  0.,  1.],
          [ 0.,  4.,  6.],
          [ 4., 12.,  9.]]]], grad_fn=<SlowConvTranspose2DBackward>)

填充、步幅和多通道

# 这里 padding 输出减小了
# 用填充到输出的最外面一圈,这样输出从 3 * 3 变成 1* 1
# 计算公式与卷积相反:x + w - 1 - padding = 2 + 2 -1 -2 = 1
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, padding=1, bias=False)
tconv.weight.data = K
tconv(X)
tensor([[[[4.]]]], grad_fn=<SlowConvTranspose2DBackward>)
# stride=2 增大stride会把输出变大,2 * 2 变成 4 * 4
# 卷积是除以stride, 转置卷积是 乘以 stride
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, stride=2, bias=False)
tconv.weight.data = K
tconv(X)
tensor([[[[0., 0., 0., 1.],
          [0., 0., 2., 3.],
          [0., 2., 0., 3.],
          [4., 6., 6., 9.]]]], grad_fn=<SlowConvTranspose2DBackward>)
# 多通道没有变化
X = torch.rand(size=(1, 10, 16, 16))

conv = nn.Conv2d(
    10, 20, kernel_size=5, padding=2, stride=3)
tconv = nn.ConvTranspose2d(
    20, 10, kernel_size=5, padding=2, stride=3)
tconv(conv(X)).shape == X.shape
True

与矩阵变换的联系

X = torch.arange(9.0).reshape(3, 3) # 3 * 3
K = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) * 2 * 2 kernel
Y = d2l.corr2d(X, K) # 卷积
Y
tensor([[27., 37.],
        [57., 67.]])
# 变成 V 矩阵 构造 4 * 9 的矩阵
def kernel2matrix(K):
    k, W = torch.zeros(5), torch.zeros((4, 9))
    k[:2], k[3:5] = K[0, :], K[1, :]
    W[0, :5], W[1, 1:6], W[2, 3:8], W[3, 4:] = k, k, k, k
    return W

W = kernel2matrix(K)
W
tensor([[1., 2., 0., 3., 4., 0., 0., 0., 0.],
        [0., 1., 2., 0., 3., 4., 0., 0., 0.],
        [0., 0., 0., 1., 2., 0., 3., 4., 0.],
        [0., 0., 0., 0., 1., 2., 0., 3., 4.]])
# reshape成一个向量
Y == torch.matmul(W, X.reshape(-1)).reshape(2, 2)
tensor([[True, True],
        [True, True]])
# Y 对 K 做转置卷积 等价于 W.T reshape为3 * 3
Z = trans_conv(Y, K)
Z == torch.matmul(W.T, Y.reshape(-1)).reshape(3, 3)
tensor([[True, True, True],
        [True, True, True],
        [True, True, True]])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python小游戏】99%的人都不知道,“猜数字”游戏这么玩才能快速胜出,少年,要不要来猜猜看啊~(附源码)

前言 日子从不亏欠&#xff0c;每一个努力向上的人&#xff0c; 未来的走运, 都是过往尽力的积累。 人勤春来早&#xff0c;奋进正当时。新春伊始&#xff0c;我们迎来了2023年开工第一天。 栗子同学恭祝大家开工大吉&#xff0c;新年新气象&#xff0c;万事开门红&#xff…

Spring事务案例:模拟银行转账

Spring事务案例&#xff1a;模拟银行转账一. 概念二. 原程序2.1 表&#xff1a;2.2 service层接口&#xff1a;2.3 dao层接口&#xff1a;2.4 service实现类&#xff1a;2.5 测试用例&#xff1a;三.使用事务改进3.1 开启注解式事务驱动&#xff1a;3.2 开启事务&#xff1a;3.…

python使用pptx库-从一个ppt复制页面到另一个ppt里面

python使用pptx库-从一个ppt复制页面到另一个ppt里面 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、原理 如题&#xff0c;我有一个模板课件.pptx&#xff1a; 其内容&#xf…

百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析

前言 百趣代谢组学文献分享&#xff0c;我国受盐碱化危害耕地面积超过1.4亿亩&#xff0c;严重危险粮食安全和三农问题的解决。因此开发耐盐农作物并研究其耐盐机制具有迫在眉睫的重要意义。 代谢组学文献分享&#xff0c;浙江大学吴德志教授研究组最近发表的研究成果比较了耐…

Jmeter之界面语言设置

一、临时性设置中文 临时性设置&#xff1a;设置后只对本次使用有效&#xff0c;重启Jmeter后恢复默认语言。 选择Options—>Choose Language—>选择其他语言&#xff08;例如&#xff1a;Chinese&#xff08;Simplified&#xff09;简体中文&#xff09;设置成功。重启…

32 基变换和图像压缩

一、知识概要 本节主题是线性变换与矩阵的关联&#xff0c;从图像压缩与信号处理的应用引入&#xff0c;介绍几种方便的基向量&#xff1a;傅里叶&#xff0c;小波。最后从代数角度大体上介绍了基变换与变换矩阵的关系。 二、图像处理 首先我们假设有一个 512 * 512 的黑白图…

StarRocks斩获「2022 掘金引力榜」年度技术品牌传播案例 Top 10!

近日&#xff0c;由稀土掘金技术社区打造的「掘金引力榜」正式公布&#xff0c;由StarRocks社区举办的StarRocks Summit Asia 2022荣获「掘金引力榜 2022 年度技术品牌传播案例 Top10」&#xff01;掘金是面向全球中文开发者的技术社区。「掘金引力榜」是由稀土掘金技术社区打造…

【MyBatis持久层框架】配置文件实现增删改查实战案例(下)

前言 前面我们学习了 MyBatis 持久层框架的原生开发方式和 Mapper 代理开发两种方式&#xff0c;解决了使用 JDBC 基础性代码操作数据库时存在的硬编码和操作繁琐的问题。 在配置文件实现增删改查上篇中&#xff0c;我们详细讲解了常用的查询操作&#xff0c;例如查询所有数据…

Spring Boot 项目 - API 文档搜索引擎

在线体验 : http://43.139.1.94:9090/index.html项目 Gitee 链接 : API 文档搜索引擎1.认识搜索引擎我们平时查百度, 搜狗的时候, 结果页会显示若干条相关结果 , 每个结果几乎都包含图片, 标题, 描述, 展示 URL以及时间等等.1.1 搜索引擎的本质输入一个查询词, 得到若干个结果,…

stm32学习笔记-1 STM32简介

1 STM32简介 [toc] 注&#xff1a;笔记主要参考 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注&#xff1a;工程及代码文件放在了本人的Github仓库。 1.1 套件简介 本教程使用STM32最小系统板&#xff08;STM32F103C8T6&#xff09;面包板硬件平台进行学习。…

微信小程序 Springboot校园自动点餐系统带跑腿 java

开发语言&#xff1a;Java 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 可选运行软件:webapp (hbuiderx) 前端开发语言:vue.js 后端技术:Springboot(SpringSpringMVCMyBatis) 可选技术:springboot 后端开发环境:idea和eclipse都支持 数据库:mysql …

六、服务端开发

服务器端开发&#xff1a;服务器设计框架&#xff1a;缓解和转发的作用连接音箱和app最大一个作用转发一个app操作音箱app绑定音箱服务器类实现&#xff1a;jsoncpplibventverser.h#ifndef SERVER_H #define SERVER_H#include <event.h>#define IP "172.17.7.99&…

【C++入门】缺省参数

目  录1 缺省参数1.1 缺省参数概念1.2 缺省参数分类1.3 缺省参数使用注意1 缺省参数 1.1 缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。 在调用该函数时&#xff0c;如果没有指定实参&#xff0c;则采用该形参的缺省值&#xff0c;否则使用指定的实…

Spring Profiles 实现多环境配置 ,切换环境

Spring Profiles 实现多环境配置 Spring Profiles 就是针对应用程序&#xff0c;不同环境需要不同配置加载的一种解决方案。 使用场景: 我们平常项目开发&#xff0c;经常需要根据不同的环境进行配置的修改&#xff0c;比如在本地开发会加载本机的配置和开发环境数据库&#x…

【NKOJ-昨天今天和明天】考试游记

目录 昨天上午的序列 - 30pts今天上午的扫除 - 100pts明天上午的教室 - 100pts明天上午的数组 - 100pts明天上午的函数 - 100pts 题目排序太合理了,EDCBA依次变难,导致我对着A题苦思冥想了半小时...但是A题是[LeetCode 907. 子数组的最小值之和]的换皮题(除了题目一点没变)然…

初始OAuth2.0

1. 什么是OAuth2.0 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取用户的数据。 举例说明&#xff1a;用户可以通过选择其他登录方式来使用gitee&#xff0c;这里就使用到了第三方认证。 OAuth 引入了一个授权层&#xff0c;用来分离两种不同的角色…

前端工程化

一、前端工程化1、webpack&#xff08;1&#xff09;定义&#xff1a;是一个前端的构建工具。前端代码格式多&#xff08;html、css、js、图片&#xff09;&#xff0c;前端构建工具的作用是将各种格式不同文件打包到一起&#xff0c;方便项目的上线运行。&#xff08;将开发环…

Java学习笔记---干货

Java学习 一、java版本 JavaSE &#xff1a;标准版&#xff08;桌面应用程序、控制台程序&#xff09; JavaEE&#xff1a;E企业级开发&#xff08;Web端&#xff0c;服务器的开发&#xff09; JDK&#xff1a;Java开发工具 JRE&#xff1a;Java运行环境 JVM&#xff1a;…

通信原理笔记—基带信号的功率谱

目录 二进制纯随机序列基带信号的功率谱&#xff1a; 基带信号的功率谱分析&#xff1a; (1)信号(t)的功率谱&#xff1a; (2)信号v(t)的功率谱&#xff1a; 随机序列S(t)的功率谱&#xff1a; 二进制纯随机序列基带信号的功率谱&#xff1a; 基带信号的功率谱分析&#…

软件需求说明书确保正确性的6大关键点

软件需求说明书对软件开发项目非常关键&#xff0c;如何确保其正确性&#xff0c;关键有6大要点&#xff01; 1、需求与其他需求是否相互冲突或重复 一般需求规格说明书长达几百页&#xff0c;并不是一蹴而就的&#xff0c;因此可能出现前后观点的重叠或差异&#xff0c;或同一…