Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding prototype unsupervised contrastive loss function with demos #521

Closed
wants to merge 106 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
bb502bf
new exp
Nov 7, 2020
8e18831
cifar code
Nov 11, 2020
f5a4733
pickle file
Nov 13, 2020
cd5c09f
res
Nov 13, 2020
19fda63
res
Nov 13, 2020
c9f84e8
res
Nov 13, 2020
dd2816b
res
Nov 20, 2020
beedbdf
fig update
jdey4 Nov 22, 2020
a2ea682
parity plot
jdey4 Nov 24, 2020
c2cca17
res
Nov 24, 2020
4000112
res
Nov 24, 2020
99cb5f6
parity plot
jdey4 Nov 24, 2020
2717527
label shuffle res
Nov 25, 2020
4ed0878
Merge branch 'final_draft_fig' of https://github.com/neurodata/ProgLe…
Nov 25, 2020
e2872c8
run ready rotated cifar
jdey4 Dec 4, 2020
b8477a6
rotated cifar res
Dec 4, 2020
01d727b
rotated cifar res
Dec 4, 2020
dbde8df
rotation res
Dec 5, 2020
159ee02
res
Dec 6, 2020
cb95dde
plot
Dec 7, 2020
5020dde
plot
jdey4 Dec 11, 2020
bdd7098
time mem
jdey4 Dec 22, 2020
ad8b7b4
time space res
Dec 23, 2020
eceb4e5
time space res
jdey4 Dec 24, 2020
656061e
plot
jdey4 Dec 24, 2020
83371f6
plot
jdey4 Dec 24, 2020
5e1ec8d
plot edit
jdey4 Dec 25, 2020
a8701b9
jovo exp
jdey4 Jan 4, 2021
aba66ad
chnaged source to avoid voter counting
jdey4 Jan 8, 2021
ba3879b
uf dnn mem time res
jdey4 Jan 8, 2021
ea5b1d3
new fig
jdey4 Jan 10, 2021
3c7ad60
new fig
jdey4 Jan 10, 2021
ff77ac4
new fig
jdey4 Jan 10, 2021
9db2c3b
new fig
jdey4 Jan 10, 2021
aa14a1e
new fig
jdey4 Jan 10, 2021
8310aff
new time mem fit
jdey4 Jan 10, 2021
49d6ed5
new time mem fit
jdey4 Jan 11, 2021
d8c6a2e
new time mem fit
jdey4 Jan 11, 2021
f45067d
new time mem fit
jdey4 Jan 11, 2021
76ee5f0
new time mem fit
jdey4 Jan 11, 2021
3d8837f
same machine res
Jan 12, 2021
c4682a7
unnormalized scaling fig
jdey4 Jan 12, 2021
494dae7
unnormalized scaling fig
jdey4 Jan 12, 2021
3522802
fig edit
jdey4 Jan 13, 2021
9fae3a2
fig edit
jdey4 Jan 13, 2021
66da810
gpu run
jdey4 Jan 15, 2021
435d329
gpu res
Jan 15, 2021
194c477
fig
jdey4 Jan 15, 2021
be3d3c4
new time plot
jdey4 Jan 18, 2021
626fdd9
new time plot
jdey4 Jan 18, 2021
88bf4e3
random class experiment
Jan 19, 2021
9cd744f
new 5000 sample res
Jan 20, 2021
0f5ddce
edited spiral plot
jdey4 Jan 20, 2021
d20d049
new timing plot
jdey4 Jan 22, 2021
ada3047
new timing plot
jdey4 Jan 22, 2021
d8448c9
gido plot
jdey4 Jan 22, 2021
f47049e
gido plot
jdey4 Jan 22, 2021
70be01e
label shuffle run
jdey4 Jan 25, 2021
b55409f
Merge branch 'final_draft_fig' of https://github.com/neurodata/ProgLe…
Jan 25, 2021
97d67ae
code edit
Jan 25, 2021
d49d50f
revert back to progressive_learner code
jdey4 Jan 25, 2021
3557af3
fixed label shuffle code
jdey4 Jan 26, 2021
81300f4
plf res
jdey4 Jan 26, 2021
bc3d6ab
dnn label shuffle res
Jan 27, 2021
17ad741
ewc time fit
jdey4 Feb 1, 2021
8403b16
ewc time fit
jdey4 Feb 1, 2021
9b7a95f
log parity fig
jdey4 Feb 9, 2021
826d5e8
log parity fig
jdey4 Feb 9, 2021
1a4d8fc
fig edit
jdey4 Feb 9, 2021
6c5580f
Merge branch 'final_draft_fig' of https://github.com/neurodata/ProgLe…
Feb 9, 2021
d2ee212
new xor nxor res
Feb 9, 2021
804a5bc
new xor rxor res
Feb 9, 2021
7d89bdc
spiral res
Feb 9, 2021
d91ec1a
run ready
jdey4 Mar 23, 2021
f0cbd29
parity nn exp
jdey4 Mar 24, 2021
78ae82c
res with more reps
Mar 25, 2021
9c5107b
res with more reps
Mar 26, 2021
3eb5e66
res with more reps
Mar 28, 2021
73ac9f3
res with more reps
Mar 29, 2021
2a49f4e
nn res
jdey4 Mar 30, 2021
14f49ca
corrected parity plot
jdey4 Apr 2, 2021
96b04a6
changed fig plot
jdey4 Apr 7, 2021
08d0e8c
supcon Adam baseline
Dante-Basile Nov 3, 2021
1667c21
fixed typos, added supcon
Dante-Basile Nov 4, 2021
7b779c2
modified loss
Dante-Basile Nov 9, 2021
3d81843
only one slot fold iter?
Dante-Basile Nov 17, 2021
faeb0b2
nb demo unsupcon
Dante-Basile Nov 17, 2021
5b76b06
tested aug seq
Dante-Basile Nov 18, 2021
26478a5
started unsupcon starter code
Dante-Basile Nov 18, 2021
a994867
updated nb
Dante-Basile Nov 18, 2021
f0e0153
demo sim, contrastive_loss
Dante-Basile Nov 19, 2021
57c65b4
tested out preprocessing for resnet50
Dante-Basile Dec 2, 2021
a30cf4b
compare preprocessing for resnet50
Dante-Basile Dec 2, 2021
8d86dfc
changed contrastive_loss and sim, contrastive resnet training started
Dante-Basile Dec 9, 2021
35d512e
unsupcon_learning finished
Dante-Basile Dec 10, 2021
dd3e77a
loss of aug
Dante-Basile Dec 10, 2021
6dfa7ff
train draft
Dante-Basile Dec 10, 2021
2c457c6
train saves
Dante-Basile Dec 10, 2021
1262782
good nb
Dante-Basile Dec 10, 2021
460ed43
fixed aug
Dante-Basile Dec 10, 2021
ac47aea
whole batch, last res
Dante-Basile Dec 10, 2021
11ac8a9
good, optim tuning next
Dante-Basile Dec 10, 2021
dd1abd1
res updated
Dante-Basile Dec 10, 2021
a453df5
before bbox rand crop
Dante-Basile Dec 11, 2021
b3e0779
proj head
Dante-Basile Dec 12, 2021
4e55d6e
proj head tested, issue titled
Dante-Basile Dec 12, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -135,4 +135,4 @@ dmypy.json
.DS_Store

