下采样方法

2023-11-05

AntiAliasInterpolation2d代码解读

注记

最近在看一些视频驱动的代码时,常见一种特殊的下采样方法,故在这里记录一下。

Class AntiAliasInterpolation2d(nn.Module):
	## 初始化
	def __init__(self, channels, scale):
		## channels
		## scale: 下采样比例 取 < 1, 这里假设取0.5
		super(AntiAliasInterpolation2d, self).__init__()
		sigma = (1 / scale - 1) / 2  ## 0.5
		kernel_size = 2* round(sigma * 4) + 1 ## 5
		self.ka = kernel_size // 2 ## 2
		self.kb = self.ka - 1 if kernel_size % 2 == 0 else self.ka ## 2
		kernel_size = [kernel_size, kernel_size] ##[5, 5]
		sigma = [sigma, sigma]   ## [0.5, 0.5] 
		kernel = 1
		meshgrids = torch.mershgrid(   ## size: (2, 5, 5)
			[	
				torch.arange(size, dtype=torc.float32)
					for size in kernel_size	
				]
		)
		for size, std, mgrid in zip(kernel_size, sigma, meshgrids):
			mean = (size - 1)  / 2   ## 2
			## 高斯处理(标准化,使得数据在处理之后,符合正态分布,符合模型推理要求)
			kernel *= torch.exp(-(mgrid - mean)**2 / (2 * std **2)) ## shape: [5, 5]
		## 保证卷积核中元素和为1
		kernel = kernel / torch.sum(kernel) ## shape: [5, 5]
		kernel = kernel.view(1, 1, *kernel.size()) ##shape[1, 1, 5, 5]
		## 数组广播
		kernel = kernel.repeat(channels, *[1] * (kernel.dim() - 1)) ## shape:[channels, 1, 5, 5],这里第二个维度由(in_channel/group)计算得到
		## 向模块添加持久缓冲区(将kennel加入到“weight”中,weight不参与训练)
		self.register_buffer("weight", kernel)
		self.groups = channels ## group=channel,为deepwise
		self.scale = scale
		inv_scale = 1 / scale
		self.int_inv_scale = int(inv_scale)
	
	## 推理
	def forward(self, input):
		if self.scale == 1.0:
			return input
		## 填充(conv 操作不改变size)
		out = F.pad(input, (self.ka, self.kb, self.ka, self,kb))
		## 卷积处理
		out = F.conv2d(out, weight=self.weight, groups=self.groups)
		## 下采样,int_inv_scale为scale 倒数的整数
		out = out[:, :, ::self.int_inv_scale, ::self.int_inv_scale]
		return out
	
		 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

下采样方法 的相关文章

