Пример #1
0
def plot_eigenvalues_set(fx, nx, limits=(-6, 6), nsamples=1000, fname=None):
    x = torch.rand(nsamples, nx,
                   dtype=torch.float) * (limits[1] - limits[0]) + limits[0]
    Astars, *_ = lpv_batched(fx, x)
    Astars = Astars.detach().numpy()
    eigvals = compute_eigenvalues(Astars)
    plot_eigenvalues(eigvals, fname=fname)
    return eigvals
Пример #2
0
def plot_phase_portrait_hidim(fx,
                              nx,
                              limits=(-6, 6),
                              nsamples=1000,
                              fname=None):
    x = torch.rand(nsamples, nx,
                   dtype=torch.float) * (limits[1] - limits[0]) + limits[0]
    Astars, *_ = lpv_batched(fx, x)

    XY = torch.empty(nsamples, 2)
    UV = torch.empty(nsamples, 2)
    for i, (Astar, x_sample) in enumerate(zip(Astars, x)):
        z_sample = torch.matmul(Astar, x_sample)
        u, s, vh = torch.svd(Astar)
        # vh = u[:2, ...]
        # # TODO Jan: I believe we want to use right singular vectors
        # #  for projection onto principal components
        vh = vh[:2, ...]
        XY[i, ...] = torch.matmul(vh, x_sample)
        UV[i, ...] = torch.matmul(vh, z_sample)

    X, Y = XY.T.detach().numpy()
    U, V = UV.T.detach().numpy()

    # plot vector field
    fig, ax = plt.subplots()
    ax.quiver(X,
              Y,
              U,
              V,
              angles="uv",
              pivot="mid",
              width=0.002,
              headwidth=4,
              headlength=5)
    ax.set_aspect(1)

    if fname is not None:
        plt.savefig(fname)
        plt.close()

    return [ax]
Пример #3
0
def plot_Jacobian_norms(fx, nx, limits=(-6, 6), nsamples=10, fname=None):
    x = torch.rand(nsamples, nx,
                   dtype=torch.float) * (limits[1] - limits[0]) + limits[0]
    Astars, *_ = lpv_batched(fx, x)
    Astars_np = Astars.detach().numpy()

    Astars_mean = np.mean(Astars_np, 0)
    Astars_var = np.var(Astars_np, 0)
    Astars_min = np.min(Astars_np, 0)
    Astars_max = np.max(Astars_np, 0)

    fig, ax = plt.subplots(1, 2)
    im1 = ax[0].imshow(Astars_mean,
                       vmin=abs(Astars_mean).min(),
                       vmax=abs(Astars_mean).max(),
                       cmap=plt.cm.CMRmap)
    ax[0].set_title('mean($A^{\star}}$)')
    divider = make_axes_locatable(ax[0])
    cax = divider.append_axes("right", size="5%", pad=0.05)
    fig.colorbar(im1, cax=cax)
    im2 = ax[1].imshow(Astars_var,
                       vmin=abs(Astars_var).min(),
                       vmax=abs(Astars_var).max(),
                       cmap=plt.cm.CMRmap)
    ax[1].set_title('var($A^{\star}}$)')
    divider = make_axes_locatable(ax[1])
    cax = divider.append_axes("right", size="5%", pad=0.05)
    fig.colorbar(im2, cax=cax)
    # im3 = ax[1,0].imshow(Astars_min, vmin=abs(Astars_min).min(), vmax=abs(Astars_min).max(), cmap=plt.cm.CMRmap)
    # ax[1, 0].set_title('min($A^{\star}}$)')
    # fig.colorbar(im3, ax=ax[1,0])
    # im4 = ax[1,1].imshow(Astars_max, vmin=abs(Astars_max).min(), vmax=abs(Astars_max).max(), cmap=plt.cm.CMRmap)
    # ax[1, 1].set_title('max($A^{\star}}$)')
    # fig.colorbar(im4, ax=ax[1,1])
    fig.tight_layout()

    if fname is not None:
        plt.savefig(fname)
        plt.close()

    return Astars_mean, Astars_var, Astars_min, Astars_max
Пример #4
0
def plot_singular_values(fx, nx, limits=(-6, 6), nsamples=10, fname=None):
    x = torch.rand(nsamples, nx,
                   dtype=torch.float) * (limits[1] - limits[0]) + limits[0]
    Astars, *_ = lpv_batched(fx, x)

    fig, ax = plt.subplots()
    S = []
    for i, Astar in enumerate(Astars):
        _, s, _ = torch.svd(Astar, compute_uv=False)
        S.append(s.T.detach().numpy())
        plt.plot(np.arange(1, nx + 1, 1), s.T.detach().numpy())
        plt.grid(True)
        plt.xlabel('$k$')
        plt.ylabel('$\sigma_k$')
    ax.set_yscale("log")

    if fname is not None:
        plt.savefig(fname)
        plt.close()

    return [ax], S
