【问题标题】:Pytorch BatchNorm3d / InstanceNorm3d not working when data size (1,C,1,1,1)Pytorch BatchNorm3d / InstanceNorm3d 在数据大小 (1,C,1,1,1) 时不起作用
【发布时间】:2021-04-17 08:04:17
【问题描述】:

我正在 PyTorch 中训练一个神经网络,它在某些时候有一个 BatchNorm3d(C)

通常,我使用 1 的批大小对其进行训练,然后此特定级别的输入将具有 (1, C, 1, 1, 1) 的形状。

不幸的是,BatchNorm 然后失败并显示错误消息:

ValueError: 训练时每个通道期望超过 1 个值,得到输入大小 torch.Size([1, 32, 1, 1, 1])

当我使用InstanceNorm3d 时,也会发生同样的情况。当我使用大于 2 的批量大小时,它工作得非常好(即输入的形​​状将是 (2, C, 1, 1, 1)

有人知道这个问题的解决方案吗?我错过了什么?

这个问题可以用下面的sn-p重现:

import torch
x_working = torch.ones([2,32,1,1,1])
x_not_working = torch.ones([1,32,1,1,1])
norm = torch.nn.InstanceNorm3d(32)
out_working = norm(x_working)
out_not_working=norm(x_not_working)

【问题讨论】:

    标签: python-3.x pytorch


    【解决方案1】:

    所有这些归一化层都会在批次维度上持续运行数据的均值和方差估计(请参阅doc)。由于方差是使用unbiased estimator 计算的(注意分母中的n-1),因此计算不能使用少于2 个数据点。因此,您需要至少 2 个批量大小才能使用这些层。

    请注意,1 个数据点的方差 - 如果 pytorch 同意计算它 - 将始终为 0,因此结果并不是很有趣。实际上,众所周知,Batchnorm 需要大得多的批次大小(您经常在科学文献中找到 32 或 64 个)才能正常工作。这种强烈的需求导致了 layerNorm 和 groupNorm 的发展(我相信 instanceNorm 是一个特例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 2020-02-03
      • 2014-11-14
      • 2013-05-12
      • 1970-01-01
      • 2014-04-29
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多