import numpy as np
import numpy.linalg as la
import scipy.io
import matplotlib.pyplot as plt
%matplotlib inline
from pyunlocbox import functions, solvers
import time
import scipy, matplotlib, pyunlocbox # For versions only.
# Import auto-encoder definition.
%run auto_encoder.ipynb
print('Software versions:')
for pkg in [np, matplotlib, scipy, pyunlocbox]:
print(' %s: %s' % (pkg.__name__, pkg.__version__))
ld = 10 # Xavier sets the weight of the L1 regularization to 1e-1.
mat = scipy.io.loadmat('data/xavier_X.mat')
X = mat['X'].T
N, n = X.shape
Np = np.sqrt(n)
print('N = %d samples with dimensionality n = %d (patches of %dx%d).' % (N, n, Np, Np))
plt.figure(figsize=(8,5))
patches = [24, 1000, 2004, 10782]
for k in range(len(patches)):
patch = patches[k]
img = np.reshape(X[patch, :], (Np, Np))
plt.subplot(1, 4, k+1)
plt.imshow(img, cmap='gray')
plt.title('Patch %d' % patch)
plt.show()
if False:
mat = scipy.io.loadmat('data/xavier_initZD.mat')
Zinit = mat['Zinit']
Dinit = mat['Dinit']
m, N = Zinit.shape
n, m = Dinit.shape
print('Sparse code dimensionality m = %d --> %s dictionary' % (m, 'overcomplete' if m > n else 'undercomplete'))
print('mean(Z) = %f' % np.mean(Zinit))
d = np.sqrt(np.sum(Dinit*Dinit, axis=0))
print('Constraints on D: %s' % np.alltrue(d <= 1+1e-15))
Given $X \in R^{n \times N}$, solve $\min\limits_{Z \in R^{m \times N}, D \in R^{n \times m}} \frac{\lambda_d}{2} \|X - DZ\|_F^2 + \|Z\|_1$ s.t. $\|d_i\|_2 \leq 1$, $i = 1, \ldots, m$
ae = auto_encoder(m=64, ld=ld, rtol=1e-5, xtol=None, N_inner=100, N_outer=30)
#ae = auto_encoder(m=64, ld=ld, rtol=None, xtol=1e-6, N_inner=100, N_outer=15)
tstart = time.time()
Z = ae.fit_transform(X)
print('Elapsed time: {:.0f} seconds'.format(time.time() - tstart))
if False:
tstart = time.time()
Z = ae.transform(X)
print('Elapsed time: {:.0f} seconds'.format(time.time() - tstart))
ae.plot_convergence()
mat = scipy.io.loadmat('data/xavier_ZD.mat')
Zxavier = mat['Z'].T
Dxavier = mat['D'].T
print('Elapsed time: %d seconds' % mat['exectime'])
objective(X, Zxavier, Dxavier, ld)
objective(X, Z, ae.D, ld)
sparse_codes(Zxavier)
sparse_codes(Z)
dictionary(Dxavier)
dictionary(ae.D)
atoms(Dxavier, Np)
atoms(ae.D, Np)