def Active_Contour_Loss(y_true, y_pred): # y_pred = K.cast(y_pred, dtype = 'float64') """ lenth term """ x = y_pred[:, :, 1:, :] - y_pred[:, :, :-1, :] # horizontal and vertical directions y = y_pred[:, :, :, 1:] - y_pred[:, :, :, :-1] delta_x = x[:, :, 1:, :-2] ** 2 delta_y = y[:, :, :-2, 1:] ** 2 delta_u = K.abs(delta_x + delta_y) epsilon = 0.00000001 # where is a parameter to avoid square root is zero in practice. w = 1 lenth = w * K.sum(K.sqrt(delta_u + epsilon)) # equ.(11) in the paper """ region term """ C_1 = np.ones((480, 320)) C_2 = np.zeros((480, 320)) region_in = K.abs(K.sum(y_pred[:, 0, :, :] * ((y_true[:, 0, :, :] - C_1) ** 2))) # equ.(12) in the paper region_out = K.abs(K.sum((1 - y_pred[:, 0, :, :]) * ((y_true[:, 0, :, :] - C_2) ** 2))) # equ.(12) in the paper lambdaP = 1 # lambda parameter could be various. loss = lenth + lambdaP * (region_in + region_out) return loss
def equalize_learning_rate(shape, gain, fan_in=None): """ He 초기화의 상수로 모든 층의 가중치를 조정하여 특성마다 각기 다른 다이내믹 레인지를 가지도록 분산을 맞춥니다. shape : 텐서(층)의 크기: 각 층의 차원입니다. 예를 들어, [4, 4, 48, 3]. 이 경우 [커널 크기, 커널 크기, 필터 개수, 특성맵]입니다. 하지만 구현에 따라 조금 다를 수 있습니다. gain : 일반적으로 sqrt(2) fan_in : 세이비어/He 초기화에서 입력 연결 개수 """ # 기본 값은 특성 맵 차원을 제외하고 shape의 모든 차원을 곱합니다. # 이를 통해 뉴련마다 입력 연결 개수를 얻습니다. if fan_in is None: fan_in = np.prod(shape[:-1]) # He 초기화 상수 std = gain / K.sqrt(fan_in) # 조정을 위한 상수를 만듭니다. wscale = K.constant(std, name="wscale", dtype=float32) # 가중치 값을 얻어 브로드캐스팅으로 wscale을 적용합니다. adjusted_weights = K.get_value( "layer", shape=shape, initalizer=tf.initializers.random_normal()) * wscale return adjusted_weights
def euclidean_distance(x, y): sum_sqrt = K.sum(K.square(x - y), axis=1, keepdims=True) return K.sqrt(K.maximum(sum_sqrt, K.epsilon()))