From 860ce18100245d4709abccd77d8a233d184aec4c Mon Sep 17 00:00:00 2001 From: ilennaj Date: Wed, 2 Sep 2020 12:19:52 -0400 Subject: [PATCH] Rearranged and polished all scripts and necessary notebooks, moved data to results folder level --- combine_classes.py | 65 +++++++++--------- confused_pairs.py | 65 ++++++++++++++++++ confused_pairs_emnist.py | 68 +++++++++++++++++++ fcnn.py | 77 +++++++++++++++++++++ ktree_benchmarking.ipynb | 30 ++++----- ktree_orig.py | 86 ++++++++++++++++++++++++ ktree_perm.py | 86 ++++++++++++++++++++++++ ktree_rand.py | 85 +++++++++++++++++++++++ lda.py | 73 ++++++++++++++++++++ results/classes.npy | Bin 0 -> 760 bytes results/confused_pairs_all.npy | Bin 0 -> 48128 bytes results/confused_pairs_emnist_upper.npy | Bin 0 -> 54208 bytes results/fc_acc.npy | Bin 0 -> 688 bytes results/fc_loss.npy | Bin 0 -> 688 bytes results/fcnn_acc_0.npy | Bin 0 -> 3488 bytes results/fcnn_loss_0.npy | Bin 0 -> 3488 bytes results/ktree_acc_orig_0.npy | Bin 0 -> 3488 bytes results/ktree_acc_orig_2.npy | Bin 0 -> 1088 bytes results/ktree_acc_orig_3.npy | Bin 0 -> 608 bytes results/ktree_acc_perm_0.npy | Bin 0 -> 3488 bytes results/ktree_acc_rand_0.npy | Bin 0 -> 3488 bytes results/ktree_loss_orig_0.npy | Bin 0 -> 3488 bytes results/ktree_loss_orig_2.npy | Bin 0 -> 1088 bytes results/ktree_loss_orig_3.npy | Bin 0 -> 608 bytes results/ktree_loss_perm_0.npy | Bin 0 -> 3488 bytes results/ktree_loss_rand_0.npy | Bin 0 -> 3488 bytes results/lda_score_test.npy | Bin 0 -> 688 bytes 27 files changed, 589 insertions(+), 46 deletions(-) create mode 100644 confused_pairs.py create mode 100644 confused_pairs_emnist.py create mode 100644 fcnn.py create mode 100644 ktree_orig.py create mode 100644 ktree_perm.py create mode 100644 ktree_rand.py create mode 100644 lda.py create mode 100644 results/classes.npy create mode 100644 results/confused_pairs_all.npy create mode 100644 results/confused_pairs_emnist_upper.npy create mode 100644 results/fc_acc.npy create mode 100644 results/fc_loss.npy create mode 100644 results/fcnn_acc_0.npy create mode 100644 results/fcnn_loss_0.npy create mode 100644 results/ktree_acc_orig_0.npy create mode 100644 results/ktree_acc_orig_2.npy create mode 100644 results/ktree_acc_orig_3.npy create mode 100644 results/ktree_acc_perm_0.npy create mode 100644 results/ktree_acc_rand_0.npy create mode 100644 results/ktree_loss_orig_0.npy create mode 100644 results/ktree_loss_orig_2.npy create mode 100644 results/ktree_loss_orig_3.npy create mode 100644 results/ktree_loss_perm_0.npy create mode 100644 results/ktree_loss_rand_0.npy create mode 100644 results/lda_score_test.npy diff --git a/combine_classes.py b/combine_classes.py index 7bb154a..1f3392c 100644 --- a/combine_classes.py +++ b/combine_classes.py @@ -1,71 +1,76 @@ -# Make 'classes' file -# TODO: Reassign file save destinations, comment, and remove extra lines of code +# Run Order: 2nd, 1 out of 1 +# Make 'classes' file in results folder import numpy -paired_test = np.load('./results/20200509/confused_pairs_all.npy') -print(paired_test.shape) +######## +#### Look at confused pairs for all datasets except EMNIST +######## +paired_test = np.load('./results/confused_pairs_all.npy') -ds = 0 +# Use the mean of each paired class set over all trials pt_mean = np.mean(paired_test, axis=1) +# Initialize dataset set ds_set = ['mnist', 'fmnist', 'kmnist','svhn','usps', 'cifar10'] +# Initialize classes variable for record keeping classes = [] -paired_test +# For each dataset for i, ds in enumerate(ds_set): + # Select the paired class means for the selected dataset focus = pt_mean[i] - + + # Select pair of classes that have the lowest score a = np.min(focus[np.nonzero(focus)]) - b = np.sort(focus[np.nonzero(focus)]) - e = b[len(b)-2] c = np.where(focus == a) - d = np.where(focus == e) - classes.append([c[0][0], c[1][0], ds, a, d[0][0], d[1][0], e]) + # Record keeping + classes.append([c[0][0], c[1][0], ds]) classes = np.array(classes, dtype=object) classes_orig = classes -print(classes) -# np.save('./results/20200511/classes.npy', classes[:,:3], allow_pickle=True) -# np.load('./results/20200511/classes.npy', allow_pickle=True) -paired_test = np.load('./results/20200509/confused_pairs_emnist_upper.npy') +######## +#### Look at confused pairs for only EMNIST +######## + +paired_test = np.load('./results/confused_pairs_emnist_upper.npy') paired_test.shape pt_mean = np.mean(paired_test, axis=1) +# Initialize dataset set ds_set = ['emnist'] + +# Initialize classes variable for record keeping classes = [] +# For each dataset (only EMNIST) for i, ds in enumerate(ds_set): + # Select the paired class means for the selected dataset focus = pt_mean[i] - + + # Select pair of classes that have the lowest score a = np.min(focus[np.nonzero(focus)]) - print(a) - b = np.sort(focus[np.nonzero(focus)]) - e = b[len(b)-2] c = np.where(focus == a) - d = np.where(focus == e) - - classes.append([c[0][0]+10, c[1][0]+10, ds, a, d[0][0]+10, d[1][0]+10, e ]) + + # Record keeping + classes.append([c[0][0]+10, c[1][0]+10, ds]) classes = np.array(classes, dtype=object) -print(classes) -# intermed = np.concatenate((class_orig, classes), 0) -# np.save('./results/20200511/classes_emnist_perf.npy', intermed, allow_pickle=True) -# np.save('./results/20200511/classes.npy', classes, allow_pickle=True) +######## +#### Organize final class pairs into an array for further use +######## -# classes_orig = np.load('./results/20200511/classes.npy', allow_pickle=True) -print(classes_orig.shape, classes[:,:].shape) -classes_final = np.concatenate((classes_orig[:,:3],classes[:,:3]),0) +classes_final = np.concatenate((classes_orig,classes),0) a = classes_final[3:6].copy() b = classes_final[6].copy() classes_final[3] = b classes_final[4:] = a print(classes_final) -# # np.save('./results/20200511/classes.npy', classes_final, allow_pickle=True) \ No newline at end of file +np.save('./results/classes.npy', classes_final, allow_pickle=True) \ No newline at end of file diff --git a/confused_pairs.py b/confused_pairs.py new file mode 100644 index 0000000..28ae1a4 --- /dev/null +++ b/confused_pairs.py @@ -0,0 +1,65 @@ +# Run Order: 1st, 1 out of 2 +# Determine most confused pairs of classes in all datasets except for EMNIST + +from custompackage.load_data import * +from custompackage.load_architecture import * +from custompackage.traintestloop import * + +import torch +from torch.utils.data import DataLoader +import numpy as np +import math +import torchvision +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +import scipy +import os +import glob +import pandas as pd +import pickle + +if not os.path.exists('results'): + os.makedirs('results') + +# Initialize parameters for dataset loading +bs = 256 +weighting = 'paired' +trials = 10 +ds_set = ['mnist', 'fmnist', 'kmnist','svhn','usps','cifar10'] + +# Initialize for record keeping +paired_test = np.zeros((len(ds_set),trials,10,10)) +for m in range(trials): + # For each 10-class dataset + for k, ds in enumerate(ds_set): + # Go through each class + for i in range(10): + t1 = i + # and pair it with every other class + for j in range(i+1,10): + t2 = j + + # Load the binary classification dataloaders + trainloaders, validloaders, testloader = dataset_weighted_split_all(bs, t1, t2, weighting, trials, ds) + + # Assign entirety of the datasets within each dataloader to a variable + X_train = trainloaders[0].dataset.tensors[0] + y_train = trainloaders[0].dataset.tensors[1] + X_test = testloader.dataset.tensors[0] + y_test = testloader.dataset.tensors[1] + + + # initialize lda + lda = LinearDiscriminantAnalysis() + + # fit to images, labels + lda.fit(X_train, y_train) + + # see accuracy for validation set + score_test = lda.score(X_test, y_test) + +# print(ds, m, i, j, score_test) + + #Record keeping + paired_test[k, m, i, j] = score_test + + np.save('./results/confused_pairs_all.npy', paired_test) \ No newline at end of file diff --git a/confused_pairs_emnist.py b/confused_pairs_emnist.py new file mode 100644 index 0000000..734c9a7 --- /dev/null +++ b/confused_pairs_emnist.py @@ -0,0 +1,68 @@ +# Run Order: 1st, 2 out of 2 +# Determine most confused pairs of classes in only EMNIST dataset, specifically the uppercase letters + + +from custompackage.load_data import * +from custompackage.load_architecture import * +from custompackage.traintestloop import * + +import torch +from torch.utils.data import DataLoader +import numpy as np +import math +import torchvision +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +import scipy +import os +import glob +import pandas as pd +import pickle + +if not os.path.exists('results'): + os.makedirs('results') + +# Testing uppercase Letters from EMNIST only + +# Initialize parameters for dataset loading +bs = 256 +weighting = 'paired' +trials = 10 +ds_set = ['emnist'] + +# Initialize for record keeping +paired_test = np.zeros((len(ds_set),trials,26,26)) +for m in range(trials): + # For each 10-class dataset + for k, ds in enumerate(ds_set): + # Go through each class + for i in range(10, 36): + t1 = i + # and pair it with every other class + for j in range(i+1,36): + t2 = j + + # Load the binary classification dataloaders + trainloaders, validloaders, testloader = dataset_weighted_split_all(bs, t1, t2, weighting, trials, ds) + + # Assign entirety of the datasets within each dataloader to a variable + X_train = trainloaders[0].dataset.tensors[0] + y_train = trainloaders[0].dataset.tensors[1] + X_test = testloader.dataset.tensors[0] + y_test = testloader.dataset.tensors[1] + + + # initialize lda + lda = LinearDiscriminantAnalysis() + + # fit to images, labels + lda.fit(X_train, y_train) + + # see accuracy for validation set + score_test = lda.score(X_test, y_test) + +# print(ds, m, i, j, score_test) + + #Record keeping + paired_test[k,m, i-10,j-10] = score_test + + np.save('./results/confused_pairs_emnist_upper.npy', paired_test) \ No newline at end of file diff --git a/fcnn.py b/fcnn.py new file mode 100644 index 0000000..e00c5ab --- /dev/null +++ b/fcnn.py @@ -0,0 +1,77 @@ +# Run Order: 3rd, 1 out of 2 +### Train and test fcnn model +### Saves test loss and test accuracy +### all classes script, early stopping implemented + + +from custompackage.load_data import * +from custompackage.load_architecture import * +from custompackage.traintestloop import * + + +import torch +from torch.utils.data import DataLoader +import torch.optim as optim +import torch.nn as nn +import numpy as np +import math +import torchvision +from torchvision import transforms +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.metrics import classification_report, confusion_matrix +from sklearn.svm import SVC +from sklearn.linear_model import LogisticRegression +from sklearn.naive_bayes import GaussianNB +import matplotlib +import matplotlib.pyplot as plt +from torch.optim.optimizer import required +from torch.utils.data.dataset import random_split +import scipy +import os +import glob +import pandas as pd +import pickle +from pytorchtools import EarlyStopping + + +# Test space for networks +# Select Class Set +class_set = 0 + + +# Initialize settings +bs = 256 +weighting = 'paired' +trials = 10 +epochs = 2000 +trees_set = [1,2,4,8,16,32] + +# Load class-dataset list +classes = np.load('./results/classes.npy', allow_pickle=True) + +# Initialize final test loss and accuracy variables +loss = np.zeros((len(classes), trials, len(trees_set))) +acc = np.zeros((len(classes), trials, len(trees_set))) + + +# For each dataset enumerated from classes list +for j, (t1, t2, ds) in enumerate(classes): + print(t1, t2, ds) + # Load data loaders + trainloaders, validloaders, testloader = dataset_weighted_split_all(bs, t1, t2, weighting, trials, ds, permute=False) + # Initialize input size for model initialization purposes + input_size = trainloaders[0].dataset.tensors[0][0].shape[0] + # For each trial + for i in range(trials): + # For every k-tree defined by trees_set + for k, trees in enumerate(trees_set): + print(j, i, k) + # Initialize the fcnn model, such that hidden layer is twice the number of trees + model = simple_fcnn(input_size, 2*trees, 1).cuda() + #Train and test fcnn, assigning loss and acc values + loss_curve, acc_curve, loss[j,i,k], acc[j,i,k], model_t = train_test_fc(model, trainloaders[i], + validloaders[i], testloader, epochs=epochs) + + # Save accuracy and loss arrays + np.save('./results/fcnn_acc_'+str(class_set)+'.npy', acc) + np.save('./results/fcnn_loss_'+str(class_set)+'.npy', loss) diff --git a/ktree_benchmarking.ipynb b/ktree_benchmarking.ipynb index f259dcd..f30ce80 100644 --- a/ktree_benchmarking.ipynb +++ b/ktree_benchmarking.ipynb @@ -11,29 +11,15 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'custompackage.neuron_capacity'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mcustompackage\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_architecture\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mcustompackage\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtraintestloop\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mcustompackage\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mneuron_capacity\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mcustompackage\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msin_ineq\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'custompackage.neuron_capacity'" - ] - } - ], + "outputs": [], "source": [ "\n", "\n", "from custompackage.load_data import *\n", "from custompackage.load_architecture import *\n", "from custompackage.traintestloop import *\n", - "from custompackage.neuron_capacity import *\n", - "from custompackage.sin_ineq import *\n", "\n", "import torch\n", "from torch.utils.data import DataLoader\n", @@ -1956,6 +1942,18 @@ "plt.imshow(model.w0_3.weight.data.cpu()[:16,:16])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/ktree_orig.py b/ktree_orig.py new file mode 100644 index 0000000..bb10280 --- /dev/null +++ b/ktree_orig.py @@ -0,0 +1,86 @@ +# Run Order: 4th, 1 out of 3 +### Train and test k-tree model +### Saves test loss and test accuracy +### Uses original image input order +### all classes script, early stopping implemented + + +from custompackage.load_data import * +from custompackage.load_architecture import * +from custompackage.traintestloop import * + + +import torch +from torch.utils.data import DataLoader +import torch.optim as optim +import torch.nn as nn +import numpy as np +import math +import torchvision +from torchvision import transforms +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.metrics import classification_report, confusion_matrix +from sklearn.svm import SVC +from sklearn.linear_model import LogisticRegression +from sklearn.naive_bayes import GaussianNB +import matplotlib +import matplotlib.pyplot as plt +from torch.optim.optimizer import required +from torch.utils.data.dataset import random_split +import scipy +import os +import glob +import pandas as pd +import pickle +from pytorchtools import EarlyStopping + + + +# Test space for networks +# Select Class Set +class_set = 0 + +# Initialize settings +bs = 256 +weighting = 'paired' +trials = 10 +epochs = 2000 +trees_set = [1,2,4,8,16,32] + +# Load class-dataset list +classes = np.load('./results/classes.npy', allow_pickle=True) + +# if class_set == 0: +# classes = classes[0:2] # mnist fmnist +# elif class_set == 1: +# classes = classes[2:4] # kmnist emnist +# elif class_set == 2: +# classes = classes[4:6] # svhn usps +# else: +# classes = classes[6].reshape(1,-1) + +# Initialize final test loss and accuracy variables +loss = np.zeros((len(classes), trials, len(trees_set))) +acc = np.zeros((len(classes), trials, len(trees_set))) + +# For each dataset enumerated from classes list +for j, (t1, t2, ds) in enumerate(classes): + print(t1, t2, ds) + # Load data loaders + trainloaders, validloaders, testloader = dataset_weighted_split_all(bs, t1, t2, weighting, trials, ds, permute=False) + # Initialize input size for model initialization purposes + input_size = trainloaders[0].dataset.tensors[0][0].shape[0] + # For each trial + for i in range(trials): + # For every k-tree defined by trees_set + for k, trees in enumerate(trees_set): + print(j, i, k) + # Initialize the ktree model + model = ktree_gen(ds=ds, Repeats=trees, Padded=True).cuda() + + #Train and test ktree, assigning loss and acc values + loss_curve, acc_curve, loss[j,i,k], acc[j,i,k], model_t = train_test_ktree(model, trainloaders[i], + validloaders[i], testloader, epochs = epochs, randorder=False) + # Save accuracy and loss arrays + np.save('./results/ktree_acc_orig_'+str(class_set)+'.npy', acc) + np.save('./results/ktree_loss_orig_'+str(class_set)+'.npy', loss) diff --git a/ktree_perm.py b/ktree_perm.py new file mode 100644 index 0000000..4290666 --- /dev/null +++ b/ktree_perm.py @@ -0,0 +1,86 @@ +# Run Order: 5th, 1 out of 2 +### Train and test k-tree model +### Saves test loss and test accuracy +### Uses original image input order +### all classes script, early stopping implemented + + +from custompackage.load_data import * +from custompackage.load_architecture import * +from custompackage.traintestloop import * + + +import torch +from torch.utils.data import DataLoader +import torch.optim as optim +import torch.nn as nn +import numpy as np +import math +import torchvision +from torchvision import transforms +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.metrics import classification_report, confusion_matrix +from sklearn.svm import SVC +from sklearn.linear_model import LogisticRegression +from sklearn.naive_bayes import GaussianNB +import matplotlib +import matplotlib.pyplot as plt +from torch.optim.optimizer import required +from torch.utils.data.dataset import random_split +import scipy +import os +import glob +import pandas as pd +import pickle +from pytorchtools import EarlyStopping + + + + +# Test space for networks +# Select Class Set +class_set = 0 + +# Initialize settings +bs = 256 +weighting = 'paired' +trials = 10 +epochs = 2000 +trees_set = [1,2,4,8,16,32] + +# Load class-dataset list +classes = np.load('./results/classes.npy', allow_pickle=True) + +# if class_set == 0: +# classes = classes[0:2] # mnist fmnist +# elif class_set == 1: +# classes = classes[2:4] # kmnist emnist +# elif class_set == 2: +# classes = classes[4:6] # svhn usps +# else: +# classes = classes[6].reshape(1,-1) + +# Initialize final test loss and accuracy variables +loss = np.zeros((len(classes), trials, len(trees_set))) +acc = np.zeros((len(classes), trials, len(trees_set))) + +# For each dataset enumerated from classes list +for j, (t1, t2, ds) in enumerate(classes): + print(t1, t2, ds) + # Load data loaders + trainloaders, validloaders, testloader = dataset_weighted_split_all(bs, t1, t2, weighting, trials, ds, permute=True) + # Initialize input size for model initialization purposes + input_size = trainloaders[0].dataset.tensors[0][0].shape[0] + # For each trial + for i in range(trials): + # For every k-tree defined by trees_set + for k, trees in enumerate(trees_set): + print(j, i, k) + # Initialize the ktree model + model = ktree_gen(ds=ds, Repeats=trees, Padded=True).cuda() + #Train and test ktree, assigning loss and acc values + loss_curve, acc_curve, loss[j,i,k], acc[j,i,k], model_t = train_test_ktree(model, trainloaders[i], + validloaders[i], testloader, epochs = epochs, randorder=False) + # Save accuracy and loss arrays + np.save('./results/ktree_acc_perm_'+str(class_set)+'.npy', acc) + np.save('./results/ktree_loss_perm_'+str(class_set)+'.npy', loss) diff --git a/ktree_rand.py b/ktree_rand.py new file mode 100644 index 0000000..0805114 --- /dev/null +++ b/ktree_rand.py @@ -0,0 +1,85 @@ +# Run Order: 5th, 2 out of 2 +### Train and test k-tree model +### Saves test loss and test accuracy +### Uses original image input order +### all classes script, early stopping implemented + + +from custompackage.load_data import * +from custompackage.load_architecture import * +from custompackage.traintestloop import * + + +import torch +from torch.utils.data import DataLoader +import torch.optim as optim +import torch.nn as nn +import numpy as np +import math +import torchvision +from torchvision import transforms +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.metrics import classification_report, confusion_matrix +from sklearn.svm import SVC +from sklearn.linear_model import LogisticRegression +from sklearn.naive_bayes import GaussianNB +import matplotlib +import matplotlib.pyplot as plt +from torch.optim.optimizer import required +from torch.utils.data.dataset import random_split +import scipy +import os +import glob +import pandas as pd +import pickle +from pytorchtools import EarlyStopping + + + +# Test space for networks +# Select Class Set +class_set = 0 + +# Initialize settings +bs = 256 +weighting = 'paired' +trials = 10 +epochs = 2000 +trees_set = [1,2,4,8,16,32] + +# Load class-dataset list +classes = np.load('./results/classes.npy', allow_pickle=True) + +# if class_set == 0: +# classes = classes[0:2] # mnist fmnist +# elif class_set == 1: +# classes = classes[2:4] # kmnist emnist +# elif class_set == 2: +# classes = classes[4:6] # svhn usps +# else: +# classes = classes[6].reshape(1,-1) + +# Initialize final test loss and accuracy variables +loss = np.zeros((len(classes), trials, len(trees_set))) +acc = np.zeros((len(classes), trials, len(trees_set))) + +# For each dataset enumerated from classes list +for j, (t1, t2, ds) in enumerate(classes): + print(t1, t2, ds) + # Load data loaders + trainloaders, validloaders, testloader = dataset_weighted_split_all(bs, t1, t2, weighting, trials, ds, permute=False) + # Initialize input size for model initialization purposes + input_size = trainloaders[0].dataset.tensors[0][0].shape[0] + # For each trial + for i in range(trials): + # For every k-tree defined by trees_set + for k, trees in enumerate(trees_set): + print(j, i, k) + # Initialize the ktree model + model = ktree_gen(ds=ds, Repeats=trees, Padded=True).cuda() + #Train and test ktree, assigning loss and acc values (random ordered input) + loss_curve, acc_curve, loss[j,i,k], acc[j,i,k], model_t, _ = train_test_ktree(model, trainloaders[i], + validloaders[i], testloader, epochs = epochs, randorder=True) + # Save accuracy and loss arrays + np.save('./results/ktree_acc_rand_'+str(class_set)+'.npy', acc) + np.save('./results/ktree_loss_rand_'+str(class_set)+'.npy', loss) diff --git a/lda.py b/lda.py new file mode 100644 index 0000000..aef2619 --- /dev/null +++ b/lda.py @@ -0,0 +1,73 @@ +# Run Order: 3rd, 2 out of 2 +### Train and test lda model +### Saves test accuracy +### all classes script, early stopping implemented + + +from custompackage.load_data import * +from custompackage.load_architecture import * +from custompackage.traintestloop import * + + +import torch +from torch.utils.data import DataLoader +import torch.optim as optim +import torch.nn as nn +import numpy as np +import math +import torchvision +from torchvision import transforms +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.metrics import classification_report, confusion_matrix +from sklearn.svm import SVC +from sklearn.linear_model import LogisticRegression +from sklearn.naive_bayes import GaussianNB +import matplotlib +import matplotlib.pyplot as plt +from torch.optim.optimizer import required +from torch.utils.data.dataset import random_split +import scipy +import os +import glob +import pandas as pd +import pickle + + + +# Initialize settings +bs = 256 +weighting = 'paired' +trials = 10 + +# Load class-dataset list +classes = np.load('./results/classes.npy', allow_pickle=True) + +# Initialize test accuracy variable +score_test = np.zeros((len(classes), trials)) + + +for j, (t1, t2, ds) in enumerate(classes): + print(t1, t2, ds) + print('lda') + # Get correctly labeled and paired class datasets + trainloaders, validloaders, testloader = dataset_weighted_split_all(bs, t1, t2, weighting, trials, ds) + for i in range(trials): + print(j, i) + # Reassign datasets + X_train = trainloaders[i].dataset.tensors[0] + y_train = trainloaders[i].dataset.tensors[1] + X_test = testloader.dataset.tensors[0] + y_test = testloader.dataset.tensors[1] + + # initialize lda + lda = LinearDiscriminantAnalysis() + + # fit to images, labels + lda.fit(X_train, y_train) + + # see accuracy for validation set + score_test[j,i] = lda.score(X_test, y_test) + print(score_test[j,i]) + + # Save accuracy array + np.save('./results/lda_score_test.npy', score_test) diff --git a/results/classes.npy b/results/classes.npy new file mode 100644 index 0000000000000000000000000000000000000000..bee1f75da22ce4241281b058774d9f5e5e546316 GIT binary patch literal 760 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 literal 0 HcmV?d00001 diff --git a/results/confused_pairs_emnist_upper.npy b/results/confused_pairs_emnist_upper.npy new file mode 100644 index 0000000000000000000000000000000000000000..b41a9398d2d98a1fe4dd271b421d688d812e9424 GIT binary patch literal 54208 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 literal 0 HcmV?d00001 diff --git a/results/fc_loss.npy b/results/fc_loss.npy new file mode 100644 index 0000000000000000000000000000000000000000..0e08405523787169c21f6be612310de2b3adb6f9 GIT binary patch literal 688 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 literal 0 HcmV?d00001 diff --git a/results/ktree_acc_orig_0.npy b/results/ktree_acc_orig_0.npy new file mode 100644 index 0000000000000000000000000000000000000000..68bbd97cecf25ffeae9cb5ee5dad148b786f7b47 GIT binary patch literal 3488 zcmbVOdst0r7dIahnl$Q(Tt*HJrzj$qTxNbEb%-sHhRG< zaql+NLpQ+7LpQ|TLzklaSC6g3ut7&_H}VK<9WdZ;Cmsv4?+?!G!(->ial;*ad3?BH z)x-L59uZICdU@aAaerLQj&98cOp5cqRMC>hNw0QA_hNXwblw=?I+sUf=n>~_IXwPI z2wOY#xMuG&cEgkp9$RqTXT;lRJMCUc_D$CA2oKr4y?_V$7v3kmENUEs@0?)a7Yjl! zylmSvp2z3EUMh(%&zr=fU&I65{!$+IR+l6_TV}!U+xu?Pzp<$P z%*P83PD|F}G<(^66VCCfE;+}}cfV+0)q5_lYO`vt@DRoB7ud*yzurL%#UpI{u-+~W zoXVHzPxL-Fc6EhqJ&&x`BkR)gc#ID{ePG>ci;8nv+CJ)ax~Bi|PFanG4Lk^*ZSx(| z&R(VQm1*zx3LS&30on8F-q1Mz(k*iRIU03uik{t>z+lAF;G7@kGvJdkczPKP&!anq z!izMT?=7W!4`ASQ=nLa=CkCZ1YuM0I2CmhOsd42D#t;48FUnkx9TmDG39&S6R^^Hj zXrxGP#xm$7A266H2Vfu`+Wn_5t;XATF-Y{lAViGrn5Nmw+p`S1MMyVkJiPHL%(Rz= z?7ohM#OlXD2IY%3cWO160kMxV-|AW2Sg-PZm#6$Xm4PhB5eA)GO}6(uN~4AR7%)nb zr-)Yh7JniE(D;yem69xN7LOZjh?O03N*!^SIHUcPVaMx{(NVg{Lh_Ouz$$geLQY!=tJDVvf}iAbiR_p`L!nd{ ztiqp#TyBe4+?^l=U|`KNgZ&b$_MB3;tWvicK2pCVza(B8Ik7C_<-nR=q%LF`Xa)=A z#Im>~m1z_UsakdlEUfwGAeU#3S<$}^1V7P{+_&Q36g_B=x=)k^WMR!O2Tsi98dlTi z_u%LEb>ep~?n#&QE7Jww`qVV9hbBx|e|F%WWC4pt&I!!T6mZgKUeSRh0d)ucwsDJj z9DdZT{^@uDK6hP@*trYXlzo0{S)69)@yPI8T*>*(@p0{0CL^7a8%Om)^ESBob&R>Uw9BaL?@CD zq9f6(Z1%<#!D|gzqx+c(yKBIo>4*K>hZ*sx@4-Gjyp34XsyfiNZ7uZCt46smGoX2K z(xFkQM%Z7?Kam+N&BG zp-XpPyYv3J|1QC$D8q=uw#z$D?@)uzy;qj)(wpJ$kQI{Nvj*LYJ=QSX%nB_@2IeP-E^C?js($i3YETn##o*|Mqi7aH%pOyfHH%Leqy?-S8tzX2s-sZ~|0 zO_=+3OKog76V|mKA{-1ftGt)*d+q-`#Eibz@~S_wF=D8HRr!gI+WV!6ZS_K}hOa4t zT2MKU0?|YKQ~VItK;glohJ|;VO`wW)e^_8^!khzDo?U4({+JQe@Le;59-TvOesze& z&k2v8%?L86>np#31^GoB$ogN;-%d34<k_Eh6MrSGp4J}rVzI5#jk-0Kh10_NJt-SFHO?r#C2gj!McqqiMoibB3fV4kGr1C$Ueulr1u*)%PMf(Zy4B zPwtWReDP?9jEUkrqVSWiH?p|rEeXYf#3TIP#l1IWgWbN_jLI{5@=uuodJ9fTFsnI4 z$p>{HILJBiGfk2ynZ?RA;W<6+ElNM8)cL_WHyI%|L9yXJMS;{NZA|KW(ue+Owf0p? znX@RRk5jlQjX&Edr5_pv*{NG7q AB>(^b literal 0 HcmV?d00001 diff --git a/results/ktree_acc_orig_2.npy b/results/ktree_acc_orig_2.npy new file mode 100644 index 0000000000000000000000000000000000000000..d0c0bec2740f5226dc1bdd8c79b29e5493c8aafa GIT binary patch literal 1088 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$7ItqpcItpf*ItsN4WC5;S=@YB{+aB1rDlB^xeEEU>x0dxz0>KaMZ)va9 zQZ#;O-^y~^m5cM4y?SD!i)Q5m`+ucn>s;y{+Vh>7x4k3(37p^T*b@EF@)?{DQ+Ks1 zTOy(P5nS9zB*S{mt|#_uuXg;6T>TI(4pX1@a>t@GmoUYh=D(L)+5XUeJy(@voahsK zNwxZ2^VOf)I|+6Lv?x8XmtCXN|M4ioJ)*l)mG{niVh^*=!~WOB{yK!b)H%oW$fr;3 zSNh-9;NV5LFJ`%EomcS_`~A9`Xh<}qawyF0?)vpOF3@tt^JuR2dFiec3Q`)$E>H*PdNw$J`EG9Y0CR1PciAO)OzbRBRd;g&~ z_IdxfHcPo8)Wgi%#&ZAJdV|;YGp=epy5RZRUZn8FlG+Jx;P$wvzim!&cnjx)Tw@)F zkY5#3zUPL}8+(vzV#+bihq)i-KA62QdtkJTRi?ZO^DBFpc~5seK056I!rw4|!qk@? z?*{t#CEQ&=&jF3N59h<|fzgN8xCyrVy@LA>to`R}`zywvfO>5Yvk&G!bayYUoxrmq x{T1AwiD8R7oYmjj?*=*Z_8a>Iu)uSBm^)zNFmqx-!Bq3wzP>fGSBdYfJpffA8;}41 literal 0 HcmV?d00001 diff --git a/results/ktree_acc_orig_3.npy b/results/ktree_acc_orig_3.npy new file mode 100644 index 0000000000000000000000000000000000000000..9aed148a075083f1b333052eace5878e818db10b GIT binary patch literal 608 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItqpcItpf*ItsN4WC1Q)uIq~nY#-S(fWZTM-A!}fFF*FsKEiU#iL!n7 z?H5St-&J9I43~$g!$t3#57O|+eurG^>%bk4?5joAxj(FWWPkp9@Z+VkAK5ofb?(l2 z{t#;3BYVFj0iab6?7`HDNA^HPM-(bP+O2tdHhxUI~e!S$Hgm9lw^MO+fT@iek zJ0SKvu+NzIw#MG{k^LgqZJ+;Md1Qazzju0`&|~`Y5AA`P5}saoWM2pl(1-T* zS$j$*OFXilEWr}Sr~Akr7S5_{pb&Uu5A(-GrQ1L2vJmE`fdRrDF#qAAi@_d#2=_P4 Lyt8LO;E_E5;&9vP literal 0 HcmV?d00001 diff --git a/results/ktree_acc_perm_0.npy b/results/ktree_acc_perm_0.npy new file mode 100644 index 0000000000000000000000000000000000000000..a971b2d01fc67fdba5870f6ef0e23456a2d40861 GIT binary patch literal 3488 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 Xu9E5doEiwn?WOeb%JqFACFSYAm(R~h literal 0 HcmV?d00001 diff --git a/results/ktree_loss_orig_0.npy b/results/ktree_loss_orig_0.npy new file mode 100644 index 0000000000000000000000000000000000000000..b7e7c8544e6b351a628989be8f0d253e8c9699f4 GIT binary patch literal 3488 zcmeHI{ZEx;7=8#h943xwTg{b^0v$?f%8C&2_{b~-KQM%mIOSz>5JkSuIc91c-?>1j zmiaMtxaxt_^x(3Lfg{Z~KodM*srUhguL>Nb05PnXy5hc`|DYfGiSx^~>$>mf{2Ia4ci2XBM^<{i zZG?xu5yofE2;&hih4DiEpML&~G0r1e=Z>ImIxi8jS?)$c?O=5aA@5p$1@ZEh(}bpL z;yvK_#PiT&Y;}a<%4Jn&^XVqyTIvG>@xV*HgywJ}>dOg{KNFWnmm;q1nWFj>%s4_i zyYtZvLanZ`n~;~CZYLBg=CwhudKUAsic<6ur{;P{XO+{g1CMSyPN;YHVQ#tg=^u&9 zgy3HYjo$fQ;JJRB*9RNWM~*AHKsx{M?g>JD=Js>Qdm-)`^bkMHFV>z#e?9vt6Z-y+ zi-hvQwt7OnVX@lZZvpxnR)6%@R#if0d?ofZU$(0GYBm71+HTCH@A?OQMduux6J0r_ zs2|$)Juof>eYCDb_`)`B!*kGbBH*X|<|OK~`71FmKXVgv>O%)_(Ru#-T=>XNPJ_-e zw!$}g-vMr9Xa7ohMrv>;Fg6lgkGpW2xJatTc_S)C>GiWaNY`VxsJORM)s+*`PY*t& z;txCFql~oPMBUt1Fh6fOaGAJyWiPni^XM*dek~AOj$MR)^1^bpNA45UH4nKJ=5;DP zyB+V1IIu&_l`HO`Zh;HWS5!x%FLxKBzI<-BI#-;A`9w)G_7&{`YK}3Ru#a>{bzz>e z&yX*RixD@!l;Faz7^o#2K^@aqM;|jJ4tab+4B|%dWYym+$DF)cAm7+khwp|pm0)hR zxlsA_S3dR=D}z;@yA^SxY(J169*ej(&+;41rw1Ivdt}z7sXeTry`+nEr_i5;3HZS4 z98cg&cPexqxVaB`E1Hz=E6!kFBYILl>AW#b&ELe8-Z5K!|K2gEXa3QQ^L&jB@2`l; z`jgJ-1ugL3Nb}&Fn0gFUMuh(YHK(CK)MmrTSUm0HRFEQ$N78< z-5&4>&^r7T;=XTxL8yh#cN5ADHJC$MJ;-COMfXV;Z{9#(8R7$-`#s7don_tIM9BMJ z{}g$XE0o_gvkrsD+xHS0({HH%ji4Opn&+_-dgnsqOYhWb;ynAO8k`HNhycHS)<&qs z-&S?5Zo<842E6JZ-Ppktuc_UKyxZxigzQYmJBTm2Xn?O?@C>2uO~O5<>HUS^;~&=( z@{h~&!H>0qn`<>ZHzOk+_ZxFIR3ToqFC3VZ37?Fd;a=h_>LR{t{c8{W;(6Pl>wU>8 VPC28$Q3pmH7$^+W(+=S**R+UVEQ4-{pd$J$s8+ zunJaf^LYJ7e6~z(+fkBXvvXTXneUX(ed17=&*N3~T=#Lmce(CA>OSdR=7|nFPfoJ) zv@LdC!~g4NVT{Sq@h@4+$co~|6`GYlzbcf)i>QlT&6A32=?mceW&*fOuUNobUGz7g z=mQ$BYbO*J5iQW^Ne!6OtB%1}|08EqpBHvvA4|+eUHI=&e@)Jm>YMv#!1=a#=wy5q z>LTqC{0(>M9QMwKv6p*-(CI^y=$n~cG;b{#QaU3rJ`dleNZPY9FoyYTy33q6K=tiY zv#Krvo4=#)2#$ik7(`#DW?-MTZvyjtweuHrmv&;Wws?c?SU-Sw%aj4=^#XdAHrzR_ z^!md&__6xDx0u(@QXYXA$}7|WZUpulQG{0f4$Ly`}InHAABBfpnJ|2!dF;oKB~HYHGf1Qvvfjl z#P*QBrk(U7R(kh^YXeFro8OrV#aeq8=2E)5f$MHRL7g{YP7Y?%_t1Qh{-3C=^#9my zp|5rH;tu)BO8T*Upb?#q@6Yh-*u#FW!hM=GwO9EYQ7+P1V}Q)#M2=>81Yz0z4@#$P unj-(!&T5`as~Ery!ak>m-C$Sp%jYR84#g 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 literal 0 HcmV?d00001 diff --git a/results/lda_score_test.npy b/results/lda_score_test.npy new file mode 100644 index 0000000000000000000000000000000000000000..eec3dad2f1b8034b78fc28e14fb83b261e40a18e GIT binary patch literal 688 zcmbV}|1Z>W9LG_!vbqr|R8HCMS|?gbls#Dy;gY^g%5k_u6LuHboK~rP8`c;3(v)h& z556rFCY!6MtVrkEV!iLq`-acu^u-#Jx{p7h=MS&#^?Ys5*YEz~xC(WEW)OjA=aX7~PLE34=9Yp!1_MnUgGZ!#WQBgtGx@jC!|gVdLAYo0+w@L~+3M~fk35Q%r#LRpDk*6H)-UsybjYzC z{rLMh#kjNim6C%LZ@7)JgqsxX{HCCIHOD_&tfaVaU;`+m%hF-^ajLh)FvW}l?xJ>z z%@J|?zaFJ%4_srmBS#1S=Rg0bGAP*8f+UI>_PwtTty``$$66;)QO=6OF03=&I$sUB zg-F=dtA>7TGGicLgYX-745QaHco4$(-^tM;ZE(ituT+Dch5m3ydo5xoG>uQ{HMqL; z;nymG7Ab3$aSd`Uto9n}{8|Xi7Pn>J-K0j1vbODIG(n-&d13An!E1+xPqmi`4D||| zAWs7E(3r?AmjHW)a=I4?##fhxwOJF4WKUU^)$UDcZoG%HGw8 zS`8zt!qQ}dVkHZhAlOJJniBLr^fQtpU}+YX5{Q<8s^PR;2*D%vtRfJ`SQ@J(_y?>= BK