pytorch中的normalize应用

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

其中,p表示范数(这里是2范数),dim表示计算范数的维度(默认为1),eps是为了防止分母为0;
pytorch中的normalize函数本质上就是针对某个维度进行归一化,公式为:
ν = ν m a x ( ∣ ∣ ν ∣ ∣ 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.2621 0.262 1 2 + 0.363 4 2 + 0.374 4 2 0.4489=\frac{0.2621}{\sqrt{0.2621^2+0.3634^2+0.3744^2}} 0.4489=0.26212+0.36342+0.37442 0.2621
0.6224 = 0.3634 0.262 1 2 + 0.363 4 2 + 0.374 4 2 0.6224=\frac{0.3634}{\sqrt{0.2621^2+0.3634^2+0.3744^2}} 0.6224=0.26212+0.36342+0.37442 0.3634
0.6421 = 0.3744 0.262 1 2 + 0.363 4 2 + 0.374 4 2 0.6421=\frac{0.3744}{\sqrt{0.2621^2+0.3634^2+0.3744^2}} 0.6421=0.26212+0.36342+0.37442 0.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.0861 0.086 1 2 + 0.108 7 2 + 0.051 8 2 + 0.355 1 2 0.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.35512 0.0861
0.2825 = 0.1087 0.086 1 2 + 0.108 7 2 + 0.051 8 2 + 0.355 1 2 0.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.35512 0.1087
0.1347 = 0.0518 0.086 1 2 + 0.108 7 2 + 0.051 8 2 + 0.355 1 2 0.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.35512 0.0518
0.9230 = 0.3551 0.086 1 2 + 0.108 7 2 + 0.051 8 2 + 0.355 1 2 0.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.35512 0.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.0861 0.086 1 2 1.0=\frac{0.0861}{\sqrt{0.0861^2}} 1.0=0.08612 0.0861

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch的`transforms.Resize`和`transforms.Normalize`是用于数据预处理的常用转换操作。 `transforms.Resize`用于调整图像的大小。它可以接受一个整数作为参数,表示将图像的长和宽调整为相同的尺寸。例如,如果将大小设置为`(256, 256)`,则图像将被调整为256x256像素。如果只提供一个整数,则图像的最小边将被调整为该大小,而另一边将按比例缩放。 `transforms.Normalize`用于对图像进行标准化处理。它需要两个参数:均值(mean)和标准差(std)。对于每个通道(channel)上的图像像素值,会执行以下操作:`(pixel_value - mean) / std`。这个操作可以帮助模型更好地处理数据,并且通常在训练之前将数据进行标准化。 以下是一个示例使用这两个转换操作的代码片段: ```python import torch from torchvision import transforms # 定义大小调整和标准化的转换操作 transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) ]) # 加载图像并应用转换操作 image = Image.open('image.jpg') image = transform(image) # 在模型使用预处理后的图像 output = model(image) ``` 在上面的示例,`transforms.ToTensor()`也被用于将图像转换为`torch.Tensor`类型。这是因为大多数深度学习模型在PyTorch处理的输入数据类型是`torch.Tensor`。 希望这个回答能帮助到你!如有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值