def init_layers(X, Z, dims, final_mean_function):
M = Z.shape[0]
q_mus, q_sqrts, mean_functions, Zs = [], [], [], []
X_running, Z_running = X.copy(), Z.copy()
for dim_in, dim_out in zip(dims[:-2], dims[1:-1]):
if dim_in == dim_out: # identity for same dims
W = np.eye(dim_in)
elif dim_in > dim_out: # use PCA mf for stepping down
_, _, V = np.linalg.svd(X_running, full_matrices=False)
W = V[:dim_out, :].T
elif dim_in < dim_out: # identity + pad with zeros for stepping up
I = np.eye(dim_in)
zeros = np.zeros((dim_in, dim_out - dim_in))
W = np.concatenate([I, zeros], 1)
mean_functions.append(Linear(A=W))
Zs.append(Z_running.copy())
q_mus.append(np.zeros((M, dim_out)))
q_sqrts.append(np.eye(M)[:, :, None] * np.ones((1, 1, dim_out)))
Z_running = Z_running.dot(W)
X_running = X_running.dot(W)
# final layer (as before but no mean function)
mean_functions.append(final_mean_function)
Zs.append(Z_running.copy())
q_mus.append(np.zeros((M, dims[-1])))
q_sqrts.append(np.eye(M)[:, :, None] * np.ones((1, 1, dims[-1])))
return q_mus, q_sqrts, Zs, mean_functions
评论列表
文章目录