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

【Python--torch.nn.functional】F.normalize用法 + 代码说明

【Python–torch.nn.functional】F.normalize介绍 + 代码说明

文章目录

  • 【Python--torch.nn.functional】F.normalize介绍 + 代码说明
    • 1. 介绍
    • 2. 代码说明
      • 2.1 一维Tensor
      • 2.2 二维Tensor
      • 2.3 三维Tensor
    • 3. 总结

1. 介绍

import torch.nn.functional as F
F.normalize(input: Tensor, p: float = 2.0, dim: int = 1, eps: float = 1e-12) -> Tensor
  • input: 是一个任意维度的Tensor类型的数据
  • p:默认为2,表示2范数;同理,p=1表示1范数
  • dim:
    • 默认为1,在输入数据input的shape是二维的且p=2情况下,表示对行进行操作,即所有元素除以第一行元素的根号下平方和;
    • dim=0 时,在输入数据input的shape是二维的且p=2情况下,表示对列进行操作,即所有元素除以第一列元素的根号下平方和;
    • dim为其他值时,之后通过代码分析。
  • eps:默认为1e-12,防止除0。

在这里插入图片描述
因此,Normalize对应的公式为:
在这里插入图片描述

2. 代码说明

2.1 一维Tensor

c = torch.Tensor([1, 2, 3])
print(F.normalize(c, dim=0))
'''
tensor([0.2673, 0.5345, 0.8018])
torch.Size([3])
解释:
默认dim=1,是按行操作,但是一维的Tensor是列向量,所以必须指定dim=0
默认p=2,所以这个一维的Tensor(列向量)每个元素都除以sqrt(1**2 + 2**2 + 3**2)
'''

2.2 二维Tensor

import torch.nn.functional as F
import torcha = torch.arange(20, dtype=torch.float).reshape(4,5)
b = F.normalize(a, dim=0)
c = F.normalize(a, dim=1)
print(a)
print(b)
print(c)

输出:

# 输入的数组
tensor([[ 0.,  1.,  2.,  3.,  4.],[ 5.,  6.,  7.,  8.,  9.],[10., 11., 12., 13., 14.],[15., 16., 17., 18., 19.]])
# dim=0时,即沿第一维度(列)做归一化
tensor([[0.0000, 0.0491, 0.0907, 0.1261, 0.1564],[0.2673, 0.2949, 0.3175, 0.3363, 0.3519],[0.5345, 0.5406, 0.5443, 0.5464, 0.5474],[0.8018, 0.7864, 0.7711, 0.7566, 0.7430]])
# dim=1时,即沿第二维度(行)做归一化
# 维度记忆技巧:最后一个维度始终是行,从后向前推:行、列、通道
tensor([[0.0000, 0.1826, 0.3651, 0.5477, 0.7303],[0.3131, 0.3757, 0.4384, 0.5010, 0.5636],[0.3701, 0.4071, 0.4441, 0.4812, 0.5182],[0.3932, 0.4195, 0.4457, 0.4719, 0.4981]])

2.3 三维Tensor

a = torch.Tensor([[[1, 2, 3], [4, 5, 6]], [[10, 20, 30], [40, 50, 60]]]) # (2, 2, 3)print(F.normalize(a))  # dim = 1, 举个例子,1、4为1组,进行norm。print(F.normalize(a, dim=0))  # dim = 0, 1、10为1组,进行norm。print(F.normalize(a, dim=2)) # dim = 2, 1、2、3为1组,进行norm。'''
tensor([[[0.2425, 0.3714, 0.4472],[0.9701, 0.9285, 0.8944]],[[0.2425, 0.3714, 0.4472],[0.9701, 0.9285, 0.8944]]])tensor([[[0.0995, 0.0995, 0.0995],[0.0995, 0.0995, 0.0995]],[[0.9950, 0.9950, 0.9950],[0.9950, 0.9950, 0.9950]]])tensor([[[0.2673, 0.5345, 0.8018],[0.4558, 0.5698, 0.6838]],[[0.2673, 0.5345, 0.8018],[0.4558, 0.5698, 0.6838]]])
'''

3. 总结

  • 按照指定Tensor最大的dim的去norm时,就是对物理存储地址挨着最紧密的那一维进行norm。
  • 当dim为2,此时dim最大,就是对1、2、3(物理存储地址最紧密)为一组进行norm。
  • 当dim为1,则降一维度,对物理存储地址次紧密的元素为一组进行norm。也就是1、4为一组。
  • 当dim为0,就是按照最远的一组。
http://www.lryc.cn/news/7823.html

相关文章:

  • 【算法题】1887. 使数组元素相等的减少操作次数
  • GD库图片裁剪指定形状解决办法(PHP GD库 海报)
  • redis的简介及应用场景
  • 2、HAL库利用滴答定时器systick(1ms中断)实现时间计数戳
  • Spring入门学习
  • webpack(4版本)使用
  • Linux安装ElasticSearch
  • Linux中C语言编程经验总结
  • jvisualvm工具使用
  • redis五大IO网络模型、内存回收
  • 【C/C++】内存管理详解
  • Android ProcessLifecycleOwner 观察进程生命周期
  • 如何编写一个 npm 插件?
  • mapstruct- 让VO,DTO,ENTITY转换更加便捷
  • IAR警告抑制及还原
  • 工厂模式(Factory Pattern)
  • JavaScript语法学习--《JavaScript编程全解》
  • linux安装极狐gitlab
  • 软考高级信息系统项目管理(高项)原创论文——人力资源管理
  • Java Lambda表达式 匿名内部类 函数式接口(FunctionalInterface)
  • javaEE 初阶 — 流量控制与拥塞控制
  • HTML自主学习 - 2
  • 【转载】通过HAL库实现MODBUS从机程序编写与调试-----STM32CubeMX操作篇
  • 【C++】string类(上)
  • Java泛型
  • 07 分布式事务Seata使用(2)
  • c++练习题5
  • Python 高级编程之正则表达式(八)
  • pynrrd常用操作解析
  • 数据结构:链表基础OJ练习+带头双向循环链表的实现