Example #1
0
def analysis_learned_algo(x_train, x_test, A, D, L, lbda, all_n_layers, type_,
                          max_iter=300, device=None, net_kwargs=None,
                          verbose=1):
    """ NN-algo solver for analysis TV problem. """
    net_kwargs = dict() if net_kwargs is None else net_kwargs
    params = None

    _, u0_train, _ = init_vuz(A, D, x_train)
    _, u0_test, _ = init_vuz(A, D, x_test)

    train_loss_init = analysis_primal_obj(u0_train, A, D, x_train, lbda)
    test_loss_init = analysis_primal_obj(u0_test, A, D, x_test, lbda)
    train_loss, test_loss = [train_loss_init], [test_loss_init]

    algo_type = 'origtv' if ('untrained' in type_) else type_

    for n_layers in all_n_layers:

        # declare network
        algo = LearnTVAlgo(algo_type=algo_type, A=A, n_layers=n_layers,
                           max_iter=max_iter, device=device,
                           initial_parameters=params, verbose=verbose,
                           **net_kwargs)

        t0_ = time.time()
        if 'untrained' not in type_:
            algo.fit(x_train, lbda=lbda)
        delta_ = time.time() - t0_

        # save parameters
        params = algo.export_parameters()

        # get train and test error
        u_train = algo.transform(x_train, lbda, output_layer=n_layers)
        train_loss_ = analysis_primal_obj(u_train, A, D, x_train, lbda)
        train_loss.append(train_loss_)

        u_test = algo.transform(x_test, lbda, output_layer=n_layers)
        test_loss_ = analysis_primal_obj(u_test, A, D, x_test, lbda)
        test_loss.append(test_loss_)

        if verbose > 0:
            print(f"\r[{algo.name}|layers#{n_layers:3d}] model fitted "
                  f"{delta_:4.1f}s train-loss={train_loss_:.4e} "
                  f"test-loss={test_loss_:.4e}")

    to_return = (np.array(train_loss), np.array(test_loss))

    return to_return
Example #2
0
def analysis_primal_dual_iter_algo(x_train, x_test, A, D, L, lbda,
                                   all_n_layers, type_, max_iter=300,
                                   device=None, net_kwargs=None, verbose=1):
    """ Condat-Vu solver for analysis TV problem. """
    net_kwargs = dict() if net_kwargs is None else net_kwargs
    max_iter = all_n_layers[-1]
    rho = 1.0
    sigma = 0.5
    L_A = np.linalg.norm(A, ord=2) ** 2
    L_D = np.linalg.norm(D, ord=2) ** 2
    tau = 1.0 / (L_A / 2.0 + sigma * L_D)

    v0_test, u0_test, _ = init_vuz(A, D, x_test, force_numpy=True)
    v0_train, u0_train, _ = init_vuz(A, D, x_train, force_numpy=True)

    if verbose > 0:
        print("[Condat-Vu iterative] training loss")
    params = dict(
        grad=lambda u: analysis_primal_grad(u, A, x_train),
        obj=lambda u: analysis_primal_obj(u, A, D, x_train, lbda),
        prox=lambda t: _soft_th_numpy(t, lbda / sigma),
        psi=lambda u: u.dot(D), adj_psi=lambda v: v.dot(D.T),
        v0=v0_train, z0=u0_train, lbda=lbda, sigma=sigma, tau=tau, rho=rho,
        max_iter=max_iter, early_stopping=False, debug=True, verbose=verbose,
    )
    _, _, train_loss = condatvu(**params)

    if verbose > 0:
        print("[Condat-Vu iterative] testing loss")
    params = dict(
        grad=lambda u: analysis_primal_grad(u, A, x_test),
        obj=lambda u: analysis_primal_obj(u, A, D, x_test, lbda),
        prox=lambda t: _soft_th_numpy(t, lbda / sigma),
        psi=lambda u: u.dot(D), adj_psi=lambda v: v.dot(D.T),
        v0=v0_test, z0=u0_test, lbda=lbda, sigma=sigma, tau=tau, rho=rho,
        max_iter=max_iter, early_stopping=False, debug=True, verbose=verbose,
    )
    _, _, test_loss = condatvu(**params)

    train_loss = train_loss[[0] + all_n_layers]
    test_loss = test_loss[[0] + all_n_layers]

    if verbose > 0:
        print(f"\r[Condat-Vu] iterations finished "
              f"train-loss={train_loss[-1]:.4e} test-loss={test_loss[-1]:.4e}")

    return train_loss, test_loss
