gpt4 book ai didi

deep-learning - 用于 2D 输入的 Pytorch nn.functional.batch_norm

转载 作者:行者123 更新时间:2023-12-02 03:02:27 25 4
gpt4 key购买 nike

我目前正在实现一个模型,我需要在测试期间更改运行平均值和标准偏差。因此,我假设 nn.functional.batch_norm将是比 nn.BatchNorm2d 更好的选择

但是,我有成批的图像作为输入,目前不确定如何接收图像。我将如何申请 nn.functional.batch_norm在成批的 2D 图像上?

我拥有的当前代码是这样的,即使这不正确,我也会发布此代码:

mu = torch.mean(inp[0])
stddev = torch.std(inp[0])
x = nn.functional.batch_norm(inp[0], mu, stddev, training=True, momentum=0.9)

最佳答案

关键是 2D batchnorm 对每个 channel 执行相同的归一化。即如果你有一批形状为 (N, C, H, W) 的数据,那么你的 mu 和 stddev 应该是形状 (C,)。如果您的图像没有 channel 维度,请使用 view 添加一个.

警告:如果您设置 training=True然后 batch_norm为争论的批次计算并使用适当的归一化统计数据(这意味着我们不需要自己计算均值和标准差)。您认为 mu 和 stddev 应该是所有训练批次的运行平均值和运行标准。这些张量使用 batch_norm 中的新批次统计信息进行更新。功能。

# inp is shape (N, C, H, W)
n_chans = inp.shape[1]
running_mu = torch.zeros(n_chans) # zeros are fine for first training iter
running_std = torch.ones(n_chans) # ones are fine for first training iter
x = nn.functional.batch_norm(inp, running_mu, running_std, training=True, momentum=0.9)
# running_mu and running_std now have new values

如果您只想使用自己的批处理统计信息,请尝试以下操作:
# inp is shape (N, C, H, W)
n_chans = inp.shape[1]
reshaped_inp = inp.permute(1,0,2,3).contiguous().view(n_chans, -1) # shape (C, N*W*H)
mu = reshaped_inp.mean(-1)
stddev = reshaped_inp.std(-1)
x = nn.functional.batch_norm(inp, mu, stddev, training=False)

关于deep-learning - 用于 2D 输入的 Pytorch nn.functional.batch_norm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44887446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com