|
a |
|
b/DecNet.py |
|
|
1 |
""" |
|
|
2 |
|
|
|
3 |
Stefania Fresca, MOX Laboratory, Politecnico di Milano |
|
|
4 |
April 2019 |
|
|
5 |
|
|
|
6 |
""" |
|
|
7 |
|
|
|
8 |
import tensorflow as tf |
|
|
9 |
import numpy as np |
|
|
10 |
import scipy.io as sio |
|
|
11 |
import time |
|
|
12 |
import os |
|
|
13 |
|
|
|
14 |
from Net import Net |
|
|
15 |
import utils |
|
|
16 |
|
|
|
17 |
seed = 374 |
|
|
18 |
np.random.seed(seed) |
|
|
19 |
|
|
|
20 |
class DecNet(Net): |
|
|
21 |
def __init__(self, config): |
|
|
22 |
Net.__init__(self, config) |
|
|
23 |
|
|
|
24 |
self.n = config['n'] |
|
|
25 |
self.n_params = config['n_params'] |
|
|
26 |
|
|
|
27 |
self.size = 5 |
|
|
28 |
self.n_layers = 10 # hidden layers - 1 |
|
|
29 |
self.n_neurons = 50 |
|
|
30 |
self.n_h = config['n_h'] |
|
|
31 |
|
|
|
32 |
def get_data(self): |
|
|
33 |
with tf.name_scope('data'): |
|
|
34 |
self.X = tf.placeholder(tf.float32, shape = [None, self.N_h]) |
|
|
35 |
self.Y = tf.placeholder(tf.float32, shape = [None, self.n_params]) |
|
|
36 |
|
|
|
37 |
dataset = tf.data.Dataset.from_tensor_slices((self.X, self.Y)) |
|
|
38 |
dataset = dataset.batch(self.batch_size) |
|
|
39 |
|
|
|
40 |
iterator = dataset.make_initializable_iterator() |
|
|
41 |
self.init = iterator.initializer |
|
|
42 |
|
|
|
43 |
self.output, self.params = iterator.get_next() |
|
|
44 |
|
|
|
45 |
def inference(self): |
|
|
46 |
# at testing time the encoder function is discarded |
|
|
47 |
fc_n = tf.layers.dense(self.params, |
|
|
48 |
self.n_neurons, |
|
|
49 |
activation = tf.nn.elu, |
|
|
50 |
kernel_initializer = tf.keras.initializers.he_uniform()) |
|
|
51 |
for i in range(self.n_layers): |
|
|
52 |
fc_n = tf.layers.dense(fc_n, |
|
|
53 |
self.n_neurons, |
|
|
54 |
activation = tf.nn.elu, |
|
|
55 |
kernel_initializer = tf.keras.initializers.he_uniform()) |
|
|
56 |
u_n = tf.layers.dense(fc_n, |
|
|
57 |
self.n, |
|
|
58 |
activation = tf.nn.elu, |
|
|
59 |
kernel_initializer = tf.keras.initializers.he_uniform()) |
|
|
60 |
fc1_t = tf.layers.dense(u_n, 256, activation = tf.nn.elu, kernel_initializer = tf.keras.initializers.he_uniform(), name = 'fc1_t') |
|
|
61 |
fc2_t = tf.layers.dense(fc1_t, self.N_h, activation = tf.nn.elu, kernel_initializer = tf.keras.initializers.he_uniform(), name = 'fc2_t') |
|
|
62 |
fc2_t = tf.reshape(fc2_t, [-1, self.n_h, self.n_h, 64]) |
|
|
63 |
conv1_t = tf.layers.conv2d_transpose(inputs = fc2_t, |
|
|
64 |
filters = 64, |
|
|
65 |
kernel_size = [self.size, self.size], |
|
|
66 |
padding = 'SAME', |
|
|
67 |
strides = 2, |
|
|
68 |
kernel_initializer = tf.keras.initializers.he_uniform(), |
|
|
69 |
activation = tf.nn.elu, |
|
|
70 |
name = 'conv1_t') |
|
|
71 |
conv2_t = tf.layers.conv2d_transpose(inputs = conv1_t, |
|
|
72 |
filters = 32, |
|
|
73 |
kernel_size = [self.size, self.size], |
|
|
74 |
padding = 'SAME', |
|
|
75 |
strides = 2, |
|
|
76 |
kernel_initializer = tf.keras.initializers.he_uniform(), |
|
|
77 |
activation = tf.nn.elu, |
|
|
78 |
name = 'conv2_t') |
|
|
79 |
conv3_t = tf.layers.conv2d_transpose(inputs = conv2_t, |
|
|
80 |
filters = 16, |
|
|
81 |
kernel_size = [self.size, self.size], |
|
|
82 |
padding = 'SAME', |
|
|
83 |
strides = 2, |
|
|
84 |
kernel_initializer = tf.keras.initializers.he_uniform(), |
|
|
85 |
activation = tf.nn.elu, |
|
|
86 |
name = 'conv3_t') |
|
|
87 |
conv4_t = tf.layers.conv2d_transpose(inputs = conv3_t, |
|
|
88 |
filters = 1, |
|
|
89 |
kernel_size = [self.size, self.size], |
|
|
90 |
padding = 'SAME', |
|
|
91 |
strides = 1, |
|
|
92 |
kernel_initializer = tf.keras.initializers.he_uniform(), |
|
|
93 |
name = 'conv4_t') |
|
|
94 |
feature_dim_dec = conv4_t.shape[1] * conv4_t.shape[2] * conv4_t.shape[3] |
|
|
95 |
self.u_h = tf.reshape(conv4_t, [-1, feature_dim_dec]) |
|
|
96 |
|
|
|
97 |
def loss(self, u_h): |
|
|
98 |
with tf.name_scope('loss'): |
|
|
99 |
self.loss = self.omega_h * tf.reduce_mean(tf.reduce_sum(tf.pow(self.output - u_h, 2), axis = 1)) |
|
|
100 |
|
|
|
101 |
def build(self): |
|
|
102 |
self.get_data() |
|
|
103 |
self.inference() |
|
|
104 |
self.loss(self.u_h) |
|
|
105 |
|
|
|
106 |
def test_once(self, sess, init): |
|
|
107 |
start_time = time.time() |
|
|
108 |
sess.run(init, feed_dict = {self.X : self.S_test, self.Y : self.params_test}) |
|
|
109 |
total_loss = 0 |
|
|
110 |
n_batches = 0 |
|
|
111 |
self.U_h = np.zeros(self.S_test.shape) |
|
|
112 |
print('------------ TESTING ------------') |
|
|
113 |
try: |
|
|
114 |
while True: |
|
|
115 |
l, u_h = sess.run([self.loss, self.u_h]) |
|
|
116 |
self.U_h[self.batch_size * n_batches : self.batch_size * (n_batches + 1)] = u_h |
|
|
117 |
total_loss += l |
|
|
118 |
n_batches += 1 |
|
|
119 |
except tf.errors.OutOfRangeError: |
|
|
120 |
pass |
|
|
121 |
print('Average loss on testing set: {0}'.format(total_loss / n_batches)) |
|
|
122 |
print('Took: {0} seconds'.format(time.time() - start_time)) |
|
|
123 |
|
|
|
124 |
#@profile |
|
|
125 |
def test_all(self): |
|
|
126 |
list = [v for v in tf.global_variables() if '_t' or 'dense' in v.name] |
|
|
127 |
saver = tf.train.Saver(var_list = list) |
|
|
128 |
|
|
|
129 |
if (self.large): |
|
|
130 |
S_train = utils.read_large_data(self.train_mat) |
|
|
131 |
else: |
|
|
132 |
S_train = utils.read_data(self.train_mat) |
|
|
133 |
idxs = np.random.permutation(S_train.shape[0]) |
|
|
134 |
S_train = S_train[idxs] |
|
|
135 |
S_max, S_min = utils.max_min(S_train, self.n_train) |
|
|
136 |
del S_train |
|
|
137 |
|
|
|
138 |
print('Loading testing snapshot matrix...') |
|
|
139 |
if (self.large): |
|
|
140 |
self.S_test = utils.read_large_data(self.test_mat) |
|
|
141 |
else: |
|
|
142 |
self.S_test = utils.read_data(self.test_mat) |
|
|
143 |
|
|
|
144 |
utils.scaling(self.S_test, S_max, S_min) |
|
|
145 |
|
|
|
146 |
if (self.zero_padding): |
|
|
147 |
self.S_test = utils.zero_pad(self.S_test, self.p) |
|
|
148 |
|
|
|
149 |
print('Loading testing parameters...') |
|
|
150 |
self.params_test = utils.read_params(self.test_params) |
|
|
151 |
|
|
|
152 |
with tf.Session() as sess: |
|
|
153 |
sess.run(tf.global_variables_initializer()) |
|
|
154 |
|
|
|
155 |
ckpt = tf.train.get_checkpoint_state(os.path.dirname(self.checkpoints_folder + '/checkpoint')) |
|
|
156 |
if ckpt and ckpt.model_checkpoint_path: |
|
|
157 |
print(ckpt.model_checkpoint_path) |
|
|
158 |
saver.restore(sess, ckpt.model_checkpoint_path) |
|
|
159 |
self.test_once(sess, self.init) |
|
|
160 |
|
|
|
161 |
utils.inverse_scaling(self.U_h, S_max, S_min) |
|
|
162 |
utils.inverse_scaling(self.S_test, S_max, S_min) |
|
|
163 |
n_test = self.S_test.shape[0] // self.N_t |
|
|
164 |
err = np.zeros((n_test, 1)) |
|
|
165 |
for i in range(n_test): |
|
|
166 |
num = np.sqrt(np.mean(np.linalg.norm(self.S_test[i * self.N_t : (i + 1) * self.N_t] - self.U_h[i * self.N_t : (i + 1) * self.N_t], 2, axis = 1) ** 2)) |
|
|
167 |
den = np.sqrt(np.mean(np.linalg.norm(self.S_test[i * self.N_t : (i + 1) * self.N_t], 2, axis = 1) ** 2)) |
|
|
168 |
err[i] = num / den |
|
|
169 |
print('Error indicator epsilon_rel: {0}'.format(np.mean(err))) |