我有一堆图像,张量形状=(?, 64,64)。我正在尝试对每个图像应用蒙版,获取蒙版内像素的平均值,然后将其与使用其他蒙版计算出的平均值进行比较。我将用它来比较均方误差。通常,我会通过遍历切片来计算此值,但tensorflow不允许循环。有什么建议怎么做?
for l in range(NumberOfExams):
I = images[l,:,:]
meansRef[l] = I[referenceMasks[l,:,:]]
meansOut[l] = I[calculatedMasks[l,:,:]]
MSE = np.mean((meansRef - meansOut)**2/meansRef**2)
我已经尝试过使用tf.boolean_mask,它可以基于所有referenceMasks和calculatedMasks给我平均值,但是到目前为止,我尚不清楚如何使用此或其他张量流方法获得每个图像的平均值。
非常感谢。
答案 0 :(得分:0)
可以使用tf.map_fn
对每个图像的掩盖均值进行比较。这将返回对批次中的每个图像进行任意操作的结果,本质上允许循环:
所以:
for l in range(NumberOfExams):
I = images[l,:,:]
meansRef[l] = I[referenceMasks[l,:,:]]
meansOut[l] = I[calculatedMasks[l,:,:]]
MSE = np.mean((meansRef - meansOut)**2)
可以完成以下操作(可以使用清除操作):
calculatedMasksInf = tf.where(calc_mask > 0.5,Ex,-np.inf * tf.ones_like(calc_mask ))
referenceMasksInf = tf.where(ref_mask > 0.5, Ex, -np.inf * tf.ones_like(ref_mask ))
stiff_means_calculated = tf.map_fn(lambda frame: tf.reduce_mean(tf.boolean_mask(frame,tf.logical_not(tf.is_inf(frame)))), calculatedMasksInf)
stiff_means_reference = tf.map_fn(lambda frame: tf.reduce_mean(tf.boolean_mask(frame,tf.logical_not(tf.is_inf(frame)))), referenceMasksInf)
SqErr = (stiff_means_calculated - stiff_means_reference) ** 2
MSE = tf.reduce_mean(tf.boolean_mask(SqErr,tf.logical_not(tf.is_nan(SqErr))))