#pickle
*.pickle
#*.pickle
107 changes: 88 additions & 19 deletions benchmarks/cifar_exp/fte_bte_exp.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#%%
import random
import matplotlib.pyplot as plt
import tensorflow as tf
import keras
from keras import layers
Expand All @@ -16,6 +15,8 @@
from joblib import Parallel, delayed
from multiprocessing import Pool

from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
from proglearn.progressive_learner import ProgressiveLearner
from proglearn.deciders import SimpleArgmaxAverage
from proglearn.transformers import NeuralClassificationTransformer, TreeClassificationTransformer
Expand All @@ -24,13 +25,33 @@
import tensorflow as tf

import time

import sys
#%%
def unpickle(file):
with open(file, 'rb') as fo:
dict = pickle.load(fo, encoding='bytes')
return dict

def get_size(obj, seen=None):
"""Recursively finds size of objects"""
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
# Important mark as seen *before* entering recursion to gracefully handle
# self-referential objects
seen.add(obj_id)
if isinstance(obj, dict):
size += sum([get_size(v, seen) for v in obj.values()])
size += sum([get_size(k, seen) for k in obj.keys()])
elif hasattr(obj, '__dict__'):
size += get_size(obj.__dict__, seen)
'''elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
size += sum([get_size(i, seen) for i in obj])'''
return size

