In [1]:
# Import here
%matplotlib inline
import matplotlib.pylab as pylab
import matplotlib.pyplot as plt
import numpy as np
import theano
import theano.tensor as T
pylab.rcParams['figure.figsize'] = (9.0, 6.0)
In [2]:
n_steps = 10
x = T.fmatrix(name='x')
A = T.fmatrix(name='A')
def one_step(x, A):
return T.dot(A, x)
y_seq, updates = theano.scan(fn=one_step,
outputs_info=x,
non_sequences=[A],
n_steps=n_steps)
y=y_seq[-1]
cost = T.mean(T.sum((x - y) ** 2, axis=0, keepdims=True))
dA = T.grad(cost, A)
f = theano.function(inputs=[x, A],
outputs=[cost, dA, y],
updates=updates)
In [3]:
dim_x = 5
dim_batch = 256
val_A = np.random.randn(dim_x, dim_x).astype(np.float32) / np.sqrt(dim_x)
In [4]:
eta = 0.5 / dim_batch
mu = 0.5
val_dA = np.zeros_like(val_A)
val_vA = np.zeros_like(val_A)
for t in range(10000):
val_vA *= mu
val_A += val_vA
val_x = np.random.randn(dim_x, dim_batch).astype(np.float32)
val_cost, val_dA, val_y = f(val_x, val_A)
if (t + 1) % 1000 == 0:
print (t + 1), val_cost
val_A -= eta * val_dA
val_vA -= eta * val_dA
In [5]:
val_A_10 = np.linalg.matrix_power(val_A, n_steps)
print val_A_10
plt.imshow(val_A_10, interpolation='None')
Out[5]:
In [5]: