"""Train and calculate the information of network""" import multiprocessing import os import sys import warnings import numpy as np import tensorflow as tf from idnns.information import information_process as inn from idnns.networks.utils import data_shuffle from idnns.networks import model as mo import tensorflow.compat.v1 as tf tf.disable_v2_behavior() warnings.filterwarnings("ignore") summaries_dir = 'summaries' NUM_CORES = multiprocessing.cpu_count() def build_model(activation_function, layerSize, input_size, num_of_classes, learning_rate_local, save_file, covn_net): """Bulid specipic model of the network Return the network model """ model = mo.Model(input_size, layerSize, num_of_classes, learning_rate_local, save_file, int(activation_function), cov_net=covn_net) return model def train_and_calc_inf_network(i, j, k, layerSize, num_of_ephocs, learning_rate_local, batch_size, indexes, save_grads, data_sets_org, model_type, percent_of_train, interval_accuracy_display, calc_information, calc_information_last, num_of_bins, interval_information_display, save_ws, rand_int, cov_net): """Train the network and calculate it's information""" network_name = '{0}_{1}_{2}_{3}'.format(i, j, k, rand_int) print ('Training network - {0}'.format(network_name)) network = train_network(layerSize, num_of_ephocs, learning_rate_local, batch_size, indexes, save_grads, data_sets_org, model_type, percent_of_train, interval_accuracy_display, network_name, cov_net) network['information'] = [] if calc_information: print ('Calculating the infomration') infomration = np.array([inn.get_information(network['ws'], data_sets_org.data, data_sets_org.labels, num_of_bins, interval_information_display, network['model'], layerSize)]) network['information'] = infomration elif calc_information_last: print ('Calculating the infomration for the last epoch') infomration = np.array([inn.get_information([network['ws'][-1]], data_sets_org.data, data_sets_org.labels, num_of_bins, interval_information_display, network['model'], layerSize)]) network['information'] = infomration # If we dont want to save layer's output if not save_ws: network['weights'] = 0 return network def exctract_activity(sess, batch_points_all, model, data_sets_org): """Get the activation values of the layers for the input""" w_temp = [] for i in range(0, len(batch_points_all) - 1): batch_xs = data_sets_org.data[batch_points_all[i]:batch_points_all[i + 1]] batch_ys = data_sets_org.labels[batch_points_all[i]:batch_points_all[i + 1]] feed_dict_temp = {model.x: batch_xs, model.labels: batch_ys} w_temp_local = sess.run([model.hidden_layers], feed_dict=feed_dict_temp) for s in range(len(w_temp_local[0])): if i == 0: w_temp.append(w_temp_local[0][s]) else: w_temp[s] = np.concatenate((w_temp[s], w_temp_local[0][s]), axis=0) """" infomration[k] = inn.calc_information_for_epoch(k, interval_information_display, ws_t, params['bins'], params['unique_inverse_x'], params['unique_inverse_y'], params['label'], estimted_labels, params['b'], params['b1'], params['len_unique_a'], params['pys'], py_hats_temp, params['pxs'], params['py_x'], params['pys1']) """ return w_temp def print_accuracy(batch_points_test, data_sets, model, sess, j, acc_train_array): """Calc the test acc and print the train and test accuracy""" acc_array = [] for i in range(0, len(batch_points_test) - 1): batch_xs = data_sets.test.data[batch_points_test[i]:batch_points_test[i + 1]] batch_ys = data_sets.test.labels[batch_points_test[i]:batch_points_test[i + 1]] feed_dict_temp = {model.x: batch_xs, model.labels: batch_ys} acc = sess.run([model.accuracy], feed_dict=feed_dict_temp) acc_array.append(acc) print ('Epoch {0} - Test Accuracy: {1:.3f} Train Accuracy: {2:.3f}'.format(j, np.mean(np.array(acc_array)), np.mean(np.array(acc_train_array)))) def train_network(layerSize, num_of_ephocs, learning_rate_local, batch_size, indexes, save_grads, data_sets_org, model_type, percent_of_train, interval_accuracy_display, name, covn_net): """Train the nework""" tf.reset_default_graph() data_sets = data_shuffle(data_sets_org, percent_of_train) ws, estimted_label, gradients, infomration, models, weights = [[None] * len(indexes) for _ in range(6)] loss_func_test, loss_func_train, test_prediction, train_prediction = [np.zeros((len(indexes))) for _ in range(4)] input_size = data_sets_org.data.shape[1] num_of_classes = data_sets_org.labels.shape[1] batch_size = np.min([batch_size, data_sets.train.data.shape[0]]) batch_points = np.rint(np.arange(0, data_sets.train.data.shape[0] + 1, batch_size)).astype(dtype=np.int32) batch_points_test = np.rint(np.arange(0, data_sets.test.data.shape[0] + 1, batch_size)).astype(dtype=np.int32) batch_points_all = np.rint(np.arange(0, data_sets_org.data.shape[0] + 1, batch_size)).astype(dtype=np.int32) if data_sets_org.data.shape[0] not in batch_points_all: batch_points_all = np.append(batch_points_all, [data_sets_org.data.shape[0]]) if data_sets.train.data.shape[0] not in batch_points: batch_points = np.append(batch_points, [data_sets.train.data.shape[0]]) if data_sets.test.data.shape[0] not in batch_points_test: batch_points_test = np.append(batch_points_test, [data_sets.test.data.shape[0]]) # Build the network model = build_model(model_type, layerSize, input_size, num_of_classes, learning_rate_local, name, covn_net) optimizer = model.optimize saver = tf.train.Saver(max_to_keep=0) init = tf.global_variables_initializer() grads = tf.gradients(model.cross_entropy, tf.trainable_variables()) # Train the network with tf.Session() as sess: sess.run(init) # Go over the epochs k = 0 acc_train_array = [] for j in range(0, num_of_ephocs): epochs_grads = [] if j in indexes: ws[k] = exctract_activity(sess, batch_points_all, model, data_sets_org) # Print accuracy if np.mod(j, interval_accuracy_display) == 1 or interval_accuracy_display == 1: print_accuracy(batch_points_test, data_sets, model, sess, j, acc_train_array) # Go over the batch_points acc_train_array = [] current_weights = [[] for _ in range(len(model.weights_all))] for i in range(0, len(batch_points) - 1): batch_xs = data_sets.train.data[batch_points[i]:batch_points[i + 1]] batch_ys = data_sets.train.labels[batch_points[i]:batch_points[i + 1]] feed_dict = {model.x: batch_xs, model.labels: batch_ys} _, tr_err = sess.run([optimizer, model.accuracy], feed_dict=feed_dict) acc_train_array.append(tr_err) if j in indexes: epochs_grads_temp, loss_tr, weights_local = sess.run( [grads, model.cross_entropy, model.weights_all], feed_dict=feed_dict) epochs_grads.append(epochs_grads_temp) for ii in range(len(current_weights)): current_weights[ii].append(weights_local[ii]) if j in indexes: if save_grads: gradients[k] = epochs_grads current_weights_mean = [] for ii in range(len(current_weights)): current_weights_mean.append(np.mean(np.array(current_weights[ii]), axis=0)) weights[k] = current_weights_mean # Save the model write_meta = True if k == 0 else False # saver.save(sess, model.save_file, global_step=k, write_meta_graph=write_meta) k += 1 network = {} network['ws'] = ws network['test_prediction'] = test_prediction network['train_prediction'] = train_prediction network['loss_test'] = loss_func_test network['loss_train'] = loss_func_train network['gradients'] = gradients network['model'] = model return network