【问题标题】:Pytorch nn.functional.batch_norm for 2D inputPytorch nn.functional.batch_norm 用于 2D 输入
【发布时间】:2017-12-06 19:59:42
【问题描述】:

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

但是,我有一批图像作为输入,目前不确定如何获取图像。如何将nn.functional.batch_norm 应用于批量二维图像?

我目前的代码是这样的,即使这不正确,我也会发布:

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

【问题讨论】:

  • 你解决了这个问题吗?
  • @JakubLangr 我已经很久没有看这个了。不确定。如果你有类似的问题,我可以为你的问题投赞成票

标签: deep-learning pytorch batch-normalization


【解决方案1】:

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

警告:如果您设置了training=True,那么batch_norm 会为争论的批次计算并使用适当的归一化统计数据(这意味着我们不需要自己计算均值和标准差)。您争论的 mu 和 stddev 应该是所有训练批次的运行平均值和运行 std。这些张量使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2019-03-11
    • 2020-12-01
    • 1970-01-01
    • 2019-05-24
    • 2017-06-28
    相关资源
    最近更新 更多