#%%
def LF_experiment(train_x, train_y, test_x, test_y, ntrees, shift, slot, model, num_points_per_task, acorn=None):

Expand All @@ -43,6 +64,8 @@ def LF_experiment(train_x, train_y, test_x, test_y, ntrees, shift, slot, model,
train_times_across_tasks = []
single_task_inference_times_across_tasks = []
multitask_inference_times_across_tasks = []
time_info = []
mem_info = []

if model == "dnn":
default_transformer_class = NeuralClassificationTransformer
Expand All @@ -66,12 +89,19 @@ def LF_experiment(train_x, train_y, test_x, test_y, ntrees, shift, slot, model,
network.add(layers.BatchNormalization())
network.add(layers.Dense(units=10, activation = 'softmax'))

default_transformer_kwargs = {"network" : network,
"euclidean_layer_idx" : -2,
"num_classes" : 10,
"optimizer" : keras.optimizers.Adam(3e-4)
}

default_transformer_kwargs = {
"network": network,
"euclidean_layer_idx": -2,
"loss": "categorical_crossentropy",
"optimizer": Adam(3e-4),
"fit_kwargs": {
"epochs": 100,
"callbacks": [EarlyStopping(patience=5, monitor="val_loss")],
"verbose": False,
"validation_split": 0.33,
"batch_size": 32,
},
}
default_voter_class = KNNClassificationVoter
default_voter_kwargs = {"k" : int(np.log2(num_points_per_task))}

Expand All @@ -94,28 +124,50 @@ def LF_experiment(train_x, train_y, test_x, test_y, ntrees, shift, slot, model,

for task_ii in range(10):
print("Starting Task {} For Fold {}".format(task_ii, shift))


train_start_time = time.time()

if acorn is not None:
np.random.seed(acorn)

train_start_time = time.time()
progressive_learner.add_task(
X = train_x[task_ii*5000+slot*num_points_per_task:task_ii*5000+(slot+1)*num_points_per_task],
y = train_y[task_ii*5000+slot*num_points_per_task:task_ii*5000+(slot+1)*num_points_per_task],
num_transformers = 1 if model == "dnn" else ntrees,
transformer_voter_decider_split = [0.67, 0.33, 0],
transformer_voter_decider_split = [0.63, 0.37, 0],
decider_kwargs = {"classes" : np.unique(train_y[task_ii*5000+slot*num_points_per_task:task_ii*5000+(slot+1)*num_points_per_task])}
)
train_end_time = time.time()

single_learner = ProgressiveLearner(default_transformer_class = default_transformer_class,
default_transformer_kwargs = default_transformer_kwargs,
default_voter_class = default_voter_class,
default_voter_kwargs = default_voter_kwargs,
default_decider_class = default_decider_class)

if acorn is not None:
np.random.seed(acorn)

single_learner.add_task(
X = train_x[task_ii*5000+slot*num_points_per_task:task_ii*5000+(slot+1)*num_points_per_task],
y = train_y[task_ii*5000+slot*num_points_per_task:task_ii*5000+(slot+1)*num_points_per_task],
num_transformers = 1 if model == "dnn" else (task_ii+1)*ntrees,
transformer_voter_decider_split = [0.67, 0.33, 0],
decider_kwargs = {"classes" : np.unique(train_y[task_ii*5000+slot*num_points_per_task:task_ii*5000+(slot+1)*num_points_per_task])}
)

time_info.append(train_end_time - train_start_time)
mem_info.append(get_size(progressive_learner))
train_times_across_tasks.append(train_end_time - train_start_time)

single_task_inference_start_time = time.time()
llf_task=progressive_learner.predict(
X = test_x[task_ii*1000:(task_ii+1)*1000,:], transformer_ids=[task_ii], task_id=task_ii
single_task=single_learner.predict(
X = test_x[task_ii*1000:(task_ii+1)*1000,:], transformer_ids=[0], task_id=0
)
single_task_inference_end_time = time.time()
single_task_accuracies[task_ii] = np.mean(
llf_task == test_y[task_ii*1000:(task_ii+1)*1000]
single_task == test_y[task_ii*1000:(task_ii+1)*1000]
)
single_task_inference_times_across_tasks.append(single_task_inference_end_time - single_task_inference_start_time)

Expand Down Expand Up @@ -149,11 +201,20 @@ def LF_experiment(train_x, train_y, test_x, test_y, ntrees, shift, slot, model,
df_single_task['single_task_inference_times'] = single_task_inference_times_across_tasks
df_single_task['train_times'] = train_times_across_tasks

#print(df)
summary = (df,df_single_task)
file_to_save = 'result/result/'+model+str(ntrees)+'_'+str(shift)+'_'+str(slot)+'.pickle'
file_to_save = 'result/result/'+model+str(ntrees)+'_'+str(shift)+'.pickle'
with open(file_to_save, 'wb') as f:
pickle.dump(summary, f)

'''file_to_save = 'result/time_res/'+model+str(ntrees)+'_'+str(shift)+'_'+str(slot)+'.pickle'
with open(file_to_save, 'wb') as f:
pickle.dump(time_info, f)

file_to_save = 'result/mem_res/'+model+str(ntrees)+'_'+str(shift)+'_'+str(slot)+'.pickle'
with open(file_to_save, 'wb') as f:
pickle.dump(mem_info, f)'''

#%%
def cross_val_data(data_x, data_y, num_points_per_task, total_task=10, shift=1):
x = data_x.copy()
Expand Down Expand Up @@ -187,9 +248,9 @@ def run_parallel_exp(data_x, data_y, n_trees, model, num_points_per_task, slot=0
train_x, train_y, test_x, test_y = cross_val_data(data_x, data_y, num_points_per_task, shift=shift)

if model == "dnn":
config = tf.ConfigProto()
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
sess = tf.compat.v1.Session(config=config)
with tf.device('/gpu:'+str(shift % 4)):
LF_experiment(train_x, train_y, test_x, test_y, n_trees, shift, slot, model, num_points_per_task, acorn=12345)
else:
Expand All @@ -198,7 +259,7 @@ def run_parallel_exp(data_x, data_y, n_trees, model, num_points_per_task, slot=0
#%%
### MAIN HYPERPARAMS ###
model = "uf"
num_points_per_task = 500
num_points_per_task = 5000
########################

(X_train, y_train), (X_test, y_test) = keras.datasets.cifar100.load_data()
Expand All @@ -211,7 +272,7 @@ def run_parallel_exp(data_x, data_y, n_trees, model, num_points_per_task, slot=0

#%%
if model == "uf":
slot_fold = range(10)
slot_fold = range(1)
shift_fold = range(1,7,1)
n_trees=[10]
iterable = product(n_trees,shift_fold,slot_fold)
Expand Down Expand Up @@ -239,4 +300,12 @@ def perform_shift(shift_slot_tuple):
with Pool(4) as p:
p.map(perform_shift, stage_2_iterable)

# %%
'''slot_fold = range(1)
shift_fold = [1,2,3,4,5,6]
n_trees=[0]
iterable = product(n_trees,shift_fold,slot_fold)

for ntree,shift,slot in iterable:
run_parallel_exp(
data_x, data_y, ntree, model, num_points_per_task, slot=slot, shift=shift
)'''
Loading