Deep learning Pytorch nn.functional.batch_二维输入规范

Deep learning Pytorch nn.functional.batch_二维输入规范,deep-learning,pytorch,batch-normalization,Deep Learning,Pytorch,Batch Normalization,我目前正在实施一个模型,我需要在测试期间更改运行平均值和标准偏差。因此,我假设nn.functional.batch_norm比nn.BatchNorm2d 然而,我有成批的图像作为输入,目前还不确定如何拍摄这些图像。如何将nn.functional.batch\u norm应用于批量2D图像 我目前的代码是这样的,尽管这不正确,我还是发布了这样的代码: mu = torch.mean(inp[0]) stddev = torch.std(inp[0]) x = nn.functional.ba

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

然而,我有成批的图像作为输入,目前还不确定如何拍摄这些图像。如何将
nn.functional.batch\u 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对每个通道执行相同的规范化。i、 e.如果您有一批具有形状(N,C,H,W)的数据,那么您的mu和stddev应该是形状(C,)。如果您的图像没有通道尺寸,请使用
视图添加通道尺寸

警告:如果设置
training=True
,则
batch\u norm
计算并使用适当的标准化统计数据(这意味着我们不需要自己计算平均值和标准值)。您的mu和STDEV应该是所有训练批次的跑步平均值和跑步标准。这些张量在
batch\u 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)

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