Пакетная нормализация на изображении с переменным входным размером - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь разработать модель с использованием формы ввода переменного размера (изображения).Пожалуйста, смотрите код ниже для подробностей,

def create_bbox_network():
    image_input = Input(shape=(3, None, None))
    conv1  = Conv2D(16, (3, 3), input_shape=(3, None, None), activation='relu', strides=(1, 1), padding='same')(image_input)
    batch_norm1 = BatchNormalization()(conv1)

    conv2 = Conv2D(16, (3, 3), activation='relu', padding='same')(batch_norm1)
    batch_norm2 = BatchNormalization()(conv2)

    conv3 = Conv2D(16, (3, 3), activation='relu', padding='same')(batch_norm2)
    batch_norm3 = BatchNormalization()(conv3)

    conv4 = Conv2D(16, (3, 3), activation='relu', padding='same')(batch_norm3)
    max_pooling_c4 = MaxPooling2D(pool_size=(2, 2))(conv4)
    batch_norm4 = BatchNormalization()(max_pooling_c4)

    conv5 = Conv2D(16, (3, 3), activation='relu', padding='same')(batch_norm4)
    max_pooling_c5 = MaxPooling2D(pool_size=(2, 2))(conv5)
    batch_norm5 = BatchNormalization()(max_pooling_c5)

    dense_layer = GlobalMaxPooling2D()(batch_norm5)
    fc_1 = Dense(64, activation='relu')(dense_layer)
    fc_2 = Dense(64, activation='relu')(fc_1)
    out = Dense(4, activation='sigmoid')(fc_2)

    model = Model(inputs=image_input, outputs=out)
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

Запуск приведенного выше кода дает мне ошибку,

ValueError: Axis -1 of input tensor should have a defined dimension 
but the layer received an input with shape (None, 16, None, None)
Note: For detail where code is failing see line 4. batch_norm1 layer.

Чего мне здесь не хватает?Я понял, что не могу использовать слой Flatten () при использовании переменной формы ввода.Но такой же случай с функцией BatchNormalization ().Если так, почему мы не можем использовать BatchNormalization с переменным размером ввода?И какова альтернатива этой функции, которая может использоваться здесь осмысленно?

Насколько я понимаю, пакетная нормализация рассчитывается путем вычисления среднего значения и sd всех тензоров выходного слоя, а затем просто нормализует выходной сигнал.Я понимаю, что с flatten существует проблема с весами переменного размера, и, следовательно, ее нельзя использовать.Но я не вижу причин, по которым BatchNormalization нельзя использовать на этом слое.

...