WiP refactoring niraj's task 4, some bugfixes

This commit is contained in:
Kaushik Narayan R 2023-10-13 11:22:53 -07:00
parent e92e324065
commit b935d9ca34
4 changed files with 193 additions and 120 deletions

View File

@ -10,4 +10,5 @@ pymongo[srv]
ipython ipython
notebook notebook
ipykernel ipykernel
python-dotenv python-dotenv
tensorly

52
Phase 2/task_4.ipynb Normal file
View File

@ -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
}

View File

@ -22,124 +22,127 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "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", "Latent semantic no. 0\n",
"label\t28\t-\tWeight\t0.2583354411312026\n", "label\t92\t-\tDistance\t3.230292112512146\n",
"label\t29\t-\tWeight\t0.2301362547676974\n", "label\t4\t-\tDistance\t3.5335656340201087\n",
"label\t33\t-\tWeight\t0.2129183683279978\n", "label\t2\t-\tDistance\t4.905027845590568\n",
"label\t9\t-\tWeight\t0.17625685452423093\n", "label\t69\t-\tDistance\t4.993399423965622\n",
"label\t95\t-\tWeight\t0.16277551497836534\n", "label\t65\t-\tDistance\t6.275170101152081\n",
"label\t47\t-\tWeight\t0.1424860388015467\n", "label\t21\t-\tDistance\t6.792963383606834\n",
"label\t39\t-\tWeight\t0.1349747704005884\n", "label\t95\t-\tDistance\t9.460863854781731\n",
"label\t30\t-\tWeight\t0.13251434767496492\n", "label\t60\t-\tDistance\t10.659440914917885\n",
"label\t52\t-\tWeight\t0.12669069496270755\n", "label\t82\t-\tDistance\t14.23961431596092\n",
"label\t8\t-\tWeight\t0.1257730807471899\n", "label\t51\t-\tDistance\t14.308250416010853\n",
"Latent semantic no. 1\n", "Latent semantic no. 1\n",
"label\t96\t-\tWeight\t0.2666765976054894\n", "label\t47\t-\tDistance\t1.7917105751649582\n",
"label\t97\t-\tWeight\t0.19087869496500426\n", "label\t42\t-\tDistance\t1.8293437639389183\n",
"label\t25\t-\tWeight\t0.17776094778851348\n", "label\t35\t-\tDistance\t2.47989550940933\n",
"label\t3\t-\tWeight\t0.1759798805642099\n", "label\t29\t-\tDistance\t2.4870731532031694\n",
"label\t98\t-\tWeight\t0.16951497899752574\n", "label\t33\t-\tDistance\t3.0078415187323975\n",
"label\t22\t-\tWeight\t0.1667032655640346\n", "label\t49\t-\tDistance\t3.1694527370940753\n",
"label\t24\t-\tWeight\t0.16034180060184824\n", "label\t54\t-\tDistance\t3.1764161450515775\n",
"label\t19\t-\tWeight\t0.15345532912389587\n", "label\t28\t-\tDistance\t3.520891544025031\n",
"label\t52\t-\tWeight\t0.13271640119612757\n", "label\t19\t-\tDistance\t3.752147129401601\n",
"label\t29\t-\tWeight\t0.12856388746021633\n", "label\t82\t-\tDistance\t3.9820650145644705\n",
"Latent semantic no. 2\n", "Latent semantic no. 2\n",
"label\t46\t-\tWeight\t0.21813474254675366\n", "label\t91\t-\tDistance\t2.7653145272024493\n",
"label\t79\t-\tWeight\t0.19091788352587957\n", "label\t14\t-\tDistance\t3.829858168383929\n",
"label\t55\t-\tWeight\t0.1871080482210247\n", "label\t93\t-\tDistance\t4.108580770102051\n",
"label\t56\t-\tWeight\t0.18322792605578184\n", "label\t48\t-\tDistance\t4.25643528657963\n",
"label\t78\t-\tWeight\t0.17506936966351683\n", "label\t85\t-\tDistance\t4.308356278561495\n",
"label\t98\t-\tWeight\t0.1733164832137484\n", "label\t17\t-\tDistance\t4.72066235395654\n",
"label\t22\t-\tWeight\t0.17114312653027375\n", "label\t52\t-\tDistance\t4.733719921198274\n",
"label\t38\t-\tWeight\t0.16928636840289424\n", "label\t43\t-\tDistance\t5.593133775346241\n",
"label\t45\t-\tWeight\t0.1567042877228484\n", "label\t75\t-\tDistance\t6.35213810417939\n",
"label\t4\t-\tWeight\t0.15108693899889344\n", "label\t83\t-\tDistance\t6.365421291009637\n",
"Latent semantic no. 3\n", "Latent semantic no. 3\n",
"label\t96\t-\tWeight\t0.2736613529052896\n", "label\t63\t-\tDistance\t3.0750924250527425\n",
"label\t98\t-\tWeight\t0.218185914155306\n", "label\t98\t-\tDistance\t3.256907164618595\n",
"label\t22\t-\tWeight\t0.1963451355822489\n", "label\t59\t-\tDistance\t3.36740335111714\n",
"label\t3\t-\tWeight\t0.17627732148468614\n", "label\t32\t-\tDistance\t3.4369727667587036\n",
"label\t39\t-\tWeight\t0.1728992502839298\n", "label\t84\t-\tDistance\t4.042695694344645\n",
"label\t52\t-\tWeight\t0.15597562436756945\n", "label\t79\t-\tDistance\t4.051227266452548\n",
"label\t51\t-\tWeight\t0.1291470561734402\n", "label\t94\t-\tDistance\t4.535286748567164\n",
"label\t30\t-\tWeight\t0.12453129554714541\n", "label\t75\t-\tDistance\t4.567193344282598\n",
"label\t18\t-\tWeight\t0.1236867360720947\n", "label\t11\t-\tDistance\t4.856460310962189\n",
"label\t38\t-\tWeight\t0.12184856229773917\n", "label\t55\t-\tDistance\t5.036016117772108\n",
"Latent semantic no. 4\n", "Latent semantic no. 4\n",
"label\t6\t-\tWeight\t0.23875690719216863\n", "label\t80\t-\tDistance\t4.403201299886196\n",
"label\t67\t-\tWeight\t0.21007869938490106\n", "label\t99\t-\tDistance\t4.731021526243766\n",
"label\t63\t-\tWeight\t0.18822840034389135\n", "label\t3\t-\tDistance\t4.807090489912411\n",
"label\t14\t-\tWeight\t0.18738002200878218\n", "label\t48\t-\tDistance\t8.911953449338059\n",
"label\t87\t-\tWeight\t0.17508576062247283\n", "label\t85\t-\tDistance\t9.334554754293974\n",
"label\t23\t-\tWeight\t0.167492867766091\n", "label\t52\t-\tDistance\t11.390353342613288\n",
"label\t15\t-\tWeight\t0.15522709562173342\n", "label\t43\t-\tDistance\t12.033766054009595\n",
"label\t61\t-\tWeight\t0.13244353806854162\n", "label\t91\t-\tDistance\t12.446673116679838\n",
"label\t45\t-\tWeight\t0.12833204093005665\n", "label\t14\t-\tDistance\t12.717196488491759\n",
"label\t68\t-\tWeight\t0.12622315521729294\n", "label\t83\t-\tDistance\t13.5754060440636\n",
"Latent semantic no. 5\n", "Latent semantic no. 5\n",
"label\t30\t-\tWeight\t0.17385975982344382\n", "label\t77\t-\tDistance\t2.144778050426236\n",
"label\t25\t-\tWeight\t0.14655711054814133\n", "label\t45\t-\tDistance\t2.3391902699042175\n",
"label\t39\t-\tWeight\t0.13307896633493813\n", "label\t73\t-\tDistance\t2.5586280095180554\n",
"label\t68\t-\tWeight\t0.12851498788897622\n", "label\t22\t-\tDistance\t2.833603911721891\n",
"label\t24\t-\tWeight\t0.12828250585375986\n", "label\t57\t-\tDistance\t2.9256965790964955\n",
"label\t0\t-\tWeight\t0.12500243174429157\n", "label\t50\t-\tDistance\t3.216841848641699\n",
"label\t1\t-\tWeight\t0.12371257574727512\n", "label\t74\t-\tDistance\t3.2964675276683377\n",
"label\t77\t-\tWeight\t0.12370279647800499\n", "label\t38\t-\tDistance\t3.3501016749777297\n",
"label\t89\t-\tWeight\t0.12233344688386875\n", "label\t72\t-\tDistance\t3.461208008080578\n",
"label\t83\t-\tWeight\t0.11445596984835589\n", "label\t34\t-\tDistance\t3.8970766980234073\n",
"Latent semantic no. 6\n", "Latent semantic no. 6\n",
"label\t17\t-\tWeight\t0.2335282879255542\n", "label\t78\t-\tDistance\t1.772794735295686\n",
"label\t48\t-\tWeight\t0.19418795795666355\n", "label\t6\t-\tDistance\t1.9243189269571448\n",
"label\t21\t-\tWeight\t0.19013440200231033\n", "label\t67\t-\tDistance\t2.0159218514234905\n",
"label\t85\t-\tWeight\t0.17503295059460947\n", "label\t23\t-\tDistance\t2.0402136200750687\n",
"label\t11\t-\tWeight\t0.14933372636956993\n", "label\t7\t-\tDistance\t2.1597363741525943\n",
"label\t1\t-\tWeight\t0.1384254243377172\n", "label\t15\t-\tDistance\t2.2890961861911463\n",
"label\t0\t-\tWeight\t0.13078647401074162\n", "label\t86\t-\tDistance\t2.418355035843437\n",
"label\t57\t-\tWeight\t0.11374248801163754\n", "label\t39\t-\tDistance\t2.431493894783776\n",
"label\t10\t-\tWeight\t0.10468223841103744\n", "label\t20\t-\tDistance\t2.4339361855736694\n",
"label\t99\t-\tWeight\t0.10191451131216464\n", "label\t61\t-\tDistance\t2.4663666328704577\n",
"Latent semantic no. 7\n", "Latent semantic no. 7\n",
"label\t82\t-\tWeight\t0.23372455436757703\n", "label\t36\t-\tDistance\t2.148560462001178\n",
"label\t95\t-\tWeight\t0.21795238756371887\n", "label\t10\t-\tDistance\t2.336732460490279\n",
"label\t60\t-\tWeight\t0.18080422229063045\n", "label\t76\t-\tDistance\t2.410558517560451\n",
"label\t16\t-\tWeight\t0.1806105172209771\n", "label\t9\t-\tDistance\t2.4853810228702433\n",
"label\t27\t-\tWeight\t0.17365150902149876\n", "label\t44\t-\tDistance\t2.822322732248757\n",
"label\t59\t-\tWeight\t0.17250044548228938\n", "label\t16\t-\tDistance\t2.8525379488476954\n",
"label\t26\t-\tWeight\t0.1661853291143862\n", "label\t19\t-\tDistance\t2.887333058828606\n",
"label\t13\t-\tWeight\t0.16331211225170805\n", "label\t41\t-\tDistance\t3.2609266747980072\n",
"label\t34\t-\tWeight\t0.1523080193090529\n", "label\t0\t-\tDistance\t3.4462772872176073\n",
"label\t67\t-\tWeight\t0.13577900574984025\n", "label\t8\t-\tDistance\t3.4492972662700305\n",
"Latent semantic no. 8\n", "Latent semantic no. 8\n",
"label\t53\t-\tWeight\t0.2259481751468642\n", "label\t60\t-\tDistance\t3.2878466679861047\n",
"label\t37\t-\tWeight\t0.21583443408756542\n", "label\t66\t-\tDistance\t3.8429959542446595\n",
"label\t76\t-\tWeight\t0.20483376297311964\n", "label\t95\t-\tDistance\t4.407501055402251\n",
"label\t44\t-\tWeight\t0.1690198227623472\n", "label\t51\t-\tDistance\t4.675169110980285\n",
"label\t68\t-\tWeight\t0.1650723880318989\n", "label\t82\t-\tDistance\t4.930711123344968\n",
"label\t28\t-\tWeight\t0.15689929414378492\n", "label\t1\t-\tDistance\t5.746326956457264\n",
"label\t14\t-\tWeight\t0.1564371673909956\n", "label\t42\t-\tDistance\t5.932080034810729\n",
"label\t54\t-\tWeight\t0.1553627917623035\n", "label\t29\t-\tDistance\t5.934164464898548\n",
"label\t51\t-\tWeight\t0.14380435363337046\n", "label\t47\t-\tDistance\t6.3479330191887025\n",
"label\t36\t-\tWeight\t0.13510425005259438\n", "label\t35\t-\tDistance\t6.422013021100036\n",
"Latent semantic no. 9\n", "Latent semantic no. 9\n",
"label\t19\t-\tWeight\t0.11741024839079275\n", "label\t83\t-\tDistance\t5.036696108166727\n",
"label\t40\t-\tWeight\t0.11107319334138463\n", "label\t100\t-\tDistance\t5.163440732380748\n",
"label\t53\t-\tWeight\t0.11058750626248925\n", "label\t43\t-\tDistance\t5.447889420797845\n",
"label\t51\t-\tWeight\t0.10794606425819818\n", "label\t88\t-\tDistance\t6.470159759945887\n",
"label\t96\t-\tWeight\t0.10735468567860716\n", "label\t64\t-\tDistance\t6.8077571085247355\n",
"label\t55\t-\tWeight\t0.10731282010915796\n", "label\t17\t-\tDistance\t7.350448996699054\n",
"label\t50\t-\tWeight\t0.10703093662670059\n", "label\t55\t-\tDistance\t7.555979165305925\n",
"label\t1\t-\tWeight\t0.10651036503732043\n", "label\t11\t-\tDistance\t7.84770773092541\n",
"label\t79\t-\tWeight\t0.10640855392103846\n", "label\t91\t-\tDistance\t7.869761874577601\n",
"label\t47\t-\tWeight\t0.10594110421348357\n" "label\t75\t-\tDistance\t7.997112142085329\n"
] ]
} }
], ],

