pytorch中的normalize应用

本文详细解释了PyTorch中的normalize函数,通过三个代码示例展示了如何根据维度(dim)进行归一化操作。示例1说明dim=1时在通道间进行归一化,示例2展示了dim=2时在元素间归一化,而示例3的dim=0则说明在样本间归一化,结果全为1。通过这些示例,深入理解了normalize函数的计算逻辑和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

torch.nn.functional.normalize(input, p=2, dim=1, eps=1e-12, out=None)

其中,p表示范数(这里是2范数),dim表示计算范数的维度(默认为1),eps是为了防止分母为0;
pytorch中的normalize函数本质上就是针对某个维度进行归一化,公式为:
ν=νmax(∣∣ν∣∣p,ϵ)\nu = \frac{\nu}{max(||\nu||_p,\epsilon)}ν=max(νp,ϵ)ν

方便记忆,二维矩阵中, dim=1表示在行内进行归一化,dim=0表示在列内进行归一化。
在使用过程中,对dim的理解不够到位,来三个代码实验一下。

示例1:dim=1

a = F.softmax(torch.randn((1, 3, 4)), 1)
b = F.normalize(a)

输出:

// a
 tensor([[[0.2621, 0.2830, 0.3758, 0.0260],
         [0.3634, 0.3750, 0.5382, 0.1085],
         [0.3744, 0.3420, 0.0860, 0.8655]]])
// b
b: tensor([[[0.4489, 0.4870, 0.5676, 0.0298],
         [0.6224, 0.6454, 0.8130, 0.1243],
         [0.6412, 0.5885, 0.1299, 0.9918]]])

代码中针对维度1进行归一化。维度1有3个通道,具体的计算细节为
0.4489=0.26210.26212+0.36342+0.374420.4489=\frac{0.2621}{\sqrt{0.2621^2+0.3634^2+0.3744^2}}0.4489=0.26212+0.36342+0.374420.2621
0.6224=0.36340.26212+0.36342+0.374420.6224=\frac{0.3634}{\sqrt{0.2621^2+0.3634^2+0.3744^2}}0.6224=0.26212+0.36342+0.374420.3634
0.6421=0.37440.26212+0.36342+0.374420.6421=\frac{0.3744}{\sqrt{0.2621^2+0.3634^2+0.3744^2}}0.6421=0.26212+0.36342+0.374420.3744

示例2:dim=2

a = F.softmax(torch.randn((1, 3, 4)), 1)
c = F.normalize(b, dim=2)
// a
tensor([[[0.0861, 0.1087, 0.0518, 0.3551],
         [0.8067, 0.4128, 0.0592, 0.2884],
         [0.1072, 0.4785, 0.8890, 0.3565]]])
// c
tensor([[[0.2237, 0.2825, 0.1347, 0.9230],
         [0.8467, 0.4332, 0.0621, 0.3027],
         [0.0997, 0.4447, 0.8262, 0.3313]]])

这里作用的是维度2,可以认为维度2有4个通道,计算细节为:
0.2237=0.08610.08612+0.10872+0.05182+0.355120.2237=\frac{0.0861}{\sqrt{0.0861^2+0.1087^2+0.0518^2+0.3551^2}}0.2237=0.08612+0.10872+0.05182+0.355120.0861
0.2825=0.10870.08612+0.10872+0.05182+0.355120.2825=\frac{0.1087}{\sqrt{0.0861^2+0.1087^2+0.0518^2+0.3551^2}}0.2825=0.08612+0.10872+0.05182+0.355120.1087
0.1347=0.05180.08612+0.10872+0.05182+0.355120.1347=\frac{0.0518}{\sqrt{0.0861^2+0.1087^2+0.0518^2+0.3551^2}}0.1347=0.08612+0.10872+0.05182+0.355120.0518
0.9230=0.35510.08612+0.10872+0.05182+0.355120.9230=\frac{0.3551}{\sqrt{0.0861^2+0.1087^2+0.0518^2+0.3551^2}}0.9230=0.08612+0.10872+0.05182+0.355120.3551

示例3:dim=0

a = F.softmax(torch.randn((1, 3, 4)), 1)
c = F.normalize(b, dim=0)
// a
tensor([[[0.0861, 0.1087, 0.0518, 0.3551],
         [0.8067, 0.4128, 0.0592, 0.2884],
         [0.1072, 0.4785, 0.8890, 0.3565]]])
// c
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])

这里作用的是维度0;维度0上只有1个通道,因此归一化之后全为1,即
1.0=0.08610.086121.0=\frac{0.0861}{\sqrt{0.0861^2}}1.0=0.086120.0861

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值