1)这里是对属性/类别求误差。
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 = tf.to_float(attribute_batch[:, 1:6])之后为attributes_w_n [M,5]
1.1) mat_ratio = tf.reduce_mean(attributes_w_n,axis=0)表示: tmp[1:5]=0 for i in range(M): tmp[:]=tmp[:]+attributes_w_n[i,:] mat_ratio = tmp/M 求M个的均值。 1.2) mat_ratio = tf.map_fn(lambda x:(tf.cond(x > 0,lambda: 1/x,lambda:float(args.batch_size))),mat_ratio) mat_ratio 是一个包含5个元素的数组,这里做了个转换,仍然是个5个元素的数组。 1.3) attributes_w_n = tf.convert_to_tensor(attributes_w_n * mat_ratio) attributes_w_n * mat_ratio表示: for i in range(M): attributes_w_n[i][:]=attributes_w_n[i][:]*mat_ratio[:] 对应位置相乘。 1.4) attributes_w_n = tf.reduce_sum(attributes_w_n,axis=1) 表示: for i in rannge(M): tmp=0 for j in range(5): tmp=tmp+attributes_w_n[i][j] attributes_w_n[i]=tmp/5 大概是这个意思吧2)
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[M,3],每个图片都有这样的三个角度 # 对每个样本三个角度1-cos()后求和 # 得到_sum_k[M] loss_sum = tf.reduce_sum(tf.square(landmark_batch - landmarks_pre), axis=1) # landmark_batch[M,196], 每张输入样本图片上都有196个标记。N=196 # loss_sum[M],对第二个维度求和 loss_sum = tf.reduce_mean(loss_sum*_sum_k*attributes_w_n) #标记的误差平方和*角度误差和*属性比值,前面的维度都是M,从而可以对应位置相乘,再求均值得到标量 loss_sum += L2_loss #再与总体网络模型误差相加