Почему реализация Resnet50 в Keras запрещает изображения размером менее 32x32x3? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь понять, почему реализация ResNet50 в Keras запрещает изображения размером менее 32x32x3.

На основе их реализации: https://github.com/keras-team/keras-applications/blob/master/keras_applications/resnet50.py Функция, которая перехватывает _obtain_input_shape

. Чтобы преодолеть эту проблему, я сделал свою собственную реализацию на основе их кода и удалилкод, который запрещает минимальный размер.В моей реализации я также добавляю возможность работать с предварительно обученной моделью с более чем тремя каналами путем репликации весов RGB для первого слоя conv1.

def ResNet50(load_weights=True,
             input_shape=None,
             pooling=None,
             classes=1000):
    img_input = Input(shape=input_shape, name='tuned_input')
    x = ZeroPadding2D(padding=(3, 3), name='conv1_pad')(img_input)

    # Stage 1 (conv1_x)
    x = Conv2D(64, (7, 7),
               strides=(2, 2),
               padding='valid',
               kernel_initializer=KERNEL_INIT,
               name='tuned_conv1')(x)

    x = BatchNormalization(axis=CHANNEL_AXIS, name='bn_conv1')(x)
    x = Activation('relu')(x)
    x = ZeroPadding2D(padding=(1, 1), name='pool1_pad')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2))(x)

    # Stage 2 (conv2_x)
    x = _convolution_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1))
    for block in ['b', 'c']:
        x = _identity_block(x, 3, [64, 64, 256], stage=2, block=block)

    # Stage 3 (conv3_x)
    x = _convolution_block(x, 3, [128, 128, 512], stage=3, block='a')
    for block in ['b', 'c', 'd']:
        x = _identity_block(x, 3, [128, 128, 512], stage=3, block=block)

    # Stage 4 (conv4_x)
    x = _convolution_block(x, 3, [256, 256, 1024], stage=4, block='a')
    for block in ['b', 'c', 'd', 'e', 'f']:
        x = _identity_block(x, 3, [256, 256, 1024], stage=4, block=block)

    # Stage 5 (conv5_x)
    x = _convolution_block(x, 3, [512, 512, 2048], stage=5, block='a')
    for block in ['b', 'c']:
        x = _identity_block(x, 3, [512, 512, 2048], stage=5, block=block)

    # Condition on the last layer
    if pooling == 'avg':
        x = layers.GlobalAveragePooling2D()(x)
    elif pooling == 'max':
        x = layers.GlobalMaxPooling2D()(x)

    inputs = img_input
    # Create model.
    model = models.Model(inputs, x, name='resnet50')

    if load_weights:
        weights_path = get_file(
            'resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5',
            WEIGHTS_PATH_NO_TOP,
            cache_subdir='models',
            md5_hash='a268eb855778b3df3c7506639542a6af')
        model.load_weights(weights_path, by_name=True)

        f = h5py.File(weights_path, 'r')
        d = f['conv1']

        # Used to work with more than 3 channels with pre-trained model
        if input_shape[2] % 3 == 0:
            model.get_layer('tuned_conv1').set_weights([d['conv1_W_1:0'][:].repeat(input_shape[2] / 3, axis=2),
                                                        d['conv1_b_1:0']])
        else:
            m = (3 * int(input_shape[2] / 3)) + 3
            model.get_layer('tuned_conv1').set_weights(
                [d['conv1_W_1:0'][:].repeat(m, axis=2)[:, :, 0:input_shape[2], :],
                 d['conv1_b_1:0']])

    return model

Я запускаю свою реализацию с изображениями 10x10x3 ипохоже на работу.Таким образом, я не понимаю, почему они ставят этот минимальный предел.

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

Таким образом, я хотел бы знать, почему такое ограничение было сделано для реализации Resnet.

1 Ответ

1 голос
/ 08 апреля 2019

ResNet50 имеет 5 ступеней понижающей дискретизации, между MaxPooling 2x2 и Strided Convolution с шагом 2 px в каждом направлении. Это означает, что минимальный входной размер равен 2 ^ 5 = 32, и это значение также является размером принимающего поля.

Нет особого смысла использовать изображения меньшего размера, чем 32x32, так как тогда понижающая дискретизация ничего не делает, и это изменит поведение сети. Для таких небольших изображений лучше использовать другую сеть с меньшей частотой дискретизации (например, DenseNet) или с меньшей глубиной.

...