pointnet学习(五)train函数,第五、六句

第五句
batch = tf.Variable(0)
声明一个tensor常量,值为0,主要是供第六句get_bn_decay使用
作者给的解释是,这个batch用来设置glob_step。
第六句
bn_decay = get_bn_decay(batch),这一句用来设置train的过程中学习率的衰减系数的。

具体实现如下:
 

def get_bn_decay(batch):
    bn_momentum = tf.train.exponential_decay(
                      BN_INIT_DECAY,
                      batch*BATCH_SIZE,
                      BN_DECAY_DECAY_STEP,
                      BN_DECAY_DECAY_RATE,
                      staircase=True)
    bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum)
    return bn_decay

通过调用 tf.train.exponential_decay,以及tf.minimum来构建出bn_decay这个tensor。

tf.train.exponential_decay

tf.compat.v1.train.exponential_decay(
    learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None
)

根据官方的解释,在train的过程中,只定一个learningrate显然不够智能,也不够灵活,在train的过程中会出现各种问题,所以建议在train过程中,让learningrate按照某种规律进行衰减, exponential_decay函数则提供了一个指数衰减的函数用来更新learningrate。计算公式如下

decayed_learning_rate = learning_rate *
                        decay_rate ^ (global_step / decay_steps)

 从code可以看出,learning_rate为我们设置的初始learning_rate,我们的代码里面是BN_INIT_DECAY=0.5。global_step可以通过设置一个常量tensor来指定,我们这里利用了batch*BATCH_SIZE来指定,BATCH_SIZE默认为64,batch为0.(这里比较疑惑的是,batch这个tensor常量为0,这每次global_step都是0,岂不是不起作用了,每次learning_rate跟之前都是一样的)decay_steps代码里面设置的是DECAY_STEP=200000, decay_rate代码里面设置的是DECAY_RATE=0.7,是我们的learning_rate的衰减参数;由此可见global_step是会变化的,每次trainprocess都会变化,第一步是0,后续进行更新。最后一个参数是staircase,这里staircase设置为true那么我的global_step / decay_steps则取整数,这样我们的learning_rate衰减的指数值则为楼梯状的。

官方例子如下:

...
global_step = tf.Variable(0, trainable=False)
starter_learning_rate = 0.1
learning_rate = tf.compat.v1.train.exponential_decay(starter_learning_rate,
global_step,
                                           100000, 0.96, staircase=True)
# Passing global_step to minimize() will increment it at each step.
learning_step = (
    tf.compat.v1.train.GradientDescentOptimizer(learning_rate)
    .minimize(...my loss..., global_step=global_step)
)
tf.minimum官方例子也有个minimize

tf.minimum的功能是取较小的值,而代码里面用了bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum),其中BN_DECAY_CLIP=0.99,也就是说,作者这里的learningrate是逐渐增加的。从0.5开始,最大到0.99.

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PointNet++(PointNet2)是一种用于训练点云数据的深度学习模型。点云数据是由大量的点组成的二维或三维数据集,常用于描述物体的形状和结构。PointNet++通过学习点云数据中的特征来实现对这些数据的分类、分割、检测等任务。 PointNet++模型的训练过程包括以下几个关键步骤: 1. 数据准备:首先,需要准备训练数据集。点云数据通常以.xyz或.ply等格式存储,可以使用相应的库进行读取和处理。训练数据集应包含标签,以便进行有监督学习。 2. 网络架构设计:设计PointNet++网络架构。PointNet++由一系列层组成,其中包括特征提取、特征聚合和分类/分割等模块。在训练过程中,通过网络的前向传播,将输入的点云数据转化为特征表示,并预测其标签或细分。 3. 损失函数定义:选择适当的损失函数来度量模型在训练数据上的性能。常见的损失函数包括交叉熵损失(用于分类任务)和交叉点误差(用于分割任务)。损失函数的选择应根据具体任务进行。 4. 模型训练:通过反向传播和梯度下降优化算法,对PointNet++模型进行训练。训练过程中,将训练数据输入到网络中,计算损失函数,并根据损失函数的梯度调整网络参数,以不断优化模型的性能。 5. 参数调优:根据模型在验证集上的性能调整训练中的参数,如学习率和正则化项等。通过调优可以提高模型的性能和泛化能力。 6. 模型评估:使用测试集评估训练好的PointNet++模型的性能。可以计算精确度、召回率、F1-score等指标来评估分类或分割的准确率。 7. 预测应用:训练好的PointNet++模型可以用于对新的点云数据进行分类、分割、检测等任务。可以将待预测的点云数据输入到已训练好的模型中,通过前向传播得到预测结果。 总之,通过PointNet++模型的训练过程,可以实现对点云数据的各种任务的学习和预测,从而进行更高级的点云数据处理和分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值