View File

@ -18,6 +18,8 @@ import torchvision.transforms as transforms
from torchvision.datasets import Caltech101 from torchvision.datasets import Caltech101
from torchvision.models import resnet50, ResNet50_Weights from torchvision.models import resnet50, ResNet50_Weights
import tensorly as tl
# OS and env # OS and env
import json import json
from os import getenv from os import getenv
@ -58,6 +60,8 @@ def loadDataset(dataset):
dataset = loadDataset(Caltech101) dataset = loadDataset(Caltech101)
NUM_LABELS = 101
NUM_IMAGES = 4339
class GridPartition: class GridPartition:
@ -998,7 +1002,7 @@ def extract_latent_semantics_from_sim_matrix(
"semantic-feature": V_T.tolist(), "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 = [ displayed_latent_semantics = [
sorted( sorted(
list(zip(feature_ids, latent_semantic)), list(zip(feature_ids, latent_semantic)),
@ -1033,7 +1037,7 @@ def extract_latent_semantics_from_sim_matrix(
"semantic-feature": H.tolist(), "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 = [ displayed_latent_semantics = [
sorted( sorted(
list(zip(feature_ids, latent_semantic)), list(zip(feature_ids, latent_semantic)),
@ -1066,7 +1070,7 @@ def extract_latent_semantics_from_sim_matrix(
"semantic-feature": K.tolist(), "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 = [ displayed_latent_semantics = [
sorted( sorted(
list(zip(feature_ids, latent_semantic)), list(zip(feature_ids, latent_semantic)),
@ -1084,10 +1088,10 @@ def extract_latent_semantics_from_sim_matrix(
all_latent_semantics = { all_latent_semantics = {
"image-semantic": Y.tolist(), "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 = [ displayed_latent_semantics = [
sorted( sorted(
list(zip(feature_ids, latent_semantic)), list(zip(feature_ids, latent_semantic)),
@ -1096,9 +1100,8 @@ def extract_latent_semantics_from_sim_matrix(
)[:top_images] )[:top_images]
for latent_semantic in Y.T 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): for idx, latent_semantic in enumerate(displayed_latent_semantics):
print(f"Latent semantic no. {idx}") print(f"Latent semantic no. {idx}")
for obj_id, weight in latent_semantic: for obj_id, weight in latent_semantic:
@ -1129,19 +1132,17 @@ def find_label_label_similarity(fd_collection, feature_model):
label_sim_matrix = [] label_sim_matrix = []
label_mean_vectors = [] label_mean_vectors = []
num_labels = 101 for label in range(NUM_LABELS):
for label in range(num_labels):
# get representative vectors for the label # get representative vectors for the label
label_mean_vectors.append( label_mean_vectors.append(
calculate_label_representatives(fd_collection, label, feature_model) 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 # Calculate half and fill the other
for i in range(num_labels): for i in range(NUM_LABELS):
for j in range(i + 1, num_labels): for j in range(i + 1, NUM_LABELS):
# Note: lower the value, lower the distance => higher the similarity # Note: lower the value, lower the distance => higher the similarity
label_sim_matrix[i][j] = label_sim_matrix[j][i] = feature_distance_matches[ label_sim_matrix[i][j] = label_sim_matrix[j][i] = feature_distance_matches[
feature_model feature_model
@ -1163,14 +1164,30 @@ def find_image_image_similarity(fd_collection, feature_model):
).flatten() # get the specific feature model's feature vector ).flatten() # get the specific feature model's feature vector
for img_fds in fd_collection.find() # repeat for all images 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 # Calculate half and fill the other
for i in range(num_images): for i in range(NUM_IMAGES):
for j in range(i + 1, num_images): for j in range(i + 1, NUM_IMAGES):
# Note: lower the value, lower the distance => higher the similarity # Note: lower the value, lower the distance => higher the similarity
image_sim_matrix[i][j] = image_sim_matrix[j][i] = feature_distance_matches[ image_sim_matrix[i][j] = image_sim_matrix[j][i] = feature_distance_matches[
feature_model feature_model
](np.array(feature_vectors[i]), np.array(feature_vectors[j])) ](np.array(feature_vectors[i]), np.array(feature_vectors[j]))
return image_sim_matrix 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