| 92 | |
| 93 | |
| 94 | class DNN(object): |
| 95 | def __init__(self, D, hidden_layer_sizes, K, UnsupervisedModel=AutoEncoder): |
| 96 | self.hidden_layers = [] |
| 97 | count = 0 |
| 98 | input_size = D |
| 99 | for output_size in hidden_layer_sizes: |
| 100 | ae = UnsupervisedModel(input_size, output_size, count) |
| 101 | self.hidden_layers.append(ae) |
| 102 | count += 1 |
| 103 | input_size = output_size |
| 104 | self.build_final_layer(D, hidden_layer_sizes[-1], K) |
| 105 | |
| 106 | def set_session(self, session): |
| 107 | self.session = session |
| 108 | for layer in self.hidden_layers: |
| 109 | layer.set_session(session) |
| 110 | |
| 111 | def build_final_layer(self, D, M, K): |
| 112 | # initialize logistic regression layer |
| 113 | self.W = tf.Variable(tf.random.normal(shape=(M, K))) |
| 114 | self.b = tf.Variable(np.zeros(K).astype(np.float32)) |
| 115 | |
| 116 | self.X = tf.compat.v1.placeholder(tf.float32, shape=(None, D)) |
| 117 | labels = tf.compat.v1.placeholder(tf.int32, shape=(None,)) |
| 118 | self.Y = labels |
| 119 | logits = self.forward(self.X) |
| 120 | |
| 121 | self.cost = tf.reduce_mean( |
| 122 | input_tensor=tf.nn.sparse_softmax_cross_entropy_with_logits( |
| 123 | logits=logits, |
| 124 | labels=labels |
| 125 | ) |
| 126 | ) |
| 127 | self.train_op = tf.compat.v1.train.AdamOptimizer(1e-2).minimize(self.cost) |
| 128 | self.prediction = tf.argmax(input=logits, axis=1) |
| 129 | |
| 130 | def fit(self, X, Y, Xtest, Ytest, pretrain=True, epochs=1, batch_sz=100): |
| 131 | N = len(X) |
| 132 | |
| 133 | # greedy layer-wise training of autoencoders |
| 134 | pretrain_epochs = 1 |
| 135 | if not pretrain: |
| 136 | pretrain_epochs = 0 |
| 137 | |
| 138 | current_input = X |
| 139 | for ae in self.hidden_layers: |
| 140 | ae.fit(current_input, epochs=pretrain_epochs) |
| 141 | |
| 142 | # create current_input for the next layer |
| 143 | current_input = ae.transform(current_input) |
| 144 | |
| 145 | n_batches = N // batch_sz |
| 146 | costs = [] |
| 147 | print("supervised training...") |
| 148 | for i in range(epochs): |
| 149 | print("epoch:", i) |
| 150 | X, Y = shuffle(X, Y) |
| 151 | for j in range(n_batches): |
no outgoing calls