Exemplo n.º 1
0
def standardrecon(config, base, pos, bias, R=8):
    bs, nc = config['boxsize'], config['nc']
    basesm = tools.gauss(base, tools.fftk((nc, nc, nc), bs), R)

    g = tf.Graph()
    with g.as_default():
        mesh = tf.constant(basesm.astype(np.float32))
        meshk = tfpmfuncs.r2c3d(mesh, norm=nc**3)

        DX = tfpm.lpt1(meshk, pos, config)
        DX = tf.multiply(DX, -1 / bias)
        pos = tf.add(pos, DX)
        displaced = tf.zeros_like(mesh)
        displaced = tfpm.cic_paint(displaced,
                                   pos,
                                   boxsize=bs,
                                   name='displaced')

        DXrandom = tfpm.lpt1(meshk, config['grid'], config)
        DXrandom = tf.multiply(DXrandom, -1 / bias)
        posrandom = tf.add(config['grid'], DXrandom)
        random = tf.zeros_like(mesh)
        random = tfpm.cic_paint(random, posrandom, boxsize=bs, name='random')
        tf.add_to_collection('recon', [displaced, random])
    return g
Exemplo n.º 2
0
def mpm_mc(signal_noisy, w, p, A, m1, sig1, m2, sig2):
    """
     Cette fonction permet d'appliquer la méthode mpm pour retrouver notre signal d'origine à partir de sa version bruité et des paramètres du model.
    :param signal_noisy: Signal bruité (numpy array 1D de float)
    :param w: vecteur dont la première composante est la valeur de la classe w1 et la deuxième est la valeur de la classe w2
    :param p: vecteur de taille 2 avec la probailité d'apparition a priori pour chaque classe
    :param A: Matrice (2*2) de transition de la chaîne
    :param m1: La moyenne de la première gaussienne
    :param sig1: L'écart type de la première gaussienne
    :param m2: La moyenne de la deuxième gaussienne
    :param sig2: L'écart type de la deuxième gaussienne
    :return: Un signal discret à 2 classe (numpy array 1D d'int), résultat de la segmentation par mpm du signal d'entrée
    """
    gausses = gauss(signal_noisy, m1, sig1, m2, sig2)
    alpha = forward(A, p, gausses)
    beta = backward(A, gausses)

    gamma = alpha * beta

    X = []
    indexes = np.argmax(gamma, axis=1)

    for index in indexes:
        X.append(w[index])

    return np.array(X)
Exemplo n.º 3
0
def calc_param_EM_mc(signal_noisy, p, A, m1, sig1, m2, sig2):
    """
    Cette fonction permet de calculer les nouveaux paramètres estimé pour une itération de EM
    :param signal_noisy: Signal bruité (numpy array 1D de float)
    :param p: vecteur de taille 2 avec la probailité d'apparition a priori pour chaque classe
    :param A: Matrice (2*2) de transition de la chaîne
    :param m1: La moyenne de la première gaussienne
    :param sig1: L'écart type de la première gaussienne
    :param m2: La moyenne de la deuxième gaussienne
    :param sig2: L'écart type de la deuxième gaussienne
    :return: tous les paramètres réestimés donc p, A, m1, sig1, m2, sig2
    """
    gausses = gauss(signal_noisy, m1, sig1, m2, sig2)
    alpha = forward(A, p, gausses)
    beta = backward(A, gausses)

    gamma = np.zeros((2, len(signal_noisy)))
    for t in range(len(signal_noisy) - 1):
        for i in range(2):
            for j in range(2):
                gamma[i][t] += calculate_pijn(i, j, t, alpha, beta, gausses, A)

    p_est = [gamma[0][0], gamma[1][0]]
    A_est = np.zeros((2, 2))

    for i in range(2):
        for j in range(2):
            num, denom = 0, 0
            for t in range(len(signal_noisy) - 1):
                num += calculate_pijn(i, j, t, alpha, beta, gausses, A)
                denom += gamma[i][t]
            A_est[i][j] = num / denom

    num = [0, 0]
    denom = [0, 0]
    for t in range(len(signal_noisy)):
        print(str(t) + ' 1\r', end="")
        num[0] += signal_noisy[t] * gamma[0][t]
        denom[0] += gamma[0][t]
        num[1] += signal_noisy[t] * gamma[1][t]
        denom[1] += gamma[1][t]
    m1_est = num[0] / denom[0]
    m2_est = num[1] / denom[1]

    num = [0, 0]
    denom = [0, 0]
    for t in range(len(signal_noisy)):
        print(str(t) + ' 2\r', end="")
        num[0] += np.power(signal_noisy[t] - m1_est, 2) * gamma[0][t]
        denom[0] += gamma[0][t]
        num[1] += np.power(signal_noisy[t] - m2_est, 2) * gamma[1][t]
        denom[1] += gamma[1][t]
    sig1_est = np.sqrt(num[0] / denom[0])
    sig2_est = np.sqrt(num[1] / denom[1])

    return p_est, A_est, m1_est, sig1_est, m2_est, sig2_est