随机推荐

  • Scrapy介绍及入门

    一 Scrapy简介 Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 可以应用在包括数据挖掘 信息处理或存储历史数据等一系列的程序中 其最初是为了页面抓取 更确切来说 网络抓取 所设计的 也可以应用在获取API所返回的数
  • 面试官:SPA(单页应用)首屏加载速度慢怎么解决?

    一 什么是首屏加载 首屏时间 First Contentful Paint 指的是浏览器从响应用户输入网址地址 到首屏内容渲染完成的时间 此时整个网页不一定要全部渲染完成 但需要展示当前视窗需要的内容 首屏加载可以说是用户体验中最重要的环节
  • wps没有卸载干净怎么解决_WPS云文档链接分享后对方没有访问权限?解决办法在此...

    互联网时代的办公 当然也离不开网络 当下盛行远程办公 大家可以随时随地办公 实时分享工作进度非常的方便 要想远程办公最离不开的应该就是云文档 只要登录同一个账号 大家可以共同编辑同一个文档 也可以分享给其他人来实现实时共享工作进度 以及稳当
  • 自从我这样撸代码以后,公司网页的浏览量提高了107%!

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯IVWEB团队 发表于云 社区专栏 作者 yangchunwen HTTP协议是前端性能乃至安全中一个非常重要的话题 最近在看 web性能权威指南 High Perform
  • Cisco Packet Tracer 实验:生成树配置

    实验目的 1 理解广播风暴的成因 2 掌握STP和RSTP原理及配置方法 实验内容 实验描述 学校为了开展计算机教学和网络办公 建立的一个计算机教室和一个校办公区 这两处的计算机网络通过两台交换机互联组成内部校园网 为了提高网络的可靠性 作
  • Navicat Premium 连接 MySQL 8.0 报错“1251”分析解决

    人闲太久 努力一下就以为是在拼命 一 问题 Navicat Premium 连接 MySQL 8 0 报错 1251 Client does not support authentication protocol requested by
  • 如何自定义sort函数中的比较函数

    在做剑指offer时 有一道题 题目描述 输入一个正整数数组 把数组里所有数字拼接起来排成一个数 打印能拼接出的所有数字中最小的一个 例如输入数组 3 32 321 则打印出这三个数字能排成的最小数字为321323 思路 自定义比较器 若a
  • TensorFlow在MNIST中的应用-无监督学习-自编码器(autoencoder)和encoder

    参考 TensorFlow技术解析与实战 TensorFlow上实现AutoEncoder自编码器 前面讲到的都是有监督学习 他的重要特征是数据都是有标记的 无标记的数据应该用什么样的网络模型来学习呢 这里用一个叫做 自编码网络 的网络模型
  • 同步和异步的区别

    同步 进程之间的关系不是相互排斥临界资源的关系 而是相互依赖的关系 进一步的说明 就是前一个进程的输出作为后一个进程的输入 当第一个进程没有输出时第二个进程必须等待 具有同步关系的一组并发进程相互发送的信息称为消息或事件 其中并发又有伪并发
  • c语言如何判断数据是否符合正态分布_统计学-1:判断数据是否满足正态分布

    1 正态分布的定义 正态分布 The Normal Distribution 假设一随机变量X服从一个期望为 方差为 的正态分布 概率密度函数为 则可记为 import 1 正态分布为什么常见 真正原因是中心极限定理 Central Lim
  • Linux 的性能调优的思路

    Linux操作系统是一个开源产品 也是一个开源软件的实践和应用平台 在这个平台下有无数的开源软件支撑 我们常见的apache tomcat mysql等 开源软件的最大理念是自由 开放 那么Linux作为一个开源平台 最终要实现的是通过这些
  • offset client style 之间的区别

    offset 返回一个指向最近的 closest 指包含层级上的最近 包含该元素的定位元素 如果没有定位的元素 则 offsetParent 为最近的 table元素对象或根元素 标准模式下为 html quirks 模式下为 body 父
  • 【状态估计】电力系统状态估计的虚假数据注入攻击建模与对策(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 文献分享阅读 我用夸克网盘分享了
  • mysql alter字段,mysql alter 语句用法,添加、修改、删除字段

    mysql alter 语句用法 添加 修改 删除字段 主键 alter table tabelname add new field id int 5 unsigned default 0 not null auto increment a
  • Spark报错解决:org.apache.spark.SparkException: Task failed while writing rows.at org.apache.spark.sql.ex

    文章目录 报错信息 解决方法 报错信息 报错信息很长 这里截取了最先的一个错误信息 发现是写入文件时出错 Caused by org apache spark SparkException Job aborted due to stage
  • 数仓 面试题(离线)实战解答

    无意间翻到以前的数仓面试题 今天把它整理出来 方便你我他 数仓分层 为什么要对数仓进行分层 1 说说对数据仓库的理解 数据仓库是面向主题进行组织的 数据是集成的 不可更新的 随时间变化的的 数据仓库经历了这样三个阶段 简单报表阶段 数据集市
  • Go语言中如何在range循环中修改数组/切片内容

    在go语言中 我们经常会使用到range来帮助我们遍历一些数据 通常情况下都是查看操作多一些 但是当我们需要对其原地址上的内容进行变更时 通常都是使用 for i 0 i
  • mac下统计代码行数方法

    使用cloc工具统计 1 首先在终端执行命令下载cloc brew install cloc 没有brew的先下载brew 这个后面写一个 这里先占位 2 cloc使用 进入想要查询的项目文件夹 然后执行下面的命令查询 cloc 如下图所示
  • 【深入理解C++】调用父类的拷贝构造函数

    文章目录 1 默认的拷贝操作 2 调用父类的拷贝构造函数 3 用子类对象初始化父类对象 1 默认的拷贝操作 默认情况下 继承体系下类对象的拷贝是每个成员变量逐个拷贝 include
  • 下采样方法

    AntiAliasInterpolation2d代码解读 注记 最近在看一些视频驱动的代码时 常见一种特殊的下采样方法 故在这里记录一下 Class AntiAliasInterpolation2d nn Module 初始化 def in