pointnet (九)train函数,第九句

loss = MODEL.get_loss(pred, labels_pl, end_points)

第七句,第八句是获得net以及transformnet,最终得到的值需要与label一起进行计算pointnet学习(六)train函数第七第八句

pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl, bn_decay=bn_decay)返回的pred即为net,endpoint是transformnet

 现在看loss详细实现

def get_loss(pred, label, end_points, reg_weight=0.001):
    """ pred: B*NUM_CLASSES,
        label: B, """
    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label)
    classify_loss = tf.reduce_mean(loss)
    tf.summary.scalar('classify loss', classify_loss)

    # Enforce the transformation as orthogonal matrix
    transform = end_points['transform'] # BxKxK
    K = transform.get_shape()[1].value
    mat_diff = tf.matmul(transform, tf.transpose(transform, perm=[0,2,1]))
    mat_diff -= tf.constant(np.eye(K), dtype=tf.float32)
    mat_diff_loss = tf.nn.l2_loss(mat_diff) 
    tf.summary.scalar('mat loss', mat_diff_loss)

    return classify_loss + mat_diff_loss * reg_weight

第一句,第二句

loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label)
    classify_loss = tf.reduce_mean(loss)

采用tensorflow实现的交叉熵,得到loss vector,然后调用tf.reduce_mean得到vector的均值。最终得到loss。(此处还未深入,后续补上)

第三句第四句

transform = end_points['transform'] # BxKxK
K = transform.get_shape()[1].value

end_points是个字典,通过transform关键字得到transform 的tensor

因为transform为32.3.3的tensor所以k为3

第五句,

mat_diff = tf.matmul(transform, tf.transpose(transform, perm=[0,2,1]))

其中

tf.transpose(transform, perm=[0,2,1])

是对transform按照perm指定进行重新排序,因为我们transform的0shape是batchsize所以不能变化。把2跟1的维度进行变化(转置)

因此matmul进行相乘,taransform*transform.T();

第六句

mat_diff -= tf.constant(np.eye(K), dtype=tf.float32)

其中np.eye(K)为产生一个单位矩阵,此工程为3,3的单位矩阵,

然后经过tf,constant初始化为一个3,3的2d的tensor

最后经过taransform*transform.T()-tf.constant

第三四五六句,提示是Enforce the transformation as orthogonal matrix

但是A*A转置-I是正交化吗?

下面是我试验的结果

import tensorflow as tf
import numpy as np
if __name__ == "__main__":
    with tf.Graph().as_default():
        with tf.device('/cpu:0'):
            Mtnp=np.array([[1,2,3],[1,2,3],[1,2,3]])
            MtInp=np.array([[1,0,0],[0,1,0],[0,0,1]])
            Mt=Mtnp.T
            Mt=np.cross(Mtnp,Mtnp.T)
            Tten=tf.constant(Mtnp,dtype=tf.float32)
            TtenT=tf.constant(Mtnp.T,dtype=tf.float32)
            resulttensor = tf.matmul(Tten,TtenT)
            resulttensor -= tf.constant(np.eye(3), dtype=tf.float32)
            sess = tf.Session()
            resultsess=sess.run(resulttensor)
            print(resultsess)

这明显不是正交矩阵(后续看懂再补上)暂时理解为获取loss,正向传递

mat_diff_loss = tf.nn.l2_loss(mat_diff) 

参考tf.nn.l2_loss,对正交化之后的tensor每个元素平方求和然后除以2

最后一句

classify_loss + mat_diff_loss * reg_weight
reg_weight没有指定,默认为0.001

最后将loss以标量tensor返回

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值