code: def iou_coe(output, target, threshold=0.5, axis=(1, 2, 3), smooth=1e-5):
      
      pre = tf.cast(output > threshold, dtype=tf.float32)
      truth = tf.cast(target > threshold, dtype=tf.float32)
      inse = tf.reduce_sum(tf.multiply(pre, truth), axis=axis)  # AND
      union = tf.reduce_sum(tf.cast(tf.add(pre, truth) >= 1, dtype=tf.float32), axis=axis)  # OR
      # old axis=[0,1,2,3]
      # epsilon = 1e-5
      # batch_iou = inse / (union + epsilon)
      # new haodong
      batch_iou = (inse + smooth) / (union + smooth)
      iou = tf.reduce_mean(batch_iou, name='iou_coe')
      return iou
docs: Non-differentiable Intersection over Union (IoU) for comparing the
      similarity of two batch of data, usually be used for evaluating binary image segmentation.
      The coefficient between 0 to 1, and 1 means totally match.
  
      Parameters
      -----------
      output : tensor
          A batch of distribution with shape: [batch_size, ....], (any dimensions).
      target : tensor
          The target distribution, format the same with `output`.
      threshold : float
          The threshold value to be true.
      axis : tuple of integer
          All dimensions are reduced, default ``(1,2,3)``.
      smooth : float
          This small value will be added to the numerator and denominator, see ``dice_coe``.
  
      Notes
      ------
      - IoU cannot be used as training loss, people usually use dice coefficient for training, IoU and hard-dice for evaluating.