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
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]
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
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
}, ) 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()
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')