def sensitivity(y_true, y_pred): y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pos = K.round(K.clip(y_true, 0, 1)) tp = K.sum(y_pos * y_pred_pos) pos = K.sum(y_pos) return tp / (pos + K.epsilon())
def metrics_mae(rate_true, rate_pred): if args.norm_ans: rate_true = denormalize(rate_true, rate_mean, rate_std) rate_pred = denormalize(rate_pred, rate_mean, rate_std) rate_true = K.round(rate_true) rate_pred = K.round(rate_pred) return K.mean(K.abs(rate_pred - rate_true), axis=-1)
def specificity(y_true, y_pred): y_pred_neg = 1 - K.round(K.clip(y_pred, 0, 1)) y_neg = 1 - K.round(K.clip(y_true, 0, 1)) tn = K.sum(y_neg * y_pred_neg) neg = K.sum(y_neg) return tn / (neg + K.epsilon())
def recall(y_true, y_pred): # Count positive samples. c1 = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) c3 = K.sum(K.round(K.clip(y_true, 0, 1))) # How many relevant items are selected? return c1 / (c3 + smooth)
def precision(y_true, y_pred): # Count positive samples. c1 = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) c2 = K.sum(K.round(K.clip(y_pred, 0, 1))) # How many selected items are relevant? return c1 / (c2 + smooth)
def recall(y_true, y_pred): '''Calculates the recall, a metric for multi-label classification of how many relevant items are selected. ''' true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) possible_positives = K.sum(K.round(K.clip(y_true, 0, 1))) recall = true_positives / (possible_positives + K.epsilon()) return recall
def precision(y_true, y_pred): '''Calculates the precision, a metric for multi-label classification of how many selected items are relevant. ''' true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1))) precision = true_positives / (predicted_positives + K.epsilon()) return precision
def precision(y_true, y_pred): """Precision metric. Only computes a batch-wise average of precision. Computes the precision, a metric for multi-label classification of how many selected items are relevant. """ true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1))) precision = true_positives / (predicted_positives + K.epsilon()) return true_positives
def recall(y_true, y_pred): """Recall metric. Only computes a batch-wise average of recall. Computes the recall, a metric for multi-label classification of how many relevant items are selected. """ true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) possible_positives = K.sum(K.round(K.clip(y_true, 0, 1))) recall = true_positives / (possible_positives + K.epsilon()) return recall
def f1(y_true, y_pred): y_true_f = KB.flatten(y_true) y_pred_f = KB.flatten(y_pred) true_positives = KB.sum(KB.round(KB.clip(y_true_f * y_pred_f, 0, 1)), axis=-1) possible_positives = KB.sum(KB.round(KB.clip(y_true_f, 0, 1)), axis=-1) recall = true_positives / (possible_positives + KB.epsilon()) predicted_positives = KB.sum(KB.round(KB.clip(y_pred_f, 0, 1)), axis=-1) precision = true_positives / (predicted_positives + KB.epsilon()) return 2*((precision*recall)/(precision+recall+KB.epsilon()))
def call(self, x, mask=None): input_shape = K.shape(x) if self.dim_ordering == 'th': num_rows = input_shape[2] num_cols = input_shape[3] elif self.dim_ordering == 'tf': num_rows = input_shape[1] num_cols = input_shape[2] row_length = [K.cast(num_rows, 'float32') / i for i in self.pool_list] col_length = [K.cast(num_cols, 'float32') / i for i in self.pool_list] outputs = [] if self.dim_ordering == 'th': for pool_num, num_pool_regions in enumerate(self.pool_list): for ix in range(num_pool_regions): for jy in range(num_pool_regions): x1 = ix * col_length[pool_num] x2 = ix * col_length[pool_num] + col_length[pool_num] y1 = jy * row_length[pool_num] y2 = jy * row_length[pool_num] + row_length[pool_num] x1 = K.cast(K.round(x1), 'int32') x2 = K.cast(K.round(x2), 'int32') y1 = K.cast(K.round(y1), 'int32') y2 = K.cast(K.round(y2), 'int32') new_shape = [input_shape[0], input_shape[1], y2 - y1, x2 - x1] x_crop = x[:, :, y1:y2, x1:x2] xm = K.reshape(x_crop, new_shape) pooled_val = K.max(xm, axis=(2, 3)) outputs.append(pooled_val) elif self.dim_ordering == 'tf': for pool_num, num_pool_regions in enumerate(self.pool_list): for ix in range(num_pool_regions): for jy in range(num_pool_regions): x1 = ix * col_length[pool_num] x2 = ix * col_length[pool_num] + col_length[pool_num] y1 = jy * row_length[pool_num] y2 = jy * row_length[pool_num] + row_length[pool_num] x1 = K.cast(K.round(x1), 'int32') x2 = K.cast(K.round(x2), 'int32') y1 = K.cast(K.round(y1), 'int32') y2 = K.cast(K.round(y2), 'int32') new_shape = [input_shape[0], y2 - y1, x2 - x1, input_shape[3]] x_crop = x[:, y1:y2, x1:x2, :] xm = K.reshape(x_crop, new_shape) pooled_val = K.max(xm, axis=(1, 2)) outputs.append(pooled_val) outputs = K.concatenate(outputs) return outputs
def precision_K(y_true, y_pred): """ Calculate precision for keras tensors Args: y_true: true labels y_pred: predicted labels Returns: precision """ true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1))) precision = true_positives / (predicted_positives + K.epsilon()) return precision
def recall_K(y_true, y_pred): """ Calculate recall for keras tensors Args: y_true: true labels y_pred: predicted labels Returns: recall """ true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) possible_positives = K.sum(K.round(K.clip(y_true, 0, 1))) recall = true_positives / (possible_positives + K.epsilon()) return recall
def spec(y_true, y_pred): y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pred_neg = 1 - y_pred_pos y_pos = K.round(K.clip(y_true, 0, 1)) y_neg = 1 - y_pos tp = K.sum(y_pos * y_pred_pos) tn = K.sum(y_neg * y_pred_neg) fp = K.sum(y_neg * y_pred_pos) fn = K.sum(y_pos * y_pred_neg) sp = tn / (fp + tn) return sp
def sens(y_true, y_pred): y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pred_neg = 1 - y_pred_pos y_pos = K.round(K.clip(y_true, 0, 1)) y_neg = 1 - y_pos tp = K.sum(y_pos * y_pred_pos) tn = K.sum(y_neg * y_pred_neg) fp = K.sum(y_neg * y_pred_pos) fn = K.sum(y_pos * y_pred_neg) se = tp / (tp + fn) return se
def fbeta_score(y_true, y_pred, beta=1): '''Calculates the F score, the weighted harmonic mean of precision and recall. This is useful for multi-label classification, where input samples can be classified as sets of labels. By only using accuracy (precision) a model would achieve a perfect score by simply assigning every class to every input. In order to avoid this, a metric should penalize incorrect class assignments as well (recall). The F-beta score (ranged from 0.0 to 1.0) computes this, as a weighted mean of the proportion of correct class assignments vs. the proportion of incorrect class assignments. With beta = 1, this is equivalent to a F-measure. With beta < 1, assigning correct classes becomes more important, and with beta > 1 the metric is instead weighted towards penalizing incorrect class assignments. ''' if beta < 0: raise ValueError('The lowest choosable beta is zero (only precision).') # If there are no true positives, fix the F score at 0 like sklearn. if K.sum(K.round(K.clip(y_true, 0, 1))) == 0: return 0 p = precision(y_true, y_pred) r = recall(y_true, y_pred) bb = beta ** 2 fbeta_score = (1 + bb) * (p * r) / (bb * p + r + K.epsilon()) return fbeta_score
def correct_boxes(box_xy, box_wh, input_shape, image_shape): '''Get corrected boxes''' box_yx = box_xy[..., ::-1] box_hw = box_wh[..., ::-1] input_shape = K.cast(input_shape, K.dtype(box_yx)) image_shape = K.cast(image_shape, K.dtype(box_yx)) new_shape = K.round(image_shape * K.min(input_shape / image_shape)) offset = (input_shape - new_shape) / 2. / input_shape scale = input_shape / new_shape box_yx = (box_yx - offset) * scale box_hw *= scale box_mins = box_yx - (box_hw / 2.) box_maxes = box_yx + (box_hw / 2.) boxes = K.concatenate([ box_mins[..., 0:1], # y_min box_mins[..., 1:2], # x_min box_maxes[..., 0:1], # y_max box_maxes[..., 1:2] # x_max ]) # Scale boxes back to original image shape. boxes *= K.concatenate([image_shape, image_shape]) return boxes
def jaccard_coef_int(y_true, y_pred): # __author__ = Vladimir Iglovikov y_pred_pos = K.round(K.clip(y_pred, 0, 1)) intersection = K.sum(y_true * y_pred_pos, axis=[0, -1, -2]) sum_ = K.sum(y_true + y_pred_pos, axis=[0, -1, -2]) #sum_ = K.sum(y_true + y_pred, axis=[0, -1, -2]) jac = (intersection + smooth) / (sum_ - intersection + smooth) return K.mean(jac)
def precision(y_true, y_pred): """ Precision metric. Only computes a batch-wise average of precision. Computes the precision, a metric for multi-label classification of how many selected items are relevant. Source ------ https://github.com/fchollet/keras/issues/5400#issuecomment-314747992 """ true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1))) precision = true_positives / (predicted_positives + K.epsilon()) return precision
def f1_score(y_true, y_pred): # https://stackoverflow.com/questions/43345909/when-using-mectrics-in-model-compile-in-keras-report-valueerror-unknown-metr # Count positive samples. c1 = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) c2 = K.sum(K.round(K.clip(y_pred, 0, 1))) c3 = K.sum(K.round(K.clip(y_true, 0, 1))) # How many selected items are relevant? precision = c1 / (c2 + smooth) # How many relevant items are selected? recall = c1 / (c3 + smooth) # Calculate f1_score f1_score = 2 * (precision * recall) / (precision + recall + smooth) return f1_score
def jaccard_coef_int(y_true, y_pred): y_pred_pos = K.round(K.clip(y_pred, 0, 1)) intersection = K.sum(y_true * y_pred_pos, axis=[0, -1, -2]) sum_ = K.sum(y_true + y_pred_pos, axis=[0, -1, -2]) jac = (intersection + smooth) / (sum_ - intersection + smooth) return K.mean(jac)
def true_positive_rate(y_true, y_pred, mode='p'): threshold_value = 0.5 if mode=='n': threshold_value=1-threshold_value # works as round() with threshold_value y_pred = K.cast(K.greater(K.clip(y_pred, 0, 1), threshold_value), K.floatx()) true_positives = K.round(K.sum(K.clip(y_true * y_pred, 0, 1))) real_positives = K.sum(K.clip(y_true, 0, 1)) return true_positives / (real_positives + K.epsilon())
def matthews_correlation(y_true, y_pred): '''Calculates the Matthews correlation coefficient measure for quality of binary classification problems. ''' y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pred_neg = 1 - y_pred_pos y_pos = K.round(K.clip(y_true, 0, 1)) y_neg = 1 - y_pos tp = K.sum(y_pos * y_pred_pos) tn = K.sum(y_neg * y_pred_neg) fp = K.sum(y_neg * y_pred_pos) fn = K.sum(y_pos * y_pred_neg) numerator = (tp * tn - fp * fn) denominator = K.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn)) return numerator / (denominator + K.epsilon())
def fbeta_score_K(y_true, y_pred, beta=1): if beta < 0: raise ValueError('The lowest choosable beta is zero (only precision).') if K.sum(K.round(K.clip(y_true, 0, 1))) == 0: return 0 p = precision_K(y_true, y_pred) r = recall_K(y_true, y_pred) bb = beta ** 2 fbeta_score = (1 + bb) * (p * r) / (bb * p + r + K.epsilon()) return fbeta_score
def fbeta(y_true, y_pred, threshold_shift=0): """ Submissions are evaluated based on the F-beta score, it measures acccuracy using precision and recall. Beta = 2 here. """ beta = 2 # just in case of hipster activation at the final layer y_pred = K.clip(y_pred, 0, 1) # shifting the prediction threshold from .5 if needed y_pred_bin = K.round(y_pred + threshold_shift) tp = K.sum(K.round(y_true * y_pred_bin)) + K.epsilon() fp = K.sum(K.round(K.clip(y_pred_bin - y_true, 0, 1))) fn = K.sum(K.round(K.clip(y_true - y_pred, 0, 1))) precision = tp / (tp + fp) recall = tp / (tp + fn) beta_squared = beta ** 2 return (beta_squared + 1) * (precision * recall) / (beta_squared * precision + recall + K.epsilon())
def contingency_table(y, z): """Compute contingency table.""" y = K.round(y) z = K.round(z) def count_matches(a, b): tmp = K.concatenate([a, b]) return K.sum(K.cast(K.all(tmp, -1), K.floatx())) ones = K.ones_like(y) zeros = K.zeros_like(y) y_ones = K.equal(y, ones) y_zeros = K.equal(y, zeros) z_ones = K.equal(z, ones) z_zeros = K.equal(z, zeros) tp = count_matches(y_ones, z_ones) tn = count_matches(y_zeros, z_zeros) fp = count_matches(y_zeros, z_ones) fn = count_matches(y_ones, z_zeros) return (tp, tn, fp, fn)
def matthews_correlation(y_true, y_pred): """Matthews correlation metric. It is only computed as a batch-wise average, not globally. Computes the Matthews correlation coefficient measure for quality of binary classification problems. """ y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pred_neg = 1 - y_pred_pos y_pos = K.round(K.clip(y_true, 0, 1)) y_neg = 1 - y_pos tp = K.sum(y_pos * y_pred_pos) tn = K.sum(y_neg * y_pred_neg) fp = K.sum(y_neg * y_pred_pos) fn = K.sum(y_pos * y_pred_neg) numerator = (tp * tn - fp * fn) denominator = K.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn)) return numerator / (denominator + K.epsilon())
def __call__(self, y_true, y_pred): """Computes the number of true positives in a batch. # Arguments y_true: Tensor, batch_wise labels y_pred: Tensor, batch_wise predictions # Returns The total number of true positives seen this epoch at the completion of the batch. """ y_true = K.cast(y_true, 'int32') y_pred = K.cast(K.round(y_pred), 'int32') correct_preds = K.cast(K.equal(y_pred, y_true), 'int32') true_pos = K.cast(K.sum(correct_preds * y_true), 'int32') current_true_pos = self.true_positives * 1 self.add_update(K.update_add(self.true_positives, true_pos), inputs=[y_true, y_pred]) return current_true_pos + true_pos
def fbeta_score_K(y_true, y_pred, beta=1): """ Calculate f-beta score for keras tensors Args: y_true: true labels y_pred: predicted labels Returns: f-beta score """ if beta < 0: raise ValueError('The lowest choosable beta is zero (only precision).') if K.sum(K.round(K.clip(y_true, 0, 1))) == 0: return 0 p = precision_K(y_true, y_pred) r = recall_K(y_true, y_pred) bb = beta ** 2 fbeta_score = (1 + bb) * (p * r) / (bb * p + r + K.epsilon()) return fbeta_score
def round_through(x): rounded = K.round(x) return x + K.stop_gradient(rounded - x)
def reverse_sequence(self, x, mask): mask_len = K.round(K.sum(mask, 1)[:, 0]) #统计mask有多长 mask_len = K.cast(mask_len, 'int32') # 仅把有值的部分反转 return K.tf.reverse_sequence(x, mask_len, seq_dim=1)
def accuracy(y_true, y_pred): return K.mean(K.equal(y_true, K.round(y_pred)), axis=1)
def defect_accuracy(y_true, y_pred): return K.mean(K.equal(y_true, K.round(y_pred)), axis=1)
def true_negatives(y_true, y_pred): y_pred_neg = 1 - K.round(K.clip(y_pred, 0, 1)) y_neg = 1 - K.round(K.clip(y_true, 0, 1)) true_negatives = K.sum(y_neg * y_pred_neg) return true_negatives
def true_positive_rate(y_true, y_pred): y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pos = K.round(K.clip(y_true, 0, 1)) true_positives = K.sum(y_pos * y_pred_pos) / K.sum(y_pos + K.epsilon()) return true_positives
def false_negative_rate(y_true, y_pred): y_pred_neg = 1 - K.round(K.clip(y_pred, 0, 1)) y_pos = K.round(K.clip(y_true, 0, 1)) false_negatives = K.sum(y_pos * y_pred_neg) / K.sum(y_pos + K.epsilon()) return false_negatives
def acc1(y_true, y_pred): return K.mean(K.equal(y_true, K.round(y_pred)), axis=[1, 2, 3])
def sensitivity(y_true, y_pred): true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) possible_positives = K.sum(K.round(K.clip(y_true, 0, 1))) return true_positives / (possible_positives + K.epsilon())
def acc2(y_true, y_pred): return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
def dice_coef_rounded(y_true, y_pred): y_true_f = K.flatten(K.round(y_true)) y_pred_f = K.flatten(K.round(y_pred)) intersection = K.sum(y_true_f * y_pred_f) return (2. * intersection + 1) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1)
def pred_pos(yt, yp): return K.sum(K.round(yp)) / K.sum(K.clip(yt, 1, 1))
def true_pos(yt, yp): return K.sum(K.round(yt)) / K.sum(K.clip(yt, 1, 1))
def _count_accuracy(y_true, y_pred): acc_all = K.cast(K.equal(y_true, K.round(y_pred)), 'int8') acc_batch = K.min(acc_all, axis=-1, keepdims=False) acc = K.mean(K.cast(acc_batch, 'float32'), axis=-1) return acc
def soft_acc(y_true, y_pred): return backend.mean( backend.equal(backend.round(y_true), backend.round(y_pred)))
def bin_accuracy(y_true, y_pred): return K.mean(K.equal(K.round(y_true), K.round(y_pred)), axis=-1)
def recall(y_true, y_pred): true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) possible_positives = K.sum(K.round(K.clip(y_true, 0, 1))) recall = true_positives / (possible_positives + K.epsilon()) return recall
def true_negative_rate(y_true, y_pred): y_pred_neg = 1 - K.round(K.clip(y_pred, 0, 1)) y_neg = 1 - K.round(K.clip(y_true, 0, 1)) true_negatives = K.sum(y_neg * y_pred_neg) / K.sum(y_neg + K.epsilon()) return true_negatives
def precision(y_true, y_pred): true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1))) precision = true_positives / (predicted_positives + K.epsilon()) return precision
def false_negatives(y_true, y_pred): y_pred_neg = 1 - K.round(K.clip(y_pred, 0, 1)) y_pos = K.round(K.clip(y_true, 0, 1)) false_negatives = K.sum(y_pos * y_pred_neg) return false_negatives
def true_positive_rate(y_true, y_pred): return K.sum(K.flatten(y_true)*K.flatten(K.round(y_pred)))/K.sum(y_true)
def true_positives(y_true, y_pred): y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pos = K.round(K.clip(y_true, 0, 1)) true_positives = K.sum(y_pos * y_pred_pos) return true_positives
def multi_acc(y_true, y_pred): return K.mean(K.cast(K.equal(K.round(y_pred), K.round(y_true)), tf.float32), axis=-1)
def soft_binary_accuracy(y_true, y_pred): """Binary accuracy that works when inputs are probabilities """ return K.mean(K.mean(K.equal(K.round(y_true), K.round(y_pred)), axis=-1), axis=-1)
def ber(y_true, y_pred): return K.mean(K.not_equal(y_true, K.round(y_pred)))
def recall_cont(y_true, y_pred): true_pos = K.sum(y_true * K.round(y_pred)) false_neg = K.sum(y_true * K.round(1 - y_pred)) return (true_pos + 0.1) / (true_pos + false_neg + 0.1)
def precision(y_true, y_pred): true_pos = K.sum(y_true * K.round(y_pred)) false_pos = K.sum((1 - y_true) * K.round(y_pred)) return (true_pos + 0.1) / (true_pos + false_pos + 0.1)
def masked_accuracy(y_true, y_pred): dtype = K.floatx() total = K.sum(K.cast(K.not_equal(y_true, -1), dtype)) correct = K.sum(K.cast(K.equal(y_true, K.round(y_pred)), dtype)) return correct / total
def _int32(y_true, y_pred): y_true = K.cast(y_true, "int32") y_pred = K.cast(K.round(y_pred), "int32") return y_true, y_pred
def call(self, x, mask=None): input_shape = K.shape(x) if self.dim_ordering == 'th': num_rows = input_shape[2] num_cols = input_shape[3] elif self.dim_ordering == 'tf': num_rows = input_shape[1] num_cols = input_shape[2] row_length = [K.cast(num_rows, 'float32') / i for i in self.pool_list] col_length = [K.cast(num_cols, 'float32') / i for i in self.pool_list] outputs = [] if self.dim_ordering == 'th': for pool_num, num_pool_regions in enumerate(self.pool_list): for jy in range(num_pool_regions): for ix in range(num_pool_regions): x1 = ix * col_length[pool_num] x2 = ix * col_length[pool_num] + col_length[pool_num] y1 = jy * row_length[pool_num] y2 = jy * row_length[pool_num] + row_length[pool_num] x1 = K.cast(K.round(x1), 'int32') x2 = K.cast(K.round(x2), 'int32') y1 = K.cast(K.round(y1), 'int32') y2 = K.cast(K.round(y2), 'int32') new_shape = [input_shape[0], input_shape[1], y2 - y1, x2 - x1] x_crop = x[:, :, y1:y2, x1:x2] xm = K.reshape(x_crop, new_shape) pooled_val = K.max(xm, axis=(2, 3)) outputs.append(pooled_val) elif self.dim_ordering == 'tf': for pool_num, num_pool_regions in enumerate(self.pool_list): for jy in range(num_pool_regions): for ix in range(num_pool_regions): x1 = ix * col_length[pool_num] x2 = ix * col_length[pool_num] + col_length[pool_num] y1 = jy * row_length[pool_num] y2 = jy * row_length[pool_num] + row_length[pool_num] x1 = K.cast(K.round(x1), 'int32') x2 = K.cast(K.round(x2), 'int32') y1 = K.cast(K.round(y1), 'int32') y2 = K.cast(K.round(y2), 'int32') new_shape = [input_shape[0], y2 - y1, x2 - x1, input_shape[3]] x_crop = x[:, y1:y2, x1:x2, :] xm = K.reshape(x_crop, new_shape) pooled_val = K.max(xm, axis=(1, 2)) outputs.append(pooled_val) if self.dim_ordering == 'th': outputs = K.concatenate(outputs) elif self.dim_ordering == 'tf': #outputs = K.concatenate(outputs,axis = 1) outputs = K.concatenate(outputs) #outputs = K.reshape(outputs,(len(self.pool_list),self.num_outputs_per_channel,input_shape[0],input_shape[1])) #outputs = K.permute_dimensions(outputs,(3,1,0,2)) #outputs = K.reshape(outputs,(input_shape[0], self.num_outputs_per_channel * self.nb_channels)) return outputs
def IOU(y_true, y_pred, smooth=1e-8): y_true_f = K.flatten(K.round(y_true)) y_pred_f = K.flatten(K.round(y_pred)) intersection = y_true_f * y_pred_f union = y_true_f + y_pred_f - intersection return (K.sum(intersection) + smooth) / (K.sum(union) + smooth)