--- a +++ b/GP/run_cnn.py @@ -0,0 +1,159 @@ +from CNN.cnn import acc_pearson_r as acc_pearson_r +from CNN.cnn import cnn_main as cnn_main +from CNN.cnn import cnn_main_cat as cnn_main_cat +import os +import pandas as pd +import numpy as np +import talos as ta + +from matplotlib import pyplot as plt +from keras import backend as K +from keras.models import Sequential +from keras.layers import Dense, Activation +from keras.layers import Dropout +from keras import regularizers +from keras.activations import relu, elu, linear, softmax, tanh, softplus +from keras.callbacks import EarlyStopping, Callback +from keras.wrappers.scikit_learn import KerasRegressor +from keras.optimizers import Adam, Nadam, sgd,Adadelta, RMSprop +from keras.losses import mean_squared_error, categorical_crossentropy, logcosh +from keras.utils.np_utils import to_categorical +from keras import metrics + +#keras to CNN +from keras.layers import Flatten, Conv1D, MaxPooling1D +# defining network +from keras.layers import Flatten, Conv1D, MaxPooling1D +from keras import regularizers + + +import wrangle as wr +from talos.metrics.keras_metrics import fmeasure_acc +from talos.model.layers import hidden_layers +from talos import live +from talos.model import lr_normalizer, early_stopper, hidden_layers +import os +from talos import Deploy + +def run_cnn_main(X_tr,y_tr,X_vl,y_val,output,main,prop,trait,cat, +lr,dr_1,dr_2,reg_1,reg_2,reg_3,nconv,act_1,act_2,hn,ps,hl,ks, +ns,epochs,nf,op,bs): + """Evolve a genome.""" + # population: Number of networks/genomes in each generation. + # we only need to train the new ones.... + # generations: Number of times to evolve the population. + # hyperparameters + p = {'hidden_neurons':hn, + 'reg1': reg_1, + 'reg2': reg_2, + 'reg3': reg_3, + 'pool':ps, + 'lr': lr, + 'nconv':nconv, + 'hidden_layers': hl, + 'kernel_size': ks, + 'nStride': ns, # stride between convolutions + 'nFilter': nf, # no. of convolutions' + 'batch_size': bs, + 'epochs': epochs, + 'dropout_1':dr_1, + 'dropout_2': dr_2, + 'optimizer': op, #[Adam,Nadam],# + 'activation_1':act_1, + 'activation_2': act_2, + 'last_activation': [linear]} + + print(p) + + + if cat is False: + talos_cnn = ta.Scan(x=X_tr, + y=y_tr, + model=cnn_main, params=p, + grid_downsample=prop, + print_params=True, + dataset_name='cnn_model') + + #best_model = talos_cnn.best_model(metric='val_acc_pearson_r', asc=False) + best_model = talos_cnn.best_model(metric='val_loss', asc=True) + else: + talos_cnn = ta.Scan(x=X_tr, + y=y_tr, + model=cnn_main_cat, params=p, + grid_downsample=prop, + print_params=True, + dataset_name='cnn_model') + best_model = talos_cnn.best_model(metric='val_acc') + + + x_val = np.expand_dims(np.asarray(X_vl), axis=2) + yy_hat = best_model.predict(x_val, batch_size=32) + + # save model + + talos_Data = pd.DataFrame(talos_cnn.data) + talos_Data["val_loss"] = pd.to_numeric(talos_Data["val_loss"], errors="coerce") + if cat is False: + talos_Data["acc_pearson_r"] = pd.to_numeric(talos_Data["acc_pearson_r"], errors="coerce") + talos_Data["val_acc_pearson_r"] = pd.to_numeric(talos_Data["val_acc_pearson_r"], errors="coerce") + + os.chdir(output) + + if not os.path.exists("cnn"): + os.makedirs("cnn") + dir = output + "cnn/" + + os.chdir(os.path.join(output, 'cnn/')) + + # write output + talos_Data.to_csv("cnn_prediction_talos.csv", index=False) + + r = ta.Reporting("cnn_prediction_talos.csv") + if cat is False: + + if not os.path.exists("figures"): + os.makedirs("figures") + dir = output + "cnn/figures/" + + os.chdir(os.path.join(output, 'cnn/figures/')) + try: + number= y_tr.shape[1] + for i in range(0, number): + corr = np.corrcoef(y_val[:, i], yy_hat[:, i])[0, 1] + # correlation btw predicted and observed + fig = plt.figure() + # plot observed vs. predicted targets + plt.title('CNN: Observed vs Predicted Y trait_' + str(i) + 'cor:' + str(corr)) + plt.ylabel('Predicted') + plt.xlabel('Observed') + plt.scatter(y_val[:, i], yy_hat[:, i], marker='o') + fig.savefig("CNN_Tunne_trait_" + str(i) + '.png', + dpi=300) + plt.close(fig) + os.chdir(output) + except IndexError: + yy_hat = np.reshape(yy_hat, -1) + corr = np.corrcoef(y_val, yy_hat)[0, 1] + # correlation btw predicted and observed + fig = plt.figure() + # plot observed vs. predicted targets + plt.title('cnn: Observed vs Predicted Y trait_' + str(trait) + 'cor:' + str(corr)) + plt.ylabel('Predicted') + plt.xlabel('Observed') + plt.scatter(y_val, yy_hat, marker='o') + fig.savefig("cnn_Tunne_trait_" + str(trait) + '.png', + dpi=300) + plt.close(fig) + + os.chdir(output) + if os.path.exists("best_model"): + os.rmdir("best_model") + os.makedirs("best_model") + if not os.path.exists("best_model"): + os.makedirs("best_model") + + os.chdir(os.path.join(output, 'best_model/')) + if cat is False: + Deploy(talos_cnn, 'CNN_optimize', metric='val_acc_pearson_r', asc=False) + else: + Deploy(talos_cnn,'CNN_optimize')