Example #3
0
    def record_loss(n_layers, algo):
        u_train = algo.transform_to_u(x_train, lmbd)
        u_test = algo.transform_to_u(x_test, lmbd)

        if isinstance(algo, ListaTV):
            prox_tv_loss_train = compute_prox_tv_errors(algo, x_train, lmbd)
            prox_tv_loss_test = compute_prox_tv_errors(algo, x_test, lmbd)
        else:
            prox_tv_loss_train = prox_tv_loss_test = None
        log.append(dict(
            key=key, **meta, lmbd=lmbd, extra_args=extra_args,
            n_layers=n_layers,
            train_loss=analysis_primal_obj(u_train, A, D, x_train, lmbd),
            test_loss=analysis_primal_obj(u_test, A, D, x_test, lmbd),
            prox_tv_loss_train=prox_tv_loss_train,
            prox_tv_loss_test=prox_tv_loss_test
        ))
Example #4
0
def analysis_primal_iter_algo(x_train, x_test, A, D, L, lbda, all_n_layers,
                              type_, max_iter=300, device=None,
                              net_kwargs=None, verbose=1):
    """ Iterative-algo solver for synthesis TV problem. """
    net_kwargs = dict() if net_kwargs is None else net_kwargs
    name = 'ISTA' if type_ == 'ista' else 'FISTA'
    max_iter = all_n_layers[-1]
    step_size = 1.0 / np.linalg.norm(A, ord=2) ** 2

    _, u0_test, _ = init_vuz(A, D, x_test)
    _, u0_train, _ = init_vuz(A, D, x_train)

    momentum = None if type_ == 'ista' else type_

    if verbose > 0:
        print(f"[analysis {name} iterative] training loss")
    params = dict(
        grad=lambda z: analysis_primal_grad(z, A, x_train),
        obj=lambda z: analysis_primal_obj(z, A, D, x_train, lbda),
        prox=lambda z, s: np.array([tv1_1d(z_, lbda * s) for z_ in z]),
        x0=u0_train,  momentum=momentum, restarting=None,
        max_iter=max_iter, step_size=step_size, early_stopping=False,
        debug=True, verbose=verbose,
    )
    _, train_loss = fista(**params)

    if verbose > 0:
        print(f"[analysis {name} iterative] testing loss")
    params = dict(
        grad=lambda z: analysis_primal_grad(z, A, x_test),
        obj=lambda z: analysis_primal_obj(z, A, D, x_test, lbda),
        prox=lambda z, s: np.array([tv1_1d(z_, lbda * s) for z_ in z]),
        x0=u0_test,  momentum=momentum, restarting=None,
        max_iter=max_iter, step_size=step_size, early_stopping=False,
        debug=True, verbose=verbose,
    )
    _, test_loss = fista(**params)

    train_loss = train_loss[[0] + all_n_layers]
    test_loss = test_loss[[0] + all_n_layers]

    if verbose > 0:
        print(f"\r[{name}] iterations finished "
              f"train-loss={train_loss[-1]:.6e} test-loss={test_loss[-1]:.6e}")

    return train_loss, test_loss
def test_untrained_analysis_lista(lbda, parametrization, n):
    """ Test the gradient of z. """
    rng = check_random_state(None)
    x, _, _, _, D, A = synthetic_1d_dataset(n=n, s=0.5, snr=0.0, seed=rng)
    v0, u0, _ = init_vuz(A, D, x)

    n_layers = 10
    rho = 1.0
    sigma = 0.5
    L_D = np.linalg.norm(D.dot(D.T), ord=2)
    L_A = np.linalg.norm(A.dot(A.T), ord=2)
    tau = 1.0 / (L_A / 2.0 + sigma * L_D**2)

    lista = LearnTVAlgo(algo_type=parametrization,
                        A=A,
                        n_layers=n_layers,
                        device='cpu')
    loss_untrained_condat = [analysis_primal_obj(u0, A, D, x, lbda)]
    for n_layer_ in range(1, n_layers + 1):
        z = lista.transform(x=x, lbda=lbda, output_layer=n_layer_)
        loss_untrained_condat.append(analysis_primal_obj(z, A, D, x, lbda))
    loss_untrained_condat = np.array(loss_untrained_condat)

    v0, u0, _ = init_vuz(A, D, x, force_numpy=True)
    params = dict(
        grad=lambda u: analysis_primal_grad(u, A, x),
        obj=lambda u: analysis_primal_obj(u, A, D, x, lbda),
        prox=lambda z: pseudo_soft_th_numpy(z, lbda, 1.0 / sigma),
        psi=lambda u: u.dot(D),
        adj_psi=lambda v: v.dot(D.T),
        v0=v0,
        z0=u0,
        lbda=lbda,
        sigma=sigma,
        tau=tau,
        rho=rho,
        max_iter=n_layers,
        early_stopping=False,
        debug=True,
        verbose=0,
    )
    _, _, loss_condat = condatvu(**params)

    np.testing.assert_allclose(loss_condat, loss_untrained_condat, atol=1e-20)
