Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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()))