Diff of /DecNet.py [000000] .. [6d7935]

Switch to unified view

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)))