updated eigvalue solvers

This commit is contained in:
mhjensen
2019-12-15 14:06:49 +01:00
parent 3113adacf0
commit 6a4837f260
4 changed files with 106 additions and 1280 deletions
@@ -0,0 +1,106 @@
# # Finding eigenvalues of matrices with neural networks.
# Script for finding the eigenvectors corresponding to the largest eigenvalue of a matrix with a neural network.
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
tf.reset_default_graph()
# tf.set_random_seed(343)
# import tensorflow as tf
import numpy as np
from matplotlib import cm
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import axes3d
#from lib import compute_dx_dt
matrix_size = 6
A = np.random.random_sample(size=(matrix_size,matrix_size))
A = (A.T + A)/2.0
start_matrix = A
eigen_vals, eigen_vecs = np.linalg.eig(A)
A = tf.convert_to_tensor(A)
print("A = ", A)
x_0 = tf.convert_to_tensor(np.random.random_sample(size = (1,matrix_size)))
print("x0 = ", x_0)
## The construction phase
num_iter = 10000
num_hidden_neurons = [50]
num_hidden_layers = np.size(num_hidden_neurons)
with tf.variable_scope('dnn'):
previous_layer = x_0
for l in range(num_hidden_layers):
current_layer = tf.layers.dense(previous_layer, num_hidden_neurons[l],activation=tf.nn.sigmoid)
previous_layer = current_layer
dnn_output = tf.layers.dense(previous_layer, matrix_size)
with tf.name_scope('loss'):
print("dnn_output = ", dnn_output)
x_trial = tf.transpose(dnn_output)
print("x_trial = ", x_trial)
temp1 = (tf.tensordot(tf.transpose(x_trial), x_trial, axes=1)*A)
temp2 = (1- tf.tensordot(tf.transpose(x_trial), tf.tensordot(A, x_trial, axes=1), axes=1))*np.eye(matrix_size)
func = tf.tensordot((temp1-temp2), x_trial, axes=1)
print(temp1)
print(temp2)
print(func)
func = tf.transpose(func)
x_trial = tf.transpose(x_trial)
loss = tf.losses.mean_squared_error(func, x_trial)
learning_rate = 0.001
with tf.name_scope('train'):
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
traning_op = optimizer.minimize(loss)
init = tf.global_variables_initializer()
g_dnn = None
losses = []
with tf.Session() as sess:
init.run()
for i in range(num_iter):
sess.run(traning_op)
if i % 100 == 0:
l = loss.eval()
print("Step:", i, "/",num_iter, "loss: ", l)
losses.append(l)
x_dnn = x_trial.eval()
x_dnn = x_dnn.T
# ## Plotting loss over time
plt.plot(losses[:5])
plt.xlabel("Iteration")
plt.ylabel("Loss")
print("Eigenvector NN = \n", (x_dnn/(x_dnn**2).sum()**0.5), "\n")
eigen_val_nn = x_dnn.T @ (start_matrix @ x_dnn) / (x_dnn.T @ x_dnn)
print("Eigenvalue NN = \n", eigen_val_nn, "\n \n")
print("Eigenvector analytic = \n", eigen_vecs)
print("\n")
print("Eigenvalues analytic = \n",eigen_vals)
File diff suppressed because one or more lines are too long