attributes_w_n = tf.to_float(attribute_batch[:, 1:6])
print('attributes_w_n=',attributes_w_n.get_shape()) #?要运行时才知道,奇怪的设定
# attributes_w_n[75000,5]
mat_ratio = tf.reduce_mean(attributes_w_n,axis=0)
# mat_ratio[5],对第一维求均值
mat_ratio = tf.map_fn(lambda x:(tf.cond(x > 0,lambda: 1/x,lambda:float(args.batch_size))),mat_ratio)
# >0,则为1/x; 否则为args.batch_size。
attributes_w_n = tf.convert_to_tensor(attributes_w_n * mat_ratio)
#所有数据乘以均值?,tf.multiply()两个矩阵中对应元素各自相乘。attributes_w_n前后的维度不变
attributes_w_n = tf.reduce_sum(attributes_w_n,axis=1)
# attributes_w_n[75000],对第二个维度求和
list_ops['attributes_w_n_batch']=attributes_w_n
L2_loss = tf.add_n(tf.losses.get_regularization_losses())
# 获取总正则化loss, 为一个标量
_sum_k = tf.reduce_sum(tf.map_fn(lambda x: 1 - tf.cos(abs(x)), euler_angles_gt_batch - euler_angles_pre), axis=1)
# euler_angles_gt_batch[75000,3],每个图片都有这样的三个角度
# _sum_k[75000]
loss_sum = tf.reduce_sum(tf.square(landmark_batch - landmarks_pre), axis=1)
# landmark_batch[75000,196], 每张输入样本图片上都有196个标记
# loss_sum[75000],对第二个维度求和
loss_sum = tf.reduce_mean(loss_sum*_sum_k*attributes_w_n)
#标记的误差平方和*角度误差和*属性比值,前面的维度都是75000,从而可以对应位置相乘,再求均值得到标量与L2_loss相加
loss_sum += L2_loss
#再与总体误差相加
1)attributes_w_n对第一个维度样本数75000求均值,再做变换,再求第二个维度的和,即对第二个维度求和。
2)_sum_k对每个样本三个角度求和
3)loss_sum = tf.reduce_sum(tf.square(landmark_batch - landmarks_pre), axis=1)对标记点求平方和之类的
和论文表达还是有点区别,不知道理解得对不对?
2)