Пример #5
0
            },
        )
        for act_name, bias in params:
            act = activations[act_name]
            fx.nonlin = nn.ModuleList([act() for _ in fx.nonlin])
            combo_string = f"{linmap}_x{nx}_({sigmin},{sigmax})_{act_name}_{nlayers}l_{'real' if real else 'complex'}{'_bias' if bias else ''}"
            print(combo_string)

            grid_x, grid_y = torch.meshgrid(
                torch.arange(-6, 6, 0.1),
                torch.arange(-6, 6, 0.1),
            )
            X = torch.stack((grid_x.flatten(), grid_y.flatten())).T

            with torch.no_grad():
                Astars, *_ = lpv_batched(fx, X)
            Astars = torch.unbind(Astars, dim=0)

            eigvals.append(compute_eigenvalues(Astars))
            plot_nlayers.append(nlayers)

        if i == len(combos) - 1 or (i < len(combos) - 1
                                    and combos[i][0] != combos[i + 1][0]):
            plt.figure(figsize=(5, 4))
            for nl, eigval_list in zip(plot_nlayers, eigvals):
                eigval_list = np.array(eigval_list).flatten()
                sns.kdeplot(eigval_list,
                            log_scale=True,
                            label=f"Layers = {nl}")
            plt.tight_layout()
            plt.legend()
Пример #6
0
def lin_regions(nx, layers, maps, activations, outdir="./plots_region"):
    for nlayers in layers:
        for (linmap, sigmin, sigmax, real) in maps:
            torch.manual_seed(408)
            np.random.seed(408)
            fx = blocks.MLP(
                nx,
                nx,
                nonlin=nn.Identity,
                linear_map=slim.linear.maps[linmap],
                hsizes=[nx] * nlayers,
                bias=False,
                linargs={
                    "sigma_min": sigmin,
                    "sigma_max": sigmax,
                    "real": real,
                },
            )
            for (act_name, act) in activations:
                fx.nonlin = nn.ModuleList([act() for _ in fx.nonlin])
                for bias in [False]:
                    combo_string = f"{linmap}_x{nx}_({sigmin},{sigmax})_{act_name}_{nlayers}l_{'real' if real else 'complex'}{'_bias' if bias else ''}"
                    print(combo_string)

                    if nx == 2:
                        plot_astar_phase_portrait(
                            fx,
                            x_lims=(-6, 6),
                            y_lims=(-6, 6),
                            step=0.5,
                            use_bias=bias,
                            initial_states=initial_states,
                            fname=os.path.join(outdir, f"phase_{combo_string}.png"),
                        )

                        grid_x, grid_y = torch.meshgrid(
                            torch.arange(-6, 6.1, 0.1),
                            torch.arange(-6, 6.1, 0.1),
                        )
                        X = torch.stack((grid_x.flatten(), grid_y.flatten())).T
                    else:
                        X = torch.arange(-6, 6.1, 0.1).unsqueeze(-1).expand(-1, nx)

                    Astars, Astar_b, _, _, _ = lpv_batched(fx, X)
                    Astars = Astars.detach().numpy()

                    # plot Anorms
                    Anorms = compute_norms(Astars)
                    Anorm_mat = np.reshape(Anorms, grid_x.shape)

                    fig1, ax1 = plt.subplots()

                    im1 = ax1.imshow(Anorm_mat, vmin=abs(Anorm_mat).min(), vmax=abs(Anorm_mat).max(), cmap=PALETTE, origin='lower',
                               extent=[X.min(), X.max(), X.min(), X.max()])#, interpolation="bilinear")
                    fig1.colorbar(im1, ax=ax1)
                    im1.set_clim(0., 2.)

                    # ax1.set_title('Metric: 'r'$\Vert A^* \Vert$')

                    fname1 = os.path.join(outdir, f"norm_region_{combo_string}.pdf")
                    plt.savefig(fname1)

                    # plot dominant eigenvalues
                    eigvals = compute_eigenvalues(Astars)
                    dom_eigs = [np.absolute(eigs).max() for eigs in eigvals]
                    dom_eigs_mat = np.reshape(dom_eigs, grid_x.shape)

                    fig2, ax2 = plt.subplots()

                    vmin = abs(dom_eigs_mat).min()
                    vmax = abs(dom_eigs_mat).max()

                    im2 = ax2.imshow(dom_eigs_mat, vmin=0, vmax=2,
                                     cmap=PALETTE, origin='lower',
                                     extent=[X.min(), X.max(), X.min(), X.max()])#, interpolation="bilinear")
                    fig2.colorbar(im2, ax=ax2)
                    im2.set_clim(0., 2.)

                    #ax2.set_title('Metric: 'r'$\| \lambda_1 \|$')

                    fname2 = os.path.join(outdir, f"dom_eig_region_{combo_string}.pdf")
                    plt.savefig(fname2)

                    # plot sum of absolute eigenvalues
                    sum_eigs = [np.absolute(eigs).sum() for eigs in eigvals]
                    sum_eigs_mat = np.reshape(sum_eigs, grid_x.shape)

                    fig3, ax3 = plt.subplots()

                    im3 = ax3.imshow(sum_eigs_mat, vmin=abs(sum_eigs_mat).min(), vmax=abs(sum_eigs_mat).max(), cmap=PALETTE, origin='lower',
                                     extent=[X.min(), X.max(), X.min(), X.max()])#, interpolation="bilinear")
                    # im3 = ax3.imshow(sum_eigs_mat, vmin=0, vmax=0.3,
                    #                  cmap=plt.cm.CMRmap, origin='lower',
                    #                  extent=[X.min(), X.max(), X.min(), X.max()], interpolation="bilinear")
                    fig3.colorbar(im3, ax=ax3)
                    im3.set_clim(0., 2.)

                    # ax3.set_title('Metric: 'r'$\sum_{i=1}^n{\| \lambda_i \|}$')

                    fname3 = os.path.join(outdir, f"sum_eig_region_{combo_string}.pdf")
                    plt.savefig(fname3)
                    plt.close('all')