为什么我需要将之前的通道数传递给批规范化?批规范化应该对批次中的每个数据点进行归一化,为什么它还需要通道数呢?
回答:
批规范化具有可学习的参数,因为它包括一个仿射变换。
根据 nn.BatchNorm2d
的文档说明:
均值和标准差是基于小批次在每个维度上计算的,γ和β是大小为C的可学习参数向量(其中C是输入大小)。默认情况下,γ的元素设置为1,β的元素设置为0。
由于规范化是按通道计算的,参数γ和β是大小为num_channels的向量(每个通道一个元素),这导致每个通道都有单独的缩放和偏移。像PyTorch中的任何其他可学习参数一样,它们需要以固定大小创建,因此您需要指定通道数。
batch_norm = nn.BatchNorm2d(10)# γbatch_norm.weight.size()# => torch.Size([10])# βbatch_norm.bias.size()# => torch.Size([10])
注意:设置 affine=False
时不使用任何参数,也不需要通道数,但仍然需要指定它们,以便保持一致的接口。