From b935d9ca34399154d75bd42cb73e56792ebdfdc8 Mon Sep 17 00:00:00 2001 From: Kaushik Narayan R Date: Fri, 13 Oct 2023 11:22:53 -0700 Subject: [PATCH] WiP refactoring niraj's task 4, some bugfixes --- Phase 2/requirements.txt | 3 +- Phase 2/task_4.ipynb | 52 ++++++++++ Phase 2/task_5.ipynb | 207 ++++++++++++++++++++------------------- Phase 2/utils.py | 51 ++++++---- 4 files changed, 193 insertions(+), 120 deletions(-) create mode 100644 Phase 2/task_4.ipynb diff --git a/Phase 2/requirements.txt b/Phase 2/requirements.txt index b5028b3..5fd9fe0 100644 --- a/Phase 2/requirements.txt +++ b/Phase 2/requirements.txt @@ -10,4 +10,5 @@ pymongo[srv] ipython notebook ipykernel -python-dotenv \ No newline at end of file +python-dotenv +tensorly diff --git a/Phase 2/task_4.ipynb b/Phase 2/task_4.ipynb new file mode 100644 index 0000000..0b18f47 --- /dev/null +++ b/Phase 2/task_4.ipynb @@ -0,0 +1,52 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from utils import *\n", + "warnings.filterwarnings('ignore')\n", + "%matplotlib inline\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "fd_collection = getCollection(\"team_5_mwdb_phase_2\", \"fd_collection\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Phase 2/task_5.ipynb b/Phase 2/task_5.ipynb index 67948f1..4f24096 100644 --- a/Phase 2/task_5.ipynb +++ b/Phase 2/task_5.ipynb @@ -22,124 +22,127 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Applying svd on the given similarity matrix to get 10 latent semantics (showing only top 10 label-weight pairs for each latent semantic)...\n", + "Applying kmeans on the given similarity matrix to get 10 latent semantics (showing only top 10 label-weight pairs for each latent semantic)...\n", + "Initialized centroids\n", + "Iteration 6 - Converged\n", + "Note: for K-Means we display distances, in ascending order\n", "Latent semantic no. 0\n", - "label\t28\t-\tWeight\t0.2583354411312026\n", - "label\t29\t-\tWeight\t0.2301362547676974\n", - "label\t33\t-\tWeight\t0.2129183683279978\n", - "label\t9\t-\tWeight\t0.17625685452423093\n", - "label\t95\t-\tWeight\t0.16277551497836534\n", - "label\t47\t-\tWeight\t0.1424860388015467\n", - "label\t39\t-\tWeight\t0.1349747704005884\n", - "label\t30\t-\tWeight\t0.13251434767496492\n", - "label\t52\t-\tWeight\t0.12669069496270755\n", - "label\t8\t-\tWeight\t0.1257730807471899\n", + "label\t92\t-\tDistance\t3.230292112512146\n", + "label\t4\t-\tDistance\t3.5335656340201087\n", + "label\t2\t-\tDistance\t4.905027845590568\n", + "label\t69\t-\tDistance\t4.993399423965622\n", + "label\t65\t-\tDistance\t6.275170101152081\n", + "label\t21\t-\tDistance\t6.792963383606834\n", + "label\t95\t-\tDistance\t9.460863854781731\n", + "label\t60\t-\tDistance\t10.659440914917885\n", + "label\t82\t-\tDistance\t14.23961431596092\n", + "label\t51\t-\tDistance\t14.308250416010853\n", "Latent semantic no. 1\n", - "label\t96\t-\tWeight\t0.2666765976054894\n", - "label\t97\t-\tWeight\t0.19087869496500426\n", - "label\t25\t-\tWeight\t0.17776094778851348\n", - "label\t3\t-\tWeight\t0.1759798805642099\n", - "label\t98\t-\tWeight\t0.16951497899752574\n", - "label\t22\t-\tWeight\t0.1667032655640346\n", - "label\t24\t-\tWeight\t0.16034180060184824\n", - "label\t19\t-\tWeight\t0.15345532912389587\n", - "label\t52\t-\tWeight\t0.13271640119612757\n", - "label\t29\t-\tWeight\t0.12856388746021633\n", + "label\t47\t-\tDistance\t1.7917105751649582\n", + "label\t42\t-\tDistance\t1.8293437639389183\n", + "label\t35\t-\tDistance\t2.47989550940933\n", + "label\t29\t-\tDistance\t2.4870731532031694\n", + "label\t33\t-\tDistance\t3.0078415187323975\n", + "label\t49\t-\tDistance\t3.1694527370940753\n", + "label\t54\t-\tDistance\t3.1764161450515775\n", + "label\t28\t-\tDistance\t3.520891544025031\n", + "label\t19\t-\tDistance\t3.752147129401601\n", + "label\t82\t-\tDistance\t3.9820650145644705\n", "Latent semantic no. 2\n", - "label\t46\t-\tWeight\t0.21813474254675366\n", - "label\t79\t-\tWeight\t0.19091788352587957\n", - "label\t55\t-\tWeight\t0.1871080482210247\n", - "label\t56\t-\tWeight\t0.18322792605578184\n", - "label\t78\t-\tWeight\t0.17506936966351683\n", - "label\t98\t-\tWeight\t0.1733164832137484\n", - "label\t22\t-\tWeight\t0.17114312653027375\n", - "label\t38\t-\tWeight\t0.16928636840289424\n", - "label\t45\t-\tWeight\t0.1567042877228484\n", - "label\t4\t-\tWeight\t0.15108693899889344\n", + "label\t91\t-\tDistance\t2.7653145272024493\n", + "label\t14\t-\tDistance\t3.829858168383929\n", + "label\t93\t-\tDistance\t4.108580770102051\n", + "label\t48\t-\tDistance\t4.25643528657963\n", + "label\t85\t-\tDistance\t4.308356278561495\n", + "label\t17\t-\tDistance\t4.72066235395654\n", + "label\t52\t-\tDistance\t4.733719921198274\n", + "label\t43\t-\tDistance\t5.593133775346241\n", + "label\t75\t-\tDistance\t6.35213810417939\n", + "label\t83\t-\tDistance\t6.365421291009637\n", "Latent semantic no. 3\n", - "label\t96\t-\tWeight\t0.2736613529052896\n", - "label\t98\t-\tWeight\t0.218185914155306\n", - "label\t22\t-\tWeight\t0.1963451355822489\n", - "label\t3\t-\tWeight\t0.17627732148468614\n", - "label\t39\t-\tWeight\t0.1728992502839298\n", - "label\t52\t-\tWeight\t0.15597562436756945\n", - "label\t51\t-\tWeight\t0.1291470561734402\n", - "label\t30\t-\tWeight\t0.12453129554714541\n", - "label\t18\t-\tWeight\t0.1236867360720947\n", - "label\t38\t-\tWeight\t0.12184856229773917\n", + "label\t63\t-\tDistance\t3.0750924250527425\n", + "label\t98\t-\tDistance\t3.256907164618595\n", + "label\t59\t-\tDistance\t3.36740335111714\n", + "label\t32\t-\tDistance\t3.4369727667587036\n", + "label\t84\t-\tDistance\t4.042695694344645\n", + "label\t79\t-\tDistance\t4.051227266452548\n", + "label\t94\t-\tDistance\t4.535286748567164\n", + "label\t75\t-\tDistance\t4.567193344282598\n", + "label\t11\t-\tDistance\t4.856460310962189\n", + "label\t55\t-\tDistance\t5.036016117772108\n", "Latent semantic no. 4\n", - "label\t6\t-\tWeight\t0.23875690719216863\n", - "label\t67\t-\tWeight\t0.21007869938490106\n", - "label\t63\t-\tWeight\t0.18822840034389135\n", - "label\t14\t-\tWeight\t0.18738002200878218\n", - "label\t87\t-\tWeight\t0.17508576062247283\n", - "label\t23\t-\tWeight\t0.167492867766091\n", - "label\t15\t-\tWeight\t0.15522709562173342\n", - "label\t61\t-\tWeight\t0.13244353806854162\n", - "label\t45\t-\tWeight\t0.12833204093005665\n", - "label\t68\t-\tWeight\t0.12622315521729294\n", + "label\t80\t-\tDistance\t4.403201299886196\n", + "label\t99\t-\tDistance\t4.731021526243766\n", + "label\t3\t-\tDistance\t4.807090489912411\n", + "label\t48\t-\tDistance\t8.911953449338059\n", + "label\t85\t-\tDistance\t9.334554754293974\n", + "label\t52\t-\tDistance\t11.390353342613288\n", + "label\t43\t-\tDistance\t12.033766054009595\n", + "label\t91\t-\tDistance\t12.446673116679838\n", + "label\t14\t-\tDistance\t12.717196488491759\n", + "label\t83\t-\tDistance\t13.5754060440636\n", "Latent semantic no. 5\n", - "label\t30\t-\tWeight\t0.17385975982344382\n", - "label\t25\t-\tWeight\t0.14655711054814133\n", - "label\t39\t-\tWeight\t0.13307896633493813\n", - "label\t68\t-\tWeight\t0.12851498788897622\n", - "label\t24\t-\tWeight\t0.12828250585375986\n", - "label\t0\t-\tWeight\t0.12500243174429157\n", - "label\t1\t-\tWeight\t0.12371257574727512\n", - "label\t77\t-\tWeight\t0.12370279647800499\n", - "label\t89\t-\tWeight\t0.12233344688386875\n", - "label\t83\t-\tWeight\t0.11445596984835589\n", + "label\t77\t-\tDistance\t2.144778050426236\n", + "label\t45\t-\tDistance\t2.3391902699042175\n", + "label\t73\t-\tDistance\t2.5586280095180554\n", + "label\t22\t-\tDistance\t2.833603911721891\n", + "label\t57\t-\tDistance\t2.9256965790964955\n", + "label\t50\t-\tDistance\t3.216841848641699\n", + "label\t74\t-\tDistance\t3.2964675276683377\n", + "label\t38\t-\tDistance\t3.3501016749777297\n", + "label\t72\t-\tDistance\t3.461208008080578\n", + "label\t34\t-\tDistance\t3.8970766980234073\n", "Latent semantic no. 6\n", - "label\t17\t-\tWeight\t0.2335282879255542\n", - "label\t48\t-\tWeight\t0.19418795795666355\n", - "label\t21\t-\tWeight\t0.19013440200231033\n", - "label\t85\t-\tWeight\t0.17503295059460947\n", - "label\t11\t-\tWeight\t0.14933372636956993\n", - "label\t1\t-\tWeight\t0.1384254243377172\n", - "label\t0\t-\tWeight\t0.13078647401074162\n", - "label\t57\t-\tWeight\t0.11374248801163754\n", - "label\t10\t-\tWeight\t0.10468223841103744\n", - "label\t99\t-\tWeight\t0.10191451131216464\n", + "label\t78\t-\tDistance\t1.772794735295686\n", + "label\t6\t-\tDistance\t1.9243189269571448\n", + "label\t67\t-\tDistance\t2.0159218514234905\n", + "label\t23\t-\tDistance\t2.0402136200750687\n", + "label\t7\t-\tDistance\t2.1597363741525943\n", + "label\t15\t-\tDistance\t2.2890961861911463\n", + "label\t86\t-\tDistance\t2.418355035843437\n", + "label\t39\t-\tDistance\t2.431493894783776\n", + "label\t20\t-\tDistance\t2.4339361855736694\n", + "label\t61\t-\tDistance\t2.4663666328704577\n", "Latent semantic no. 7\n", - "label\t82\t-\tWeight\t0.23372455436757703\n", - "label\t95\t-\tWeight\t0.21795238756371887\n", - "label\t60\t-\tWeight\t0.18080422229063045\n", - "label\t16\t-\tWeight\t0.1806105172209771\n", - "label\t27\t-\tWeight\t0.17365150902149876\n", - "label\t59\t-\tWeight\t0.17250044548228938\n", - "label\t26\t-\tWeight\t0.1661853291143862\n", - "label\t13\t-\tWeight\t0.16331211225170805\n", - "label\t34\t-\tWeight\t0.1523080193090529\n", - "label\t67\t-\tWeight\t0.13577900574984025\n", + "label\t36\t-\tDistance\t2.148560462001178\n", + "label\t10\t-\tDistance\t2.336732460490279\n", + "label\t76\t-\tDistance\t2.410558517560451\n", + "label\t9\t-\tDistance\t2.4853810228702433\n", + "label\t44\t-\tDistance\t2.822322732248757\n", + "label\t16\t-\tDistance\t2.8525379488476954\n", + "label\t19\t-\tDistance\t2.887333058828606\n", + "label\t41\t-\tDistance\t3.2609266747980072\n", + "label\t0\t-\tDistance\t3.4462772872176073\n", + "label\t8\t-\tDistance\t3.4492972662700305\n", "Latent semantic no. 8\n", - "label\t53\t-\tWeight\t0.2259481751468642\n", - "label\t37\t-\tWeight\t0.21583443408756542\n", - "label\t76\t-\tWeight\t0.20483376297311964\n", - "label\t44\t-\tWeight\t0.1690198227623472\n", - "label\t68\t-\tWeight\t0.1650723880318989\n", - "label\t28\t-\tWeight\t0.15689929414378492\n", - "label\t14\t-\tWeight\t0.1564371673909956\n", - "label\t54\t-\tWeight\t0.1553627917623035\n", - "label\t51\t-\tWeight\t0.14380435363337046\n", - "label\t36\t-\tWeight\t0.13510425005259438\n", + "label\t60\t-\tDistance\t3.2878466679861047\n", + "label\t66\t-\tDistance\t3.8429959542446595\n", + "label\t95\t-\tDistance\t4.407501055402251\n", + "label\t51\t-\tDistance\t4.675169110980285\n", + "label\t82\t-\tDistance\t4.930711123344968\n", + "label\t1\t-\tDistance\t5.746326956457264\n", + "label\t42\t-\tDistance\t5.932080034810729\n", + "label\t29\t-\tDistance\t5.934164464898548\n", + "label\t47\t-\tDistance\t6.3479330191887025\n", + "label\t35\t-\tDistance\t6.422013021100036\n", "Latent semantic no. 9\n", - "label\t19\t-\tWeight\t0.11741024839079275\n", - "label\t40\t-\tWeight\t0.11107319334138463\n", - "label\t53\t-\tWeight\t0.11058750626248925\n", - "label\t51\t-\tWeight\t0.10794606425819818\n", - "label\t96\t-\tWeight\t0.10735468567860716\n", - "label\t55\t-\tWeight\t0.10731282010915796\n", - "label\t50\t-\tWeight\t0.10703093662670059\n", - "label\t1\t-\tWeight\t0.10651036503732043\n", - "label\t79\t-\tWeight\t0.10640855392103846\n", - "label\t47\t-\tWeight\t0.10594110421348357\n" + "label\t83\t-\tDistance\t5.036696108166727\n", + "label\t100\t-\tDistance\t5.163440732380748\n", + "label\t43\t-\tDistance\t5.447889420797845\n", + "label\t88\t-\tDistance\t6.470159759945887\n", + "label\t64\t-\tDistance\t6.8077571085247355\n", + "label\t17\t-\tDistance\t7.350448996699054\n", + "label\t55\t-\tDistance\t7.555979165305925\n", + "label\t11\t-\tDistance\t7.84770773092541\n", + "label\t91\t-\tDistance\t7.869761874577601\n", + "label\t75\t-\tDistance\t7.997112142085329\n" ] } ], diff --git a/Phase 2/utils.py b/Phase 2/utils.py index dff3ede..8f20b4a 100644 --- a/Phase 2/utils.py +++ b/Phase 2/utils.py @@ -18,6 +18,8 @@ import torchvision.transforms as transforms from torchvision.datasets import Caltech101 from torchvision.models import resnet50, ResNet50_Weights +import tensorly as tl + # OS and env import json from os import getenv @@ -58,6 +60,8 @@ def loadDataset(dataset): dataset = loadDataset(Caltech101) +NUM_LABELS = 101 +NUM_IMAGES = 4339 class GridPartition: @@ -998,7 +1002,7 @@ def extract_latent_semantics_from_sim_matrix( "semantic-feature": V_T.tolist(), } - # for each latent semantic, sort imageID-weight pairs by weights in descending order + # for each latent semantic, sort object-weight pairs by weights in descending order displayed_latent_semantics = [ sorted( list(zip(feature_ids, latent_semantic)), @@ -1033,7 +1037,7 @@ def extract_latent_semantics_from_sim_matrix( "semantic-feature": H.tolist(), } - # for each latent semantic, sort imageID-weight pairs by weights in descending order + # for each latent semantic, sort object-weight pairs by weights in descending order displayed_latent_semantics = [ sorted( list(zip(feature_ids, latent_semantic)), @@ -1066,7 +1070,7 @@ def extract_latent_semantics_from_sim_matrix( "semantic-feature": K.tolist(), } - # for each latent semantic, sort imageID-weight pairs by weights in descending order + # for each latent semantic, sort object-weight pairs by weights in descending order displayed_latent_semantics = [ sorted( list(zip(feature_ids, latent_semantic)), @@ -1084,10 +1088,10 @@ def extract_latent_semantics_from_sim_matrix( all_latent_semantics = { "image-semantic": Y.tolist(), - "semantic-feature": list(CC.values()), + "semantic-feature": CC.tolist(), } - # for each latent semantic, sort imageID-weight pairs by weights in descending order + # for each latent semantic, sort object-weight pairs by weights in ascending order displayed_latent_semantics = [ sorted( list(zip(feature_ids, latent_semantic)), @@ -1096,9 +1100,8 @@ def extract_latent_semantics_from_sim_matrix( )[:top_images] for latent_semantic in Y.T ] + print("Note: for K-Means we display distances, in ascending order") - if valid_dim_reduction_methods[dim_reduction_method] == 4: - print("Note: for K-Means we display distances, in ascending order") for idx, latent_semantic in enumerate(displayed_latent_semantics): print(f"Latent semantic no. {idx}") for obj_id, weight in latent_semantic: @@ -1129,19 +1132,17 @@ def find_label_label_similarity(fd_collection, feature_model): label_sim_matrix = [] label_mean_vectors = [] - num_labels = 101 - - for label in range(num_labels): + for label in range(NUM_LABELS): # get representative vectors for the label label_mean_vectors.append( calculate_label_representatives(fd_collection, label, feature_model) ) - label_sim_matrix = np.zeros((num_labels, num_labels)) + label_sim_matrix = np.zeros((NUM_LABELS, NUM_LABELS)) # Calculate half and fill the other - for i in range(num_labels): - for j in range(i + 1, num_labels): + for i in range(NUM_LABELS): + for j in range(i + 1, NUM_LABELS): # Note: lower the value, lower the distance => higher the similarity label_sim_matrix[i][j] = label_sim_matrix[j][i] = feature_distance_matches[ feature_model @@ -1163,14 +1164,30 @@ def find_image_image_similarity(fd_collection, feature_model): ).flatten() # get the specific feature model's feature vector for img_fds in fd_collection.find() # repeat for all images ] - num_images = len(feature_vectors) - image_sim_matrix = np.zeros((num_images, num_images)) + image_sim_matrix = np.zeros((NUM_IMAGES, NUM_IMAGES)) # Calculate half and fill the other - for i in range(num_images): - for j in range(i + 1, num_images): + for i in range(NUM_IMAGES): + for j in range(i + 1, NUM_IMAGES): # Note: lower the value, lower the distance => higher the similarity image_sim_matrix[i][j] = image_sim_matrix[j][i] = feature_distance_matches[ feature_model ](np.array(feature_vectors[i]), np.array(feature_vectors[j])) return image_sim_matrix + +def compute_cp_decomposition(fd_collection, feature_model, rank): + assert ( + feature_model in valid_feature_models.values() + ), "feature_model should be one of " + str(list(valid_feature_models.keys())) + + all_images = list(fd_collection.find()) + + # (images, features, labels) + data_tensor_shape = (NUM_IMAGES, len(all_images[0][feature_model]), NUM_LABELS) + data_tensor = np.zeros(data_tensor_shape) + for id in range(NUM_IMAGES): + label = all_images[id]["true_label"] + data_tensor[id, :, label] = all_images[id][feature_model] + + weights_tensor, factor_matrices = tl.decomposition.parafac(data_tensor, rank=rank, normalize_factors=True) + return weights_tensor, factor_matrices