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返回