首页 > 其他分享 >命名张量的解释

命名张量的解释

时间:2024-08-10 16:39:51浏览次数:9  
标签:解释 named img gray torch 张量 batch weights 命名

import torch

把3个颜色grb通道合并为一个灰度通道

定义变量,用随机数模拟

img_t = torch.randn(3, 5, 5)
batch_t = torch.randn(2, 3, 5, 5)
weights = torch.randn(3)

朴素的求法

以 channels 通道的平均数为灰度值

img_gray_naive = img_t.mean(-3)
batch_gray_naive = batch_t.mean(-3)
img_gray_naive.shape, batch_gray_naive.shape
(torch.Size([5, 5]), torch.Size([2, 5, 5]))

带权重的求法

朴素的求法相当于平分了权重值,即每个通道的权重都是 1/3,
weights中包含了每个通道真正的权重值,img_t 中每个值乘以权重才是真正的值

首先让 weights 扩展成 img_t 一样的维度结构

unsqueeze_weights = weights.unsqueeze(-1).unsqueeze(-1)

其次 img_t 和 unsqueeze_weights 进行矩阵乘法,把权重作用到 img_t 上面

img_weights = img_t * unsqueeze_weights
batch_weights = batch_t * unsqueeze_weights

最后把各个维度的权重相加得到最终的灰度值

img_gray_weighted = img_weights.sum(-3)
batch_gray_weighted = batch_weights.sum(-3)

查看形状可知,没有了颜色通道维度

img_gray_weighted.shape, batch_gray_weighted.shape
(torch.Size([5, 5]), torch.Size([2, 5, 5]))

高级做法-使用爱因斯坦求和约定

img_gray_weighted_fancy = torch.einsum('...chw,c->...hw', img_t, weights)
batch_gray_weighted_fancy = torch.einsum('...chw,c->...hw', batch_t, weights)
img_gray_weighted_fancy.shape, batch_gray_weighted_fancy.shape
(torch.Size([5, 5]), torch.Size([2, 5, 5]))

用命名张量的做法

用 refine_names 函数为张量的每个维度命名

weights_named = weights.refine_names(..., 'channels')
img_named = img_t.refine_names(..., 'channels', 'rows', 'columns')
batch_named = batch_t.refine_names(..., 'channels', 'rows', 'columns')

把一维的 weights_named 张量对齐到 多维的张量 img_named

weights_aligned = weights_named.align_as(img_named)

矩阵乘法,再求和(给定命名的维度名称)

img_gray_named = (img_named * weights_aligned).sum('channels')
batch_gray_named = (batch_named * weights_aligned).sum('channels')
img_gray_named.shape, batch_gray_named.shape, weights_aligned.shape
(torch.Size([5, 5]), torch.Size([2, 5, 5]), torch.Size([3, 1, 1]))

标签:解释,named,img,gray,torch,张量,batch,weights,命名
From: https://www.cnblogs.com/litifeng/p/18352451

相关文章

  • 机器学习笔记:序列到序列学习[详细解释]
    介绍本节我们使用两个循环神经网络的编码器和解码器,并将其应用于序列到序列(sequencetosequence,seq2seq)类的学习任务。遵循编码器-解码器架构的设计原则,循环神经网络编码器使用长度可变的序列作为输入,将其转换为固定形状的隐状态。换言之,输入序列的信息被编码到循环神经网......
  • 深度学习张量数值计算
    张量的介绍PyTorch是一个Python深度学习框架,它将数据封装成张量(Tensor)来进行运算。PyTorch中的张量就是元素为同一种数据类型的多维矩阵。在PyTorch中,张量以"类"的形式封装起来,对张量的一些运算、处理的方法被封装在类中。张量基本运算基本运算中,包括add、sub、mul......
  • 深入分析编程命名规范:成员变量命名约定的比较与分析
    目录标题1.引言2.成员变量命名约定简介谷歌命名规范Qt命名规范微软命名规范其他使用`_`前缀的规范小结3.各命名规范的详细分析谷歌命名规范:成员变量后缀`_`Qt和微软命名规范:成员变量前缀`m_`其他使用`_`前缀的规范比较总结4.综合比较可读性可维护性学习曲......
  • C#控件命名规范
     一、DataControl类型前缀示例AccessDataSourceadsadsPubsDataListdlstdlstTitlesDetailViewdvwdvwTitlesFormViewfvwfvwFontsGridViewgvwgvwCityObjectDataSourceodsodsMenusRepeater......
  • c++中的命名空间
    前言Hello,大家好,我是文宇正文在C++中,命名空间是一种机制,用于将全局命名空间划分为更小的逻辑单元,以避免命名冲突。命名空间提供了一种将全局作用域划分为多个独立的作用域的方式。命名空间的引入是为了解决大型项目中可能出现的命名冲突问题。在一个大型项目中,可能有多个开......
  • 如何使用字典更改张量中的值?
    当我有如下的张量和字典时,如何将字典映射到张量?例如,Dict={1:'A',2:'B',3:'C'}ex=torch.tensor([[1,2,3],[3,2,1]])#Expectedresult#tensor([[A,B,C],#[C,B,A]])我尝试了这个代码和torch.where,但它不起作用出色地。......
  • Memcheck错误解释
    Memcheck只能检测出两种错误类型:useofillegaladdressesuseofundefinedvalues这两种错误类型,足以应对大多数的情况。下面针对这两种类型出现的错误进行解释。Illegalread/IllegalwriteerrorsInvalidreadofsize1at0x4C32CF2:strlen(in/usr/li......
  • FreeRTOS启动任务调度器函数解释
    目录vTaskStartScheduler()函数xPortStartScheduler()函数prvStartFirstTask()函数vPortSVCHandler()函数FreeRTOS的任务开始运行的前提是调用了启动调度器函数vTaskStartScheduler(),只有调用了该函数任务才会被调度并运行。下面以FreeRTOSv9.0.0版本的源码进行分析FreeRT......
  • 【面试】解释概率和似然的区别
    面试模拟场景面试官:你能解释一下概率和似然的区别吗?参考回答示例概率(Probability)概念:概率是指在给定模型参数和已知条件下,观察到某个数据样本的可能性。换句话说,概率描述的是在已知模型和参数的情况下,某个事件发生的可能性。公式:......
  • 改写socket编程并解释socket通信原理
    如果你仔细看我之前的博客,会看到那个手机打电话的示例,但是那段代码彻底写死了,真正编程的时候一定要写活了,不信你看看很多的程序的配置文件就是这样的,为什么单独分离个配置文件出来,就是为了便于修改配置,这就是把程序写活的最好的例子。言归正传,直接上代码。服务端:fromsocketim......