Разница между Керасом BatchNormalization и PyTorch BatchNorm2d? - PullRequest
1 голос
/ 05 февраля 2020

У меня есть небольшой образец CNN, реализованный в Keras и PyTorch. Когда я печатаю сводку обеих сетей, общее количество обучаемых параметров одинаково, но общее количество параметров и количество параметров для нормализации партии не совпадают.

Вот реализация CNN в Керасе:

inputs = Input(shape = (64, 64, 1)). # Channel Last: (NHWC)

model = Conv2D(filters=32, kernel_size=(3, 3), padding='SAME', activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 1))(inputs)
model = BatchNormalization(momentum=0.15, axis=-1)(model)
model = Flatten()(model)

dense = Dense(100, activation = "relu")(model)
head_root = Dense(10, activation = 'softmax')(dense)

И сводка, напечатанная для приведенной выше модели:

Model: "model_8"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_9 (InputLayer)         (None, 64, 64, 1)         0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 64, 64, 32)        320       
_________________________________________________________________
batch_normalization_2 (Batch (None, 64, 64, 32)        128       
_________________________________________________________________
flatten_3 (Flatten)          (None, 131072)            0         
_________________________________________________________________
dense_11 (Dense)             (None, 100)               13107300  
_________________________________________________________________
dense_12 (Dense)             (None, 10)                1010      
=================================================================
Total params: 13,108,758
Trainable params: 13,108,694
Non-trainable params: 64
_________________________________________________________________

Вот реализация той же модели архитектуры в PyTorch:

# Image format: Channel first (NCHW) in PyTorch
class CustomModel(nn.Module):
def __init__(self):
    super(CustomModel, self).__init__()
    self.layer1 = nn.Sequential(
        nn.Conv2d(in_channels=1, out_channels=32, kernel_size=(3, 3), padding=1),
        nn.ReLU(True),
        nn.BatchNorm2d(num_features=32),
    )
    self.flatten = nn.Flatten()
    self.fc1 = nn.Linear(in_features=131072, out_features=100)
    self.fc2 = nn.Linear(in_features=100, out_features=10)

def forward(self, x):
    output = self.layer1(x)
    output = self.flatten(output)
    output = self.fc1(output)
    output = self.fc2(output)
    return output

Ниже приведен вывод сводной информации о вышеприведенной модели:

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1           [-1, 32, 64, 64]             320
              ReLU-2           [-1, 32, 64, 64]               0
       BatchNorm2d-3           [-1, 32, 64, 64]              64
           Flatten-4               [-1, 131072]               0
            Linear-5                  [-1, 100]      13,107,300
            Linear-6                   [-1, 10]           1,010
================================================================
Total params: 13,108,694
Trainable params: 13,108,694
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.02
Forward/backward pass size (MB): 4.00
Params size (MB): 50.01
Estimated Total Size (MB): 54.02
----------------------------------------------------------------

Как видно из результатов, приведенных выше, нормализация партии в Керасе имеет больше параметров, чем PyTorch (2 раза, чтобы быть точным). Так в чем же разница в вышеупомянутых архитектурах CNN? Если они эквивалентны, то чего мне здесь не хватает?

1 Ответ

2 голосов
/ 05 февраля 2020

Keras рассматривает в качестве параметров (весов) многие вещи, которые будут «сохранены / загружены» в слое.

Хотя обе реализации, естественно, имеют накопленные «среднее» и «дисперсию» партий, эти значения не могут быть обучены с обратным распространением.

Тем не менее, эти значения обновляются в каждом пакете, и Keras рассматривает их как не обучаемые веса, а PyTorch просто скрывает их. Термин «не обучаемый» здесь означает «не обучаемый путем обратного распространения », но не означает, что значения заморожены.

Всего это 4 группы "весов" для слоя BatchNormalization. Учитывая выбранную ось (по умолчанию = -1, размер = 32 для вашего слоя)

  • scale (32) - обучаемо
  • offset (32) - обучаемо
  • accumulated means (32) - не обучается, но обновляется каждая партия
  • accumulated std (32) - не обучается, но обновляется каждая партия

Преимущество такого подхода в Keras заключается в том, что когда вы сохраняете слой, вы также сохраняете среднее значение и значения дисперсии так же, как вы автоматически сохраняете все другие веса в слое. И когда вы загружаете слой, эти веса загружаются вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...