Пример #1
0
def make_nf(n_blocks, base_dist, affine_flow=StructuredAffineFlow):
    blocks = []
    for _ in range(n_blocks):
        blocks += [affine_flow(2), PReLUFlow(2), BatchNormFlow(2)]
    blocks += [affine_flow(2)]

    return NormalizingFlow(
        *blocks,
        base_dist=base_dist,
    )
Пример #2
0
def make_nf(n_blocks, affine_class, base_dist):
    blocks = []
    for _ in range(n_blocks):
        blocks += [affine_class(2), PReLUFlow(2), BatchNormFlow(2)]
    blocks += [affine_class(2)]

    return NormalizingFlow(
        *blocks,
        base_dist=base_dist,
    )
Пример #3
0
def make_nf(shared_blocks, n_blocks, base_dist):
    blocks = [] + shared_blocks
    for _ in range(n_blocks):
        blocks += [StructuredAffineFlow(2), PReLUFlow(2), BatchNormFlow(2)]
    blocks += [StructuredAffineFlow(2)]
    #      blocks += [AffineLUFlow(2), PReLUFlow(2), BatchNormFlow(2)]
    #  blocks += [AffineLUFlow(2)]

    return NormalizingFlow(
        *blocks,
        base_dist=base_dist,
    )
Пример #4
0
idx_0 = np.logical_and(X0[:, 0] < 0, X0[:, 1] < 0)
colors[idx_0] = 0
idx_1 = np.logical_and(X0[:, 0] >= 0, X0[:, 1] < 0)
colors[idx_1] = 1
idx_2 = np.logical_and(X0[:, 0] >= 0, X0[:, 1] >= 0)
colors[idx_2] = 2
idx_3 = np.logical_and(X0[:, 0] < 0, X0[:, 1] >= 0)
colors[idx_3] = 3

# %%
plt.scatter(X0[:, 0], X0[:, 1], s=5, c=colors)

# %%
blocks = sum(
    [[StructuredAffineFlow(2), PReLUFlow(2)] for _ in range(5)] + [[StructuredAffineFlow(2)]],
[])

# %%
flow = NormalizingFlow( 
    *blocks,
    base_dist=base_dist,
)

opt = optim.Adam(flow.parameters(), lr=5e-4)

# %%
count_parameters(flow)

# %%
writer = SummaryWriter(f"/workspace/sandbox/tensorboard_logs/{now_str()}")
Пример #5
0
    #  blocks += [AffineLUFlow(2)]

    return NormalizingFlow(
        *blocks,
        base_dist=base_dist,
    )


# %%
xdim = 2
hdim = 3
n_hidden = 3
n_classes = 3
shared_blocks = sum(
    [[StructuredAffineFlow(2),
      PReLUFlow(2), BatchNormFlow(2)] for _ in range(3)], [])
#shared_blocks = []
n_flow_blocks = 2

mixture = VariationalMixture(
    xdim=xdim,
    hdim=hdim,
    n_hidden=n_hidden,
    n_classes=n_classes,
    components=[
        make_nf(shared_blocks, n_flow_blocks,
                distrib.Normal(loc=torch.zeros(2), scale=torch.ones(2)))
        for _ in range(n_classes)
    ],
)
Пример #6
0
# %%
f1 = AffineLUFlow(2)

# %%
f1.forward(X)

# %%
#blocks = sum(
#    [[AffineLUFlow(2), PReLUFlow(2), BatchNormFlow(2)] for _ in range(5)] +
#    [[AffineLUFlow(2)]],
#[])

blocks = sum(
    [[StructuredAffineFlow(2),
      PReLUFlow(2), BatchNormFlow(2)]
     for _ in range(5)] + [[StructuredAffineFlow(2)]], [])

flow = NormalizingFlow(
    *blocks,
    base_dist=base_dist,
)

opt = optim.Adam(flow.parameters(), lr=1e-2)

# %%
count_parameters(flow)

# %%
n_epochs = 2000
bs = 512
Пример #7
0
idx_0 = np.logical_and(X0[:, 0] < 0, X0[:, 1] < 0)
colors[idx_0] = 0
idx_1 = np.logical_and(X0[:, 0] >= 0, X0[:, 1] < 0)
colors[idx_1] = 1
idx_2 = np.logical_and(X0[:, 0] >= 0, X0[:, 1] >= 0)
colors[idx_2] = 2
idx_3 = np.logical_and(X0[:, 0] < 0, X0[:, 1] >= 0)
colors[idx_3] = 3

# %%
plt.scatter(X0[:, 0], X0[:, 1], s=5, c=colors)

# %%
blocks = sum(
    [[StructuredAffineFlow(2), PReLUFlow(2), BatchNormFlow(2)] for _ in range(20)] + [[StructuredAffineFlow(2)]],
[])

# %%
flow = NormalizingFlow( 
    *blocks,
    base_dist=base_dist,
)

opt = optim.Adam(flow.parameters(), lr=1e-2)

# %%
count_parameters(flow)

# %%
n_epochs = 150
Пример #8
0
    density = prev_density.squeeze() / np.exp(flow.log_abs_det_jacobian(torch.Tensor(cur_z), None).detach().squeeze())
    return torch.Tensor(density)


# %%
def get_meshes(cur_z, density, grid_side=1000, dim=2):
    mesh = cur_z.reshape([grid_side, grid_side, dim]).transpose(2, 0, 1)
    xx = mesh[0]
    yy = mesh[1]
    zz = density.numpy().reshape([grid_side, grid_side])
    
    return xx, yy, zz


# %%
blocks = [PReLUFlow(2)]

flow = NormalizingFlow( 
    *blocks,
    base_dist=base_dist,
)

# %%
from mpl_toolkits.axes_grid1 import make_axes_locatable

# %%
x = np.linspace(-5, 5, 1000)
z = np.array(np.meshgrid(x, x)).transpose(1, 2, 0)
z = np.reshape(z, [z.shape[0] * z.shape[1], -1])

with torch.no_grad():