Example #6
0
def test_coherence_training_analysis_loss(parametrization, lbda, n):
    """ Test coherence regarding the loss function between learnt and fixed
    algorithms. """
    rng = check_random_state(None)
    x, _, _, _, D, A = synthetic_1d_dataset(n=n, s=0.5, snr=0.0, seed=rng)

    _, u0, _ = init_vuz(A, D, x)
    train_loss = [analysis_primal_obj(u0, A, D, x, lbda)]
    train_loss_ = [analysis_primal_obj(u0, A, D, x, lbda)]

    for n_layers in range(1, 10):
        lista = LearnTVAlgo(algo_type=parametrization,
                            A=A,
                            n_layers=n_layers,
                            max_iter=10)
        lista.fit(x, lbda=lbda)
        train_loss_.append(lista.training_loss_[-1])
        u = lista.transform(x, lbda, output_layer=n_layers)
        train_loss.append(analysis_primal_obj(u, A, D, x, lbda))

    np.testing.assert_allclose(train_loss_, train_loss, atol=1e-30)
Example #7
0
def test_coherence_init(lbda, seed):
    rng = check_random_state(seed)
    x, _, _, L, D, A = synthetic_1d_dataset()

    v0 = None
    v0, u0, z0 = init_vuz(A, D, x, v0=v0)
    cost_1 = synthesis_primal_obj(z0, A, L, x, lbda)
    cost_2 = analysis_primal_obj(u0, A, D, x, lbda)
    cost_3 = analysis_primal_obj(v_to_u(v0, x, A, D), A, D, x, lbda)

    np.testing.assert_allclose(cost_1, cost_2)
    np.testing.assert_allclose(cost_1, cost_3)

    v0 = rng.randn(*v0.shape)
    v0, u0, z0 = init_vuz(A, D, x, v0=v0)
    synthesis_primal_obj(z0, A, L, x, lbda)
    cost_1 = synthesis_primal_obj(z0, A, L, x, lbda)
    cost_2 = analysis_primal_obj(u0, A, D, x, lbda)
    cost_3 = analysis_primal_obj(v_to_u(v0, x, A, D), A, D, x, lbda)

    np.testing.assert_allclose(cost_1, cost_2)
    np.testing.assert_allclose(cost_1, cost_3)
Example #8
0
def test_coherence_analysis_loss(parametrization, lbda, n):
    """ Test coherence regarding the loss function between learnt and fixed
    algorithms. """
    rng = check_random_state(None)
    x, _, _, _, D, A = synthetic_1d_dataset(n=n, s=0.5, snr=0.0, seed=rng)
    _, _, z = init_vuz(A, D, x)
    z_ = check_tensor(z, device='cpu')

    cost = analysis_primal_obj(z, A, D, x, lbda=lbda)
    ltv = LearnTVAlgo(algo_type=parametrization,
                      A=A,
                      n_layers=10,
                      device='cpu')
    cost_ref = ltv._loss_fn(x, lbda, z_)

    np.testing.assert_allclose(cost_ref, cost, atol=1e-30)
Example #9
0
    def transform(self, x, lbda, output_layer=None):
        if output_layer is None:
            output_layer = self.n_layers

        _, u0, _ = init_vuz(self.A, self.D, x)

        params = dict(
            grad=lambda z: analysis_primal_grad(z, self.A, x),
            obj=lambda z: analysis_primal_obj(z, self.A, self.D, x, lbda),
            prox=lambda z, s: np.array([tv1_1d(z_, lbda * s) for z_ in z]),
            x0=u0,
            momentum=self.momentum,
            step_size=self.step_size,
            restarting=None,
            max_iter=output_layer,
            early_stopping=False,
            debug=True,
            verbose=self.verbose,
        )

        return fista(**params)[0]
Example #10
0
 def f(u):
     u = u.reshape(n, n_atoms)
     # the actual considered loss is not normalized but for
     # convenience we want to check the sample-loss average
     return analysis_primal_obj(u, A, D, x, lbda=lbda) * n
Example #11
0
 def _obj(v, x):
     v = np.atleast_2d(v)
     u = v_to_u(v, x, A=A, D=D, inv_AtA=inv_AtA)
     return analysis_primal_obj(u, A, D, x, lbda)
Example #12
0
 def record_loss(l_loss, u_train, u_test):
     l_loss.append(dict(
         train_loss=analysis_primal_obj(u_train, A, D, x_train, lbda),
         test_loss=analysis_primal_obj(u_test, A, D, x_test, lbda),
     ))
     return l_loss