Выбор оператора свертки в сетях пространственного преобразования для облаков точек - PullRequest
1 голос
/ 25 сентября 2019

Во многих моделях глубокого обучения для анализа формы входное изображение / форма сначала проходит через некоторую сеть пространственного преобразования (STN), чтобы выровнять входной сигнал с постоянным каноническим пространством для лучшего обучения модели и производительности.Я также рассматриваю возможность включения STN в свое приложение, которое принимает входные данные от трехмерных облаков точек, поэтому я строю STN для облаков точек.

Затем я попытаюсь сослаться на некоторые существующие модели.Например, вот начальная часть (часть сети локализации) STN в PointNet :

def input_transform_net(point_cloud, is_training, bn_decay=None, K=3):
    """ Input (XYZ) Transform Net, input is BxNx3 gray image
        Return:
            Transformation matrix of size 3xK """
    batch_size = point_cloud.get_shape()[0].value
    num_point = point_cloud.get_shape()[1].value

    input_image = tf.expand_dims(point_cloud, -1)
    net = tf_util.conv2d(input_image, 64, [1,3],
                         padding='VALID', stride=[1,1],
                         bn=True, is_training=is_training,
                         scope='tconv1', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 128, [1,1],
                         padding='VALID', stride=[1,1],
                         bn=True, is_training=is_training,
                         scope='tconv2', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 1024, [1,1],
                         padding='VALID', stride=[1,1],
                         bn=True, is_training=is_training,
                         scope='tconv3', bn_decay=bn_decay)
    net = tf_util.max_pool2d(net, [num_point,1],
                             padding='VALID', scope='tmaxpool')

    # and more...

Пожалуйста, позвольте мне попытаться обобщить предпринятые здесь шаги (надеюсь, что я делаюэто прямо здесь):

1. expand input image so dimensions change from:  
    BxNx3 --> BxNx3x1.
2. 1st conv. op. has kernel size [1,3], so after 1st conv. the dimensions of image should be:   
    BxNx3x1 --> BxNx1x64
3. 2nd conv. op. has kernel size [1,1], so after 2nd conv. the dimensions of image should be:   
    BxNx1x64 --> BxNx1x128
4. ... and it goes on.

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

  1. Интересно, будет ли это эквивалентно, если я заменю Conv2d на Conv1d и изменит его на что-то вроде:
# Input dimension: BxNx3
# not expanding dims this time
net = input_image

# After 1st conv. dims:  BxNx3 --> BxNx64
net = conv1d(net, 64, kernel_size=[1], stride=[1], ...)
# After 2nd conv. dims:  BxNx64 --> BxNx128
net = conv1d(net, 64, kernel_size=[1], stride=[1], ...)
# ... and it goes on.
Исходя из первого сеттинга, мне также интересно, если конв.соч.здесь фактически эквивалентно некоторому матричному умножению / полностью связанному слою (как в тензорном потоке) / линейному слою (как в факеле):
# Reshape input dims: BxNx3 --> (B*N)x3
# so data entries in the batch are "stacked together".
net = input_image.reshape(-1, 3)

# I use torch.nn.linear() from pytorch here for easy explanation.
# which basically does the follows:

# After 1st linear:  (B*N)x3 --> (B*N)x64
net = torch.nn.linear(net, in_feat=3, out_feat=64)
# After 2nd linear:  (B*N)x64 --> (B*N)x128
net = torch.nn.linear(net, in_feat=64, out_feat=128)
# ... and it goes on.

Я на самом деле предпочитаю второй параметр, если он правильный,потому что первое измерение входного изображения может быть заменено чем-то вроде (N_1 + N_2 + ... + N_B) вместо B * N.Это означает, что мне не нужно исправлять все записи данных, чтобы они имели одинаковый размер.Конечно, при правильной настройке.

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