Во многих моделях глубокого обучения для анализа формы входное изображение / форма сначала проходит через некоторую сеть пространственного преобразования (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 (показанной выше), а также во многих других моделях.
- Интересно, будет ли это эквивалентно, если я заменю 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.Это означает, что мне не нужно исправлять все записи данных, чтобы они имели одинаковый размер.Конечно, при правильной настройке.