def Squeeze_excitation_layer(input_x, out_dim, ratio, layer_name, is_training):
    with tf.variable_scope(layer_name):

        squeeze = slim.avg_pool2d(input_x,
                                  input_x.get_shape()[1:3],
                                  padding='VALID',
                                  scope=layer_name + 'AvgPool')

        excitation = slim.fully_connected(squeeze,
                                          int(out_dim / ratio),
                                          activation_fn=None,
                                          scope=layer_name +
                                          '_fully_connected1')
        excitation = slim.dropout(excitation,
                                  0.5,
                                  is_training=is_training,
                                  scope=layer_name + 'Dropout_1')
        excitation = tf.nn.relu(excitation, name=layer_name + '_relu')
        excitation = slim.fully_connected(excitation,
                                          int(out_dim),
                                          activation_fn=None,
                                          scope=layer_name +
                                          '_fully_connected2')
        excitation = slim.dropout(excitation,
                                  0.5,
                                  is_training=is_training,
                                  scope=layer_name + 'Dropout_2')
        excitation = tf.nn.sigmoid(excitation, name=layer_name + '_sigmoid')

        excitation = tf.reshape(excitation, [-1, 1, 1, out_dim])
        scale = input_x * excitation
        group_net = tf.reduce_mean(scale, axis=3, keep_dims=True)
        group_net = gauss(group_net)

        group_net = slim.flatten(group_net)
        temp_list = list()
        for i in range(batch_size):
            temp_img = group_net[i, :]
            temp_img = tf.reshape(norm(temp_img), (8, 8))
            temp_img = tf.expand_dims(temp_img, axis=0)
            temp_list.append(temp_img)
        group_net = tf.concat(temp_list, axis=0)
        group_net = tf.expand_dims(group_net, axis=3)
        return scale, group_net
def calc_param_EM_gm(signal_noisy, p, m1, sig1, m2, sig2):
    """
    Cette fonction permet de calculer les nouveaux paramètres estimé pour une itération de EM
    :param signal_noisy: Signal bruité (numpy array 1D de float)
    :param p: vecteur de taille 2 avec la probailité d'apparition a priori pour chaque classe
    :param m1: La moyenne de la première gaussienne
    :param sig1: L'écart type de la première gaussienne
    :param m2: La moyenne de la deuxième gaussienne
    :param sig2: L'écart type de la deuxième gaussienne
    :return: tous les paramètres réestimés donc p, m1, sig1, m2, sig2
    """
    gausses = gauss(signal_noisy, m1, sig1, m2, sig2)
    proba_apost = p * gausses
    proba_apost = proba_apost / (proba_apost.sum(axis=1)[..., np.newaxis])
    p = proba_apost.sum(axis=0) / proba_apost.shape[0]
    m1 = (proba_apost[:, 0] * signal_noisy).sum() / proba_apost[:, 0].sum()
    sig1 = np.sqrt((proba_apost[:, 0] * ((signal_noisy - m1)**2)).sum() /
                   proba_apost[:, 0].sum())
    m2 = (proba_apost[:, 1] * signal_noisy).sum() / proba_apost[:, 1].sum()
    sig2 = np.sqrt((proba_apost[:, 1] * ((signal_noisy - m2)**2)).sum() /
                   proba_apost[:, 1].sum())
    return p, m1, sig1, m2, sig2
def mpm_gm(signal_noisy, w, p, m1, sig1, m2, sig2):
    """
    Cette fonction permet d'appliquer la méthode mpm pour retrouver notre signal d'origine à partir de sa version bruité et des paramètres du model.
    :param signal_noisy: Signal bruité (numpy array 1D de float)
    :param w: vecteur dont la première composante est la valeur de la classe w1 et la deuxième est la valeur de la classe w2
    :param p: vecteur de taille 2 avec la probailité d'apparition a priori pour chaque classe
    :param m1: La moyenne de la première gaussienne
    :param sig1: L'écart type de la première gaussienne
    :param m2: La moyenne de la deuxième gaussienne
    :param sig2: L'écart type de la deuxième gaussienne
    :return: Un signal discret à 2 classe (numpy array 1D d'int)
    """
    gausses = gauss(signal_noisy, m1, sig1, m2, sig2)
    proba_apost = p * gausses
    proba_apost = proba_apost / (proba_apost.sum(axis=1)[..., np.newaxis])

    X = []
    indexes = np.argmax(proba_apost, axis=1)

    for index in indexes:
        X.append(w[index])

    return np.array(X)