点云处理网络中的Shared MLP


在点云处理网络中常看到Shared MLP的网络结构,它和我们认知的多层感知机MLP有什么区别和联系呢?


PointNet网络结构

结论

被广泛应用的Shared MLP(用于减少网络的训练参数,实现类似CNN的权值共享机制)其本质是用[1,1]大小的卷积核去做卷积操作,减少了大量的参数。

分析PointNet的源代码model/pointnet_seg.py/get_model():
其中输入为Batch_size x 点数 x 3(点云坐标),输出为Batch_size x 点数 x 50(分类)

具体被用来做shared MLP的是函数tf_util.conv2d() ,PointNet中的具体函数如下:

net = tf_util.conv2d(input_image, 64, [1,3],
                         padding='VALID', stride=[1,1],
                         bn=True, is_training=is_training,
                         scope='conv1', bn_decay=bn_decay)

在tf_util.py中我们可以找到PointNet中使用的conv2d()函数,对应到tf.nn.conv2d的调用则如下:

def conv2d(inputs,
           num_output_channels,
           kernel_size,
           scope,
           stride=[1, 1],
           padding='SAME',
           use_xavier=True,
           stddev=1e-3,
           weight_decay=0.0,
           activation_fn=tf.nn.relu,
           bn=False,
           bn_decay=None,
           is_training=None):
      kernel_h, kernel_w = kernel_size
      num_in_channels = inputs.get_shape()[-1].value
      kernel_shape = [kernel_h, kernel_w,
                      num_in_channels, num_output_channels]
      kernel = _variable_with_weight_decay('weights',
                                           shape=kernel_shape,
                                           use_xavier=use_xavier,
                                           stddev=stddev,
                                           wd=weight_decay)
      stride_h, stride_w = stride
      outputs = tf.nn.conv2d(inputs, kernel,
                             [1, stride_h, stride_w, 1],
                             padding=padding)

其中比较重要的参数有:num_output_channels = 64,kernel_size = [1, 3],stride = [1, 1]。对应到tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)函数。

(1)输入数据为[Batch_size, 点数, 3, 1];

(2)卷积核大小为[1, 3, 1, 64],具体含义为卷积核的高度为1,宽度为3,图像通道数为1,卷积核数为64,即64个1x3的卷积核;

(3)步长为[1, 1]

最后的输出是[Batch_size, 点数, 1, 64]。可以理解为,每个[1,3]的卷积核依次对点进行卷积得到[点数,1,1],即新生成一个通道;所有的卷积核卷积完后生成64个通道。

因此再下一次的卷积输入[Batch_size, 点数, 1, 64]为的卷积核为[1,1,64,64],每个[1,1]的卷积核将64个通道的卷积结果求和并通过激活函数后输出,对应的输出为[Batch_size, 点数,64]。

因此使用大小为1的卷积核卷积,输出的维度受限于卷积核的个数,即通道数。

通过使用这种方法,大大的减少了参数的使用,例如将[3,2500]的点云升维为[64,2500],对全连接网络(全连接网络对于超过二维的多维输入[B,N,C],只是输入形式需要改变一下,通道在后,其他的和conv1d没区别。而使用这种方法仅用了3x64个参数(64个[1,3]卷积核),对于输出的某一个点N1的C1维度(B,C1,N1)来说,他是输入点N1对应C维特征的加权求和,某一点的输出特征只受到该点输入特征的影响,和其他点特征无关,这也是对应到MLP中共享参数的原因。


参考文献

参考文献1

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值