Начиная с 19-го дня, пакетная норма является еще одним важным элементом полной архитектуры CNN.

Пакетная нормализация

  • Чтобы сжать значения из разных диапазонов примерно до N ~ (0, 1), что является средним значением 0 и стандартным отклонением 1.
  • В случае сигмовидной активации, если значения слишком велики, градиент близок к 0 и существует риск исчезновения градиента.

Преимущества пакетной нормы

  • Сделайте конвергенцию быстрее
  • Более стабильный в градиенте достойный
  • Может использовать большую скорость обучения
  • Можно получить лучшие минимумы в функции потерь

Детали в пакетной норме для партии изображений или функционального блока

  • Он находит среднее значение μ и стандартное значение σ для каждого канала
  • Например. пакет (N изображений) изображений RGB с формой [N, 3, 28, 28], нормирование пакета выполняется на 3 каналах.
  • Таким образом, пакетный слой будет иметь μ, σ shape=[3] каждый.
  • Есть еще два обучаемых параметра: γ и β, которые используются для точной настройки среднего значения и стандартного значения (γ для масштабирования и β для сдвига N~(0, 1))
  • Это означает, что окончательный результат не будет точно попадать в N ~ (0, 1), а в N ~ (β, γ)

Норма партии в Pytorch

nn.BatchNorm1d()

  • Используется для плоской сети.
  • Например. полносвязный nn в конце CNN, где x.shape=[100, 16, 784]
import torch
import torch.nn as nn

# nn.BatchNorm1d

x = torch.rand(100, 16, 784)  # here imgs are flattened from 28x28

layer = nn.BatchNorm1d(16)  # batch norm is done on channels
out = layer(x)

print(layer.running_mean)
print(layer.running_var)

nn.BatchNorm2d()

  • Используйте для сверточных слоев с элементами 4-х измерений.
  • Например. х.форма = [1, 16, 7, 7]
  • Вес в слое нормы партии равен γ, его можно узнать во время задней опоры.
  • Смещение в слое норм партии равно β, его можно узнать во время обратного упора.
  • Поскольку γ и β можно изучить, из результата vars(layer) вы можете увидеть requires_grad=True
  • Используйте layer.train() и layer.eval(), чтобы изменить режим, чтобы определить, нужно ли рассчитывать градиенты, μ и σ или нет.
# nn.BatchNorm2d
x = torch.rand(1, 16, 7, 7)  # here image or features are not flattened 
print(x.shape)

layer = nn.BatchNorm2d(16)  # batch norm is done on channels

out = layer(x)

print(layer.weight)  # weight here is gamma, was learned to adjust the batch norm to N(beta, gamma) from N(0, 1)
print(layer.bias)  # bias here is beta, was learned to adjust the batch norm to N(beta, gamma)

print(vars(layer))

print(layer.eval())
print(layer.train())

Ссылка

ссылка1