diff --git a/code/simclr-pytorch-reefs/evaluation/embeddings/ImageNet_embedding_extractor.ipynb b/code/simclr-pytorch-reefs/evaluation/embeddings/ImageNet_embedding_extractor.ipynb index 9b8bdc8..213f8e8 100644 --- a/code/simclr-pytorch-reefs/evaluation/embeddings/ImageNet_embedding_extractor.ipynb +++ b/code/simclr-pytorch-reefs/evaluation/embeddings/ImageNet_embedding_extractor.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Extract emebddings, PCA\n", + "# Extract embeddings, PCA\n", "\n", "May need to restart kernel for each dataset if worker error" ] @@ -18,7 +18,13 @@ "import torch\n", "import torch.nn as nn\n", "import torchvision.models as models\n", - "from torch.utils.data import DataLoader" + "from torch.utils.data import DataLoader\n", + "import pandas as pd\n", + "\n", + "# import my_custom_dataset_eval from \n", + "import sys\n", + "sys.path.append('/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/')\n", + "from my_custom_dataset_eval import CTDataset_test" ] }, { @@ -29,10 +35,11 @@ "source": [ "starting_weights = \"/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/logs/exman-train.py/runs/baseline/checkpoint-5100.pth.tar\"\n", "\n", - "cfg = {'num_classes': 2, 'starting_weights': starting_weights, 'finetune': False,\n", + "cfg = {'starting_weights': starting_weights, 'finetune': False,\n", " 'data_path': '/mnt/ssd-cluster/ben/data/full_dataset/', \n", " 'json_path': '/home/ben/reef-audio-representation-learning/data/dataset.json',\n", - " 'test_dataset': 'test_australia',#######################\n", + " 'test_dataset': 'test_bermuda',#######################\n", + " 'num_classes': 7, #####################\n", " 'num_workers':4} " ] }, @@ -144,15 +151,13 @@ "metadata": {}, "outputs": [], "source": [ - "from my_custom_dataset_eval import CTDataset_train, CTDataset_test\n", - "\n", "split = 'test_data'\n", "transform = False\n", - "train_percent = 1.0\n", + "train_percent = 0.0\n", "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", "\n", "#dataset = CTDataset_train(cfg, split=split, transform=transform, train_percent=train_percent)\n", - "dataset_instance = CTDataset_train(cfg, split=split, transform=transform, train_percent=train_percent)" + "dataset_instance = CTDataset_test(cfg, split=split, transform=transform, train_percent=train_percent)" ] }, { @@ -163,7 +168,7 @@ "source": [ "def get_dataloader(cfg, split, transform, train_percent, batch_size, shuffle, num_workers):\n", " \n", - " dataset = CTDataset_train(cfg, split, transform, train_percent)\n", + " dataset = CTDataset_test(cfg, split, transform, train_percent)\n", "\n", " dataloader = DataLoader(\n", " dataset, \n", @@ -229,8 +234,6 @@ "metadata": {}, "outputs": [], "source": [ - "import pandas as pd\n", - "\n", "# Assuming embeddings is your list of lists, each of 2048 features\n", "# And labels is your list of labels\n", "\n", @@ -241,7 +244,7 @@ "df.insert(0, 'Label', labels)\n", "\n", "# Save the DataFrame to CSV\n", - "df.to_csv('embeddings/' + 'ImageNet_' + cfg['test_dataset'] + '_embeddings.csv', index=False)" + "df.to_csv('raw_embeddings/' + 'ImageNet-' + cfg['test_dataset'][5:] + '-embeddings.csv', index=False)" ] }, { @@ -258,7 +261,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAHHCAYAAAC/R1LgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABwXklEQVR4nO3deVxU5f4H8M9h2HeVZcQQQSEB0QzSCFu8IriElahl5nJL+6m44pb7cjU0u5aaYVk3rbxXbzextEIMt1RcEFFcA0RwA1QEBGWbeX5/qJMjizMwA8J83q/XvC5znuec851DON/7rJIQQoCIiIjIABg1dABERERE9YWJDxERERkMJj5ERERkMJj4EBERkcFg4kNEREQGg4kPERERGQwmPkRERGQwmPgQERGRwWDiQ0RERAaDiQ8RkYYkScKCBQsaOgwiqgMmPkRUL9avXw9JklQvc3NzeHl5Ydy4ccjJyalUPycnB1OnTkX79u1haWkJKysr+Pv7Y/HixcjPz6/yHl26dIEkSYiOjtY4rosXL6rFJZPJ0Lp1a7zxxhtITk6u5adVd+bMGSxYsAAXL17UyfWIqPaMGzoAIjIsixYtgru7O0pKSrB//35ER0fj119/xalTp2BpaQkAOHr0KPr06YOioiK888478Pf3BwAkJiZi6dKl2LdvH+Li4tSum5qaiqNHj6JNmzbYuHEjxowZo1VcgwcPRp8+faBQKHD27FlER0fjt99+w6FDh/DMM8/U6TOfOXMGCxcuxCuvvII2bdrU6VpEVDdMfIioXvXu3RsBAQEAgJEjR6JFixZYsWIFfvrpJwwePBj5+fl44403IJPJcPz4cbRv317t/CVLlmDdunWVrvv999/DyckJ//znPzFgwABcvHhRqyTj2WefxTvvvKN6HxQUhH79+iE6OhpffPFF7T4sET1x2NVFRA3qb3/7GwAgIyMDAPDFF1/gypUrWLFiRaWkBwCcnZ0xZ86cSsf//e9/Y8CAAXj11VdhZ2eHf//73zqNqzrHjx9H7969YWtrC2tra/To0QOHDh1Sla9fvx4DBw4EAHTv3l3VpbZnz546xUdEtcPEh4gaVHp6OgCgRYsWAICff/4ZFhYWGDBggMbXOHz4MNLS0jB48GCYmpqif//+2Lhxo07jqsrp06fx4osv4sSJE5g+fTrmzp2LjIwMvPLKKzh8+DAA4KWXXsKECRMAALNmzcJ3332H7777Dt7e3nWKj4hqh11dRFSvCgoKcOPGDZSUlODAgQNYtGgRLCws8OqrrwIAzp49Cy8vL5iammp8ze+//x6urq4ICgoCALz11lv417/+heTkZI3H59y5cwc3btyAQqHAuXPnMHnyZABQtdZUZc6cOSgvL8f+/fvh4eEBABg2bBiefvppTJ8+HXv37oWHhwdefPFFrFq1Cj179sQrr7yi8eciIt1j4kNE9So4OFjtvZubGzZu3IhWrVoBAAoLC2FjY6Px9SoqKrB582YMHz4ckiQBuNdN5eTkhI0bN2qc+MyfPx/z589Xvbe1tcWyZcvQv3//KusrFArExcXh9ddfVyU9ANCyZUu8/fbbWLduHQoLC2Fra6vxZyEi/WPiQ0T1as2aNfDy8oKxsTGcnZ3x9NNPw8jor153W1tb3L59W+PrxcXF4fr16+jSpQvS0tJUx7t3747//Oc/WLZsmdr1q/P+++9j4MCBMDIygr29PXx9fWFmZlZt/evXr+POnTt4+umnK5V5e3tDqVTi0qVL8PX11fizEJH+MfEhonrVpUsX1ayuqrRv3x7JyckoKyvTqLvrwVieQYMGVVm+d+9edO/e/bHX8fT0rNQaRURNDxMfInqihIWFISEhAT/++CMGDx5cY93i4mL89NNPePPNN6scDD1hwgRs3LhRo8RHW46OjrC0tMT58+crlZ07dw5GRkZwdXUFAFUXHBE1PM7qIqInyujRo9GyZUtMmTIFf/75Z6Xy3NxcLF68GAAQExOD4uJiREREYMCAAZVer776Kn788UeUlpbqPE6ZTIaQkBD89NNPaisy5+Tk4N///je6deumGt9jZWUFANWuOE1E9YctPkT0RGnWrBliYmLQp08fPPPMM2orNyclJeE///kPAgMDAdzr5mrRogVeeOGFKq/Vr18/rFu3Dr/88ku1g5TrYvHixdi5cye6deuGsWPHwtjYGF988QVKS0vx0Ucfqeo988wzkMlkWLZsGQoKCmBmZqYagE1E9YstPkT0xOnatStOnTqF0aNHY+/evZg0aRIiIyNx7NgxfPDBB/jhhx+Qm5uL33//HX369IFMJqvyOj169IClpSW+//57vcTp6+uLP/74Ax06dEBUVBQWLlwINzc37N69G127dlXVk8vlWLt2LXJzc/Hee+9h8ODBOHPm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blVZVfLy8pCcnIwzZ84AAM6fP4/k5GRkZ2fr8ElUxsSHiIhIH4xkQK9l9988mvzcf99rqV7W8/Hw8EBSUhK6d++OKVOmoEOHDujZsyfi4+MRHR1d5Tn9+vXD5MmTMW7cODzzzDM4ePAg5s6dqyqXyWS4efMmhg0bBi8vLwwaNAi9e/fGwoULAQAKhQIRERHw9vZGr1694OXlhc8//7zaGH/++Wd07twZffv2BQC89dZb6Ny5M9auXavDJ1GZJOoyCqoJKiwshJ2dHQoKCmBra9vQ4RARUQMqKSlBRkYG3N3dYW5uXruLnPn53uyuhwc627a6l/ToeCp7U1fT70PT729OZyciItInn373pqzX48rNVD0mPkRERPpmJAPcX2zoKAgc40NEREQGhIkPERERGQwmPkRERGQwmPgQERGRwWDiQ0RERAaDiQ8REREZDCY+REREZDCY+BARERkoSZKwdevWhg6jXjHxISIiaoKys7Mxfvx4eHh4wMzMDK6urggLC0N8fHxDh4by8nLMmDEDfn5+sLKygouLC4YNG4arV68+/uQ64srNREREeqZQKpCUm4Trd67D0dIRzzo9C5ket6y4ePEigoKCYG9vj+XLl8PPzw/l5eXYsWMHIiIicO7cOb3dWxN37txBUlIS5s6di06dOuHWrVuYOHEi+vXrh8TERL3em4kPERGRHv2e+TuWHlmKnDs5qmPOls74oMsHCHYL1ss9x44dC0mScOTIEVhZWamO+/r64t133632vBkzZiAmJgaXL1+GXC7HkCFDMG/ePJiYmAAATpw4gUmTJiExMRGSJMHT0xNffPEFAgICkJmZiXHjxmH//v0oKytDmzZtsHz5cvTp06fSfezs7LBz5061Y5999hm6dOmCrKwstG7dWkdPojImPkRERHrye+bviNwTCQGhdjz3Ti4i90RixSsrdJ785OXlITY2FkuWLFFLeh6wt7ev9lwbGxusX78eLi4uSElJwahRo2BjY4Pp06cDAIYMGYLOnTsjOjoaMpkMycnJqqQoIiICZWVl2LdvH6ysrHDmzBlYW1trHHdBQQEkSaoxPl1g4kNERKQHCqUCS48srZT0AICAgAQJy44sQ3fX7jrt9kpLS4MQAu3bt9f63Dlz5qh+btOmDaZOnYpNmzapEp+srCxMmzZNdW1PT09V/aysLISHh8PPzw8A4OHh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zgPUVmRkJIYPH46AgAB06dIFn376KYqLi/H3v/+9XuPQdHkkIQTsXmrYljKixsA2JAQ2PXpw5WYiqhOttqx49dVXkZmZidjYWKSlpUEIAS8vL4SEhMDS0lJfMWrlzTffxPXr1zFv3jxkZ2fjmWeeQWxsbKUBz/q2ZdsWDHhtAICqW38eJEZbtm3B5OWv1GdoRI2WJJPBqqtmi5ESEVWlSa7cXBe6XLk5c9qeKgc4P3jkSqUSbkx6iIiI6kznKzeT9tyWvwKlUlllGZMeIiKi+sfER8/clr+C//30PygUCiiVSigUCvzvp/8x6SEiImoA7Op6hK53ZyciIiL9Y1cXERER0SM0mtWlzTYObCUhIiKiJ5VGiY+9vf1jF+QTQkCSJCgUCp0ERkRERKRrGiU+u3fv1nccRERERHqnUeLz8ssv6zsOIiIiIr3TauXmh925cwdZWVkoKytTO96xY8c6B0VERESkD1onPtevX8ff//53/Pbbb1WWc4wPERERPam0ns4+adIk5Ofn4/Dhw7CwsEBsbCw2bNgAT09P/Pzzz/qIkYiIiEgntG7x2bVrF3766ScEBATAyMgIbm5u6NmzJ2xtbREVFYW+ffvqI04iIiKiOtO6xae4uBhOTk4AgGbNmuH69esAAD8/PyQlJek2OiIiIiId0jrxefrpp3H+/HkAQKdOnfDFF1/gypUrWLt2LVq2bKnzAImIiIh0ReuurokTJ+LatWsAgPnz56NXr17YuHEjTE1NsX79el3HR0RERKQzdd6k9M6dOzh37hxat24NBwcHXcXVYLhJKRERUeOj6fd3rdfxAe5tU2FhYYFnn322LpchIiIiqhe12p3966+/RocOHWBubg5zc3N06NABX331la5jIyIiItIprVt85s2bhxUrVmD8+PEIDAwEACQkJGDy5MnIysrCokWLdB4kERERkS5oPcbH0dERq1atwuDBg9WO/+c//8H48eNx48YNnQZY3zjGh4iIqPHR9Ptb666u8vJyBAQEVDru7++PiooKbS9HREREVG+0TnyGDh2K6OjoSse//PJLDBkyRCdBEREREelDrWZ1ff3114iLi8Pzzz8PADh8+DCysrIwbNgwREZGquqtWLFCN1ESERER6YDWic+pU6dU09fT09MBAA4ODnBwcMCpU6dU9SRJ0lGIRERERLqhdeKze/dufcRBRERE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", "text/plain": [ "
" ] diff --git a/code/simclr-pytorch-reefs/evaluation/embeddings/ReefCLR_embedding_extractor.ipynb b/code/simclr-pytorch-reefs/evaluation/embeddings/ReefCLR_embedding_extractor.ipynb index 3b058dd..9b63fb5 100644 --- a/code/simclr-pytorch-reefs/evaluation/embeddings/ReefCLR_embedding_extractor.ipynb +++ b/code/simclr-pytorch-reefs/evaluation/embeddings/ReefCLR_embedding_extractor.ipynb @@ -19,8 +19,12 @@ "import torch.nn as nn\n", "import torchvision.models as models\n", "from torch.utils.data import DataLoader\n", + "import pandas as pd \n", "\n", - "# my_custom_dataset.py must be in the same directory as this script" + "# import my_custom_dataset_eval from \n", + "import sys\n", + "sys.path.append('/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/')\n", + "from my_custom_dataset_eval import CTDataset_test" ] }, { @@ -29,12 +33,13 @@ "metadata": {}, "outputs": [], "source": [ - "starting_weights = \"/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/logs/exman-train.py/runs/baseline/checkpoint-5100.pth.tar\"\n", + "starting_weights = \"/home/ben/reef-audio-representation-learning/scratch/baseline/checkpoint-5100.pth.tar\"\n", "\n", - "cfg = {'num_classes': 2, 'starting_weights': starting_weights, 'finetune': False,\n", + "cfg = {'starting_weights': starting_weights, 'finetune': False,\n", " 'data_path': '/mnt/ssd-cluster/ben/data/full_dataset/', \n", " 'json_path': '/home/ben/reef-audio-representation-learning/data/dataset.json',\n", - " 'test_dataset': 'test_kenya',#######################\n", + " 'test_dataset': 'test_french_polynesia',#######################\n", + " 'num_classes': 2, #####################\n", " 'num_workers':4} " ] }, @@ -130,15 +135,10 @@ "metadata": {}, "outputs": [], "source": [ - "from my_custom_dataset_eval import CTDataset_train, CTDataset_test\n", - "\n", "split = 'test_data'\n", "transform = False\n", - "train_percent = 1.0\n", - "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", - "\n", - "#dataset = CTDataset_train(cfg, split=split, transform=transform, train_percent=train_percent)\n", - "dataset_instance = CTDataset_train(cfg, split=split, transform=transform, train_percent=train_percent)" + "train_percent = 0.0\n", + "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')" ] }, { @@ -149,7 +149,7 @@ "source": [ "def get_dataloader(cfg, split, transform, train_percent, batch_size, shuffle, num_workers):\n", " \n", - " dataset = CTDataset_train(cfg, split, transform, train_percent)\n", + " dataset = CTDataset_test(cfg, split, transform, train_percent)\n", "\n", " dataloader = DataLoader(\n", " dataset, \n", @@ -219,12 +219,12 @@ "df.insert(0, 'Label', labels)\n", "\n", "# Save the DataFrame to CSV\n", - "df.to_csv('embeddings/' + cfg['test_dataset'] + '_embeddings.csv', index=False)" + "df.to_csv('raw_embeddings/' + 'ReefCLR-' + cfg['test_dataset'][5:] + '-embeddings.csv', index=False)" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -275,122 +275,122 @@ " \n", " 0\n", " 1\n", - " 0.919028\n", - " 0.506934\n", - " 0.435215\n", - " 0.842612\n", - " 0.390855\n", - " 0.867625\n", - " 0.704748\n", - " 0.908792\n", - " 1.011092\n", + " 0.917128\n", + " 0.514379\n", + " 0.442618\n", + " 0.853922\n", + " 0.383245\n", + " 0.867283\n", + " 0.686069\n", + " 0.903708\n", + " 1.006485\n", " ...\n", - " 0.562921\n", - " 0.542773\n", - " 0.483578\n", - " 0.631532\n", - " 0.393116\n", - " 0.530373\n", - " 0.723051\n", - " 0.580992\n", - " 0.831317\n", - " 0.568946\n", + " 0.557613\n", + " 0.540595\n", + " 0.488916\n", + " 0.630372\n", + " 0.390561\n", + " 0.533577\n", + " 0.718749\n", + " 0.579761\n", + " 0.824050\n", + " 0.572824\n", " \n", " \n", " 1\n", " 1\n", - " 0.905521\n", - " 0.424784\n", - " 0.459844\n", - " 0.766640\n", - " 0.486458\n", - " 0.858432\n", - " 0.546274\n", - " 1.176073\n", - " 0.985820\n", + " 0.917583\n", + " 0.512943\n", + " 0.444367\n", + " 0.852815\n", + " 0.385335\n", + " 0.867329\n", + " 0.683194\n", + " 0.906614\n", + " 1.007157\n", " ...\n", - " 0.635251\n", - " 0.660854\n", - " 0.464857\n", - " 0.543516\n", - " 0.411127\n", - " 0.547460\n", - " 0.654553\n", - " 0.638909\n", - " 1.050415\n", - " 0.629480\n", + " 0.558583\n", + " 0.540601\n", + " 0.487653\n", + " 0.631844\n", + " 0.391346\n", + " 0.535359\n", + " 0.721025\n", + " 0.577411\n", + " 0.826399\n", + " 0.575651\n", " \n", " \n", " 2\n", - " 0\n", - " 0.917688\n", - " 0.513418\n", - " 0.442137\n", - " 0.852096\n", - " 0.384112\n", - " 0.867285\n", - " 0.686680\n", - " 0.904982\n", - " 1.006801\n", + " 1\n", + " 0.815464\n", + " 0.719302\n", + " 0.601633\n", + " 0.745028\n", + " 0.446869\n", + " 0.916246\n", + " 0.916771\n", + " 0.539446\n", + " 0.727328\n", " ...\n", - " 0.559864\n", - " 0.542982\n", - " 0.487606\n", - " 0.628447\n", - " 0.389822\n", - " 0.533369\n", - " 0.719379\n", - " 0.577960\n", - " 0.825859\n", - " 0.575659\n", + " 0.458255\n", + " 0.398599\n", + " 0.539951\n", + " 0.957240\n", + " 0.360331\n", + " 0.928205\n", + " 0.743379\n", + " 0.537051\n", + " 0.526118\n", + " 0.440947\n", " \n", " \n", " 3\n", " 0\n", - " 0.917862\n", - " 0.512711\n", - " 0.441923\n", - " 0.852616\n", - " 0.384108\n", - " 0.867754\n", - " 0.686703\n", - " 0.904578\n", - " 1.006853\n", + " 0.816463\n", + " 0.716947\n", + " 0.601764\n", + " 0.746527\n", + " 0.447060\n", + " 0.916437\n", + " 0.912708\n", + " 0.538276\n", + " 0.727366\n", " ...\n", - " 0.560208\n", - " 0.542105\n", - " 0.486992\n", - " 0.628390\n", - " 0.389587\n", - " 0.532686\n", - " 0.719502\n", - " 0.578081\n", - " 0.825646\n", - " 0.576382\n", + " 0.457184\n", + " 0.398924\n", + " 0.538942\n", + " 0.958116\n", + " 0.360718\n", + " 0.929999\n", + " 0.743010\n", + " 0.537223\n", + " 0.523100\n", + " 0.439797\n", " \n", " \n", " 4\n", - " 0\n", - " 0.921435\n", - " 0.513003\n", - " 0.440352\n", - " 0.854395\n", - " 0.383027\n", - " 0.865497\n", - " 0.684805\n", - " 0.904298\n", - " 1.007651\n", + " 1\n", + " 0.815399\n", + " 0.718337\n", + " 0.603470\n", + " 0.744375\n", + " 0.447375\n", + " 0.915905\n", + " 0.915381\n", + " 0.540694\n", + " 0.727376\n", " ...\n", - " 0.558675\n", - " 0.547358\n", - " 0.488635\n", - " 0.625724\n", - " 0.389663\n", - " 0.530150\n", - " 0.716523\n", - " 0.576859\n", - " 0.826569\n", - " 0.575228\n", + " 0.457575\n", + " 0.398855\n", + " 0.539441\n", + " 0.959134\n", + " 0.358519\n", + " 0.926882\n", + " 0.745229\n", + " 0.537306\n", + " 0.527225\n", + " 0.440862\n", " \n", " \n", "\n", @@ -399,37 +399,37 @@ ], "text/plain": [ " Label Feature_1 Feature_2 Feature_3 Feature_4 Feature_5 Feature_6 \\\n", - "0 1 0.919028 0.506934 0.435215 0.842612 0.390855 0.867625 \n", - "1 1 0.905521 0.424784 0.459844 0.766640 0.486458 0.858432 \n", - "2 0 0.917688 0.513418 0.442137 0.852096 0.384112 0.867285 \n", - "3 0 0.917862 0.512711 0.441923 0.852616 0.384108 0.867754 \n", - "4 0 0.921435 0.513003 0.440352 0.854395 0.383027 0.865497 \n", + "0 1 0.917128 0.514379 0.442618 0.853922 0.383245 0.867283 \n", + "1 1 0.917583 0.512943 0.444367 0.852815 0.385335 0.867329 \n", + "2 1 0.815464 0.719302 0.601633 0.745028 0.446869 0.916246 \n", + "3 0 0.816463 0.716947 0.601764 0.746527 0.447060 0.916437 \n", + "4 1 0.815399 0.718337 0.603470 0.744375 0.447375 0.915905 \n", "\n", " Feature_7 Feature_8 Feature_9 ... Feature_2039 Feature_2040 \\\n", - "0 0.704748 0.908792 1.011092 ... 0.562921 0.542773 \n", - "1 0.546274 1.176073 0.985820 ... 0.635251 0.660854 \n", - "2 0.686680 0.904982 1.006801 ... 0.559864 0.542982 \n", - "3 0.686703 0.904578 1.006853 ... 0.560208 0.542105 \n", - "4 0.684805 0.904298 1.007651 ... 0.558675 0.547358 \n", + "0 0.686069 0.903708 1.006485 ... 0.557613 0.540595 \n", + "1 0.683194 0.906614 1.007157 ... 0.558583 0.540601 \n", + "2 0.916771 0.539446 0.727328 ... 0.458255 0.398599 \n", + "3 0.912708 0.538276 0.727366 ... 0.457184 0.398924 \n", + "4 0.915381 0.540694 0.727376 ... 0.457575 0.398855 \n", "\n", " Feature_2041 Feature_2042 Feature_2043 Feature_2044 Feature_2045 \\\n", - "0 0.483578 0.631532 0.393116 0.530373 0.723051 \n", - "1 0.464857 0.543516 0.411127 0.547460 0.654553 \n", - "2 0.487606 0.628447 0.389822 0.533369 0.719379 \n", - "3 0.486992 0.628390 0.389587 0.532686 0.719502 \n", - "4 0.488635 0.625724 0.389663 0.530150 0.716523 \n", + "0 0.488916 0.630372 0.390561 0.533577 0.718749 \n", + "1 0.487653 0.631844 0.391346 0.535359 0.721025 \n", + "2 0.539951 0.957240 0.360331 0.928205 0.743379 \n", + "3 0.538942 0.958116 0.360718 0.929999 0.743010 \n", + "4 0.539441 0.959134 0.358519 0.926882 0.745229 \n", "\n", " Feature_2046 Feature_2047 Feature_2048 \n", - "0 0.580992 0.831317 0.568946 \n", - "1 0.638909 1.050415 0.629480 \n", - "2 0.577960 0.825859 0.575659 \n", - "3 0.578081 0.825646 0.576382 \n", - "4 0.576859 0.826569 0.575228 \n", + "0 0.579761 0.824050 0.572824 \n", + "1 0.577411 0.826399 0.575651 \n", + "2 0.537051 0.526118 0.440947 \n", + "3 0.537223 0.523100 0.439797 \n", + "4 0.537306 0.527225 0.440862 \n", "\n", "[5 rows x 2049 columns]" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -447,12 +447,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] diff --git a/code/simclr-pytorch-reefs/evaluation/embeddings/YAMNet_embedding_extractor.ipynb b/code/simclr-pytorch-reefs/evaluation/embeddings/YAMNet_embedding_extractor.ipynb index 823a486..65b1000 100644 --- a/code/simclr-pytorch-reefs/evaluation/embeddings/YAMNet_embedding_extractor.ipynb +++ b/code/simclr-pytorch-reefs/evaluation/embeddings/YAMNet_embedding_extractor.ipynb @@ -1,44 +1,111 @@ { "cells": [ { - "cell_type": "code", - "execution_count": 1, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# import torch\n", - "# import torch.nn as nn\n", - "# import torchvision.models as models\n", - "# from torch.utils.data import DataLoader" + "# VGGish\n", + "\n", + "Script to extract embeddings from audio using VGGish. \n", + "\n", + "Note this is far slower than the other embedding scripts as its not using the gpu." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-08-30 21:28:37.542298: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-08-30 21:28:42.233539: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" + ] + } + ], "source": [ + "import tensorflow as tf\n", + "import tensorflow_hub as hub\n", + "import numpy as np\n", + "import csv\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from IPython.display import Audio\n", + "from scipy.io import wavfile\n", + "\n", "# Importing necessary modules\n", "import json\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-08-30 21:28:51.360074: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1956] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n" + ] + } + ], + "source": [ + "# load VGGish\n", + "model = hub.load('https://tfhub.dev/google/vggish/1')\n", + "\n", + "### needs this placeholder for some reason\n", + "# Input: 3 seconds of silence as mono 16 kHz waveform samples.\n", + "waveform = np.zeros(3 * 16000, dtype=np.float32)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# which dataset to use\n", + "test_dataset = 'test_bermuda'\n", "\n", - "# Load the JSON file\n", + "# path where json file of data is stored\n", "json_path = '/home/ben/reef-audio-representation-learning/data/dataset.json'\n", - "with open(json_path, 'r') as f:\n", - " dataset_json = json.load(f)" + "\n", + "# path to the audio files\n", + "dataset_path = '/home/ben/data/full_dataset/'\n", + "\n", + "# path to the results folder, where the csv if embeddings will be saved\n", + "results_path = '/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/embeddings/raw_embeddings/'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Find the right data" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ + "# open the json\n", + "with open(json_path, 'r') as f:\n", + " dataset_json = json.load(f)\n", + " \n", "# Initialize an empty list to store the filtered entries\n", "filtered_entries = []\n", "\n", "# Filter entries based on 'data_type' and 'dataset'\n", "for entry in dataset_json['audio']:\n", - " if entry['data_type'] == 'test_data' and entry['dataset'] == 'test_australia':\n", + " if entry['data_type'] == 'test_data' and entry['dataset'] == test_dataset:\n", " # Convert the 'class' to numeric\n", " numeric_class = int(entry['class'].replace('class', ''))\n", " \n", @@ -49,7 +116,243 @@ " }\n", " \n", " # Append the filtered entry to the list\n", - " filtered_entries.append(filtered_entry)" + " filtered_entries.append(filtered_entry) #list objest with dictionaries of {file_name: file, class}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def ensure_sample_rate(original_sample_rate, waveform,\n", + " desired_sample_rate=16000):\n", + " \"\"\"Resample waveform if required.\"\"\"\n", + " if original_sample_rate != desired_sample_rate:\n", + " desired_length = int(round(float(len(waveform)) /\n", + " original_sample_rate * desired_sample_rate))\n", + " waveform = scipy.signal.resample(waveform, desired_length)\n", + " return desired_sample_rate, waveform" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize an empty list to store the embeddings\n", + "all_embeddings = []\n", + "\n", + "# Initialize an empty list to store the rows for DataFrame\n", + "df_rows = []\n", + "\n", + "# Loop through each filtered entry to read and process the WAV file\n", + "for entry in filtered_entries:\n", + " wav_file_name = dataset_path + entry['file_name']\n", + " \n", + " # Read the WAV file\n", + " sample_rate, wav_data = wavfile.read(wav_file_name, 'rb')\n", + " \n", + " # Ensure sample rate\n", + " sample_rate, wav_data = ensure_sample_rate(sample_rate, wav_data)\n", + " \n", + " # Pad wav_data with 280 extra zeros\n", + " wav_data = np.pad(wav_data, (0, 280), 'constant')\n", + " \n", + " # Compute the embeddings\n", + " embeddings = model(wav_data)\n", + " \n", + " # Assert the shape of the embeddings\n", + " embeddings.shape.assert_is_compatible_with([None, 128])\n", + "\n", + " # convert embeddings to a numpy array\n", + " second_1 = np.array(embeddings[0])\n", + " second_2 = np.array(embeddings[1])\n", + "\n", + " # take mean of the array for each 1sec, so we average features over the 2 seconds\n", + " mean = np.mean([second_1, second_2], axis=0)\n", + " \n", + " # Create a row for DataFrame\n", + " df_row = {'label': entry['class']}\n", + " for i, feature in enumerate(mean): # Assuming embeddings[0] contains the 128 features\n", + " df_row[f'Feature_{i+1}'] = feature\n", + " \n", + " df_rows.append(df_row)\n", + "\n", + "# Create a DataFrame\n", + "df = pd.DataFrame(df_rows)\n", + "\n", + "# Save the DataFrame to a CSV file\n", + "df.to_csv(results_path + 'VGGish-' + test_dataset[5:] + '-embeddings.csv', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
labelFeature_1Feature_2Feature_3Feature_4Feature_5Feature_6Feature_7Feature_8Feature_9...Feature_119Feature_120Feature_121Feature_122Feature_123Feature_124Feature_125Feature_126Feature_127Feature_128
00-0.755880-0.239144-0.006482-0.660316-0.661326-1.5640380.189483-0.150790-2.337072...-0.3064570.085061-0.065240-0.174579-0.748717-0.202958-0.170341-0.6190310.1440400.159795
10-0.569910-0.196253-0.012757-0.733111-0.702112-1.6037210.293776-0.188705-2.214564...-0.3846560.058515-0.087278-0.202737-0.680734-0.189267-0.165939-0.5639020.0840170.065772
20-0.767339-0.2150240.117208-0.570487-0.628667-1.5383990.244541-0.060223-2.132523...-0.1996170.119985-0.073416-0.218369-0.632460-0.165810-0.144961-0.6303400.1590190.107950
\n", + "

3 rows × 129 columns

\n", + "
" + ], + "text/plain": [ + " label Feature_1 Feature_2 Feature_3 Feature_4 Feature_5 Feature_6 \\\n", + "0 0 -0.755880 -0.239144 -0.006482 -0.660316 -0.661326 -1.564038 \n", + "1 0 -0.569910 -0.196253 -0.012757 -0.733111 -0.702112 -1.603721 \n", + "2 0 -0.767339 -0.215024 0.117208 -0.570487 -0.628667 -1.538399 \n", + "\n", + " Feature_7 Feature_8 Feature_9 ... Feature_119 Feature_120 \\\n", + "0 0.189483 -0.150790 -2.337072 ... -0.306457 0.085061 \n", + "1 0.293776 -0.188705 -2.214564 ... -0.384656 0.058515 \n", + "2 0.244541 -0.060223 -2.132523 ... -0.199617 0.119985 \n", + "\n", + " Feature_121 Feature_122 Feature_123 Feature_124 Feature_125 \\\n", + "0 -0.065240 -0.174579 -0.748717 -0.202958 -0.170341 \n", + "1 -0.087278 -0.202737 -0.680734 -0.189267 -0.165939 \n", + "2 -0.073416 -0.218369 -0.632460 -0.165810 -0.144961 \n", + "\n", + " Feature_126 Feature_127 Feature_128 \n", + "0 -0.619031 0.144040 0.159795 \n", + "1 -0.563902 0.084017 0.065772 \n", + "2 -0.630340 0.159019 0.107950 \n", + "\n", + "[3 rows x 129 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# view first 5 entries to check it worked\n", + "df.head()" ] }, { @@ -57,7 +360,10 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# get a summary of the label colum in df\n", + "df['label'].describe()" + ] } ], "metadata": { diff --git a/code/simclr-pytorch-reefs/evaluation/embeddings/cluster.ipynb b/code/simclr-pytorch-reefs/evaluation/embeddings/cluster.ipynb index a9a7809..f6d3b02 100644 --- a/code/simclr-pytorch-reefs/evaluation/embeddings/cluster.ipynb +++ b/code/simclr-pytorch-reefs/evaluation/embeddings/cluster.ipynb @@ -26,27 +26,44 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Specify a list of categories you want to include\n", - "enabled_categories = ['ReefCLR', 'ImageNet'] # Add or remove categories here\n", + "enabled_categories = ['ReefCLR', 'ImageNet', 'VGGish'] # Add or remove categories here\n", "\n", "# Specify path to the embedding cvs's\n", - "csv_directory = '/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/embeddings'" + "csv_directory = '/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/embeddings/raw_embeddings'" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/ben/miniconda3/envs/simclr_pytorch_reefs/lib/python3.8/site-packages/umap/distances.py:1063: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\n", + " @numba.jit()\n", + "/home/ben/miniconda3/envs/simclr_pytorch_reefs/lib/python3.8/site-packages/umap/distances.py:1071: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\n", + " @numba.jit()\n", + "/home/ben/miniconda3/envs/simclr_pytorch_reefs/lib/python3.8/site-packages/umap/distances.py:1086: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\n", + " @numba.jit()\n", + "/home/ben/miniconda3/envs/simclr_pytorch_reefs/lib/python3.8/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "/home/ben/miniconda3/envs/simclr_pytorch_reefs/lib/python3.8/site-packages/umap/umap_.py:660: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\n", + " @numba.jit()\n" + ] + } + ], "source": [ "import pandas as pd\n", "import umap\n", "from sklearn.cluster import AffinityPropagation\n", - "from scipy import stats\n" + "from scipy import stats" ] }, { @@ -118,7 +135,7 @@ "metadata": {}, "outputs": [], "source": [ - "specific_df = datasets['ReefCLR']['australia']\n", + "specific_df = datasets['ReefCLR']['australia']['VGGish']\n", "print(specific_df.head())" ] }, @@ -368,7 +385,7 @@ "total_categories = len(datasets)\n", "\n", "# Initialize the plot grid\n", - "fig, axes = plt.subplots(len(datasets[list(datasets.keys())[0]]), total_categories, figsize=(8, 20))\n", + "fig, axes = plt.subplots(len(datasets[list(datasets.keys())[0]]), total_categories, figsize=(8, 30))\n", "\n", "\n", "# Ensure axes is always 2D\n", diff --git a/code/simclr-pytorch-reefs/evaluation/embeddings/simple_ml.ipynb b/code/simclr-pytorch-reefs/evaluation/embeddings/simple_ml.ipynb index 92e36d5..1fd3e6b 100644 --- a/code/simclr-pytorch-reefs/evaluation/embeddings/simple_ml.ipynb +++ b/code/simclr-pytorch-reefs/evaluation/embeddings/simple_ml.ipynb @@ -1,152 +1,225 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Random forests on embeddings\n", + "\n", + "This script reads all embedding csvs in the folder_path, computes random forests. \n", + "\n", + "Fix\n", + "- These have a random 0.8:0.2 training split, this is currently not the same random split as the fullt rained resnets, so fix this.\n", + "- With both cases, could maybe do a more comprehensive sweep of the random splits, e.g 5 fold cross-val to get error bars" + ] + }, { "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Path to the folder containing the CSV files\n", + "folder_path = '/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/embeddings/raw_embeddings'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Results for ReefCLR_australia_embeddings.csv:\n", + "Results for ImageNet-kenya-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.6583333333333333\n", - "Precision: 0.6583773270352876\n", - "Recall: 0.6583333333333333\n", - "F1 Score: 0.658309604833669\n", + "Accuracy: 0.7058823529411765\n", + "Precision: 0.6900452488687784\n", + "Recall: 0.7058823529411765\n", + "F1 Score: 0.6954248366013073\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ReefCLR_bermuda_embeddings.csv:\n", + "Results for ImageNet-australia-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.5454545454545454\n", - "Precision: 0.5175936961716269\n", - "Recall: 0.5454545454545454\n", - "F1 Score: 0.5293324709638116\n", + "Accuracy: 0.7425\n", + "Precision: 0.7435289096432427\n", + "Recall: 0.7425\n", + "F1 Score: 0.74222772803774\n", "--- Training Metrics ---\n", - "Accuracy: 0.9658848614072495\n", - "Precision: 0.9669208553986263\n", - "Recall: 0.9658848614072495\n", - "F1 Score: 0.9661208660585964\n", + "Accuracy: 1.0\n", + "Precision: 1.0\n", + "Recall: 1.0\n", + "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ReefCLR__indonesia_embeddings.csv:\n", + "Results for ImageNet-florida-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.9675810473815462\n", - "Precision: 0.9698801068363995\n", - "Recall: 0.9675810473815462\n", - "F1 Score: 0.9683992734985941\n", + "Accuracy: 0.9099009900990099\n", + "Precision: 0.9090399177126222\n", + "Recall: 0.9099009900990099\n", + "F1 Score: 0.9092349986300611\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ReefCLR_kenya_embeddings.csv:\n", + "Results for ImageNet-french_polynesia-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.8484848484848485\n", - "Precision: 0.8459374530666943\n", - "Recall: 0.8484848484848485\n", - "F1 Score: 0.8442091689572092\n", + "Accuracy: 0.967706013363029\n", + "Precision: 0.9677081731770477\n", + "Recall: 0.967706013363029\n", + "F1 Score: 0.9677058932209646\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ReefCLR_french_polynesia_embeddings.csv:\n", + "Results for ImageNet-indonesia-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.9448775055679287\n", - "Precision: 0.9449035835575814\n", - "Recall: 0.9448775055679287\n", - "F1 Score: 0.9448761896669364\n", + "Accuracy: 0.972568578553616\n", + "Precision: 0.9736749608027297\n", + "Recall: 0.972568578553616\n", + "F1 Score: 0.9729952745505177\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ReefCLR_florida_embeddings.csv:\n", + "Results for ReefCLR-indonesia_embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.9297029702970298\n", - "Precision: 0.9295783375286849\n", - "Recall: 0.9297029702970298\n", - "F1 Score: 0.9285696715180046\n", + "Accuracy: 0.9675810473815462\n", + "Precision: 0.9698801068363995\n", + "Recall: 0.9675810473815462\n", + "F1 Score: 0.9683992734985941\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ImageNet_test_florida_embeddings.csv:\n", + "Results for ImageNet-bermuda-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.9257425742574258\n", - "Precision: 0.9251316696792821\n", - "Recall: 0.9257425742574258\n", - "F1 Score: 0.9249583951631972\n", + "Accuracy: 0.5056818181818182\n", + "Precision: 0.43688279490974635\n", + "Recall: 0.5056818181818182\n", + "F1 Score: 0.45759529166601143\n", + "--- Training Metrics ---\n", + "Accuracy: 0.9616204690831557\n", + "Precision: 0.9597609012957307\n", + "Recall: 0.9616204690831557\n", + "F1 Score: 0.9595826040963011\n", + "----------------------------------------\n", + "Results for ReefCLR-australia_embeddings.csv:\n", + "--- Test Metrics ---\n", + "Accuracy: 0.6625\n", + "Precision: 0.6625546364194631\n", + "Recall: 0.6625\n", + "F1 Score: 0.6624716382418245\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ImageNet_test_indonesia_embeddings.csv:\n", + "Results for ReefCLR-bermuda_embeddings.csv:\n", + "--- Test Metrics ---\n", + "Accuracy: 0.6164772727272727\n", + "Precision: 0.5565759397879207\n", + "Recall: 0.6164772727272727\n", + "F1 Score: 0.5845623681080953\n", + "--- Training Metrics ---\n", + "Accuracy: 0.9587775408670931\n", + "Precision: 0.9573277144806981\n", + "Recall: 0.9587775408670931\n", + "F1 Score: 0.9577464930657325\n", + "----------------------------------------\n", + "Results for ReefCLR-kenya_embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.9750623441396509\n", - "Precision: 0.9744453834229394\n", - "Recall: 0.9750623441396509\n", - "F1 Score: 0.9744918056184089\n", + "Accuracy: 0.8606060606060606\n", + "Precision: 0.8599897479913216\n", + "Recall: 0.8606060606060606\n", + "F1 Score: 0.8555972134575646\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ImageNet_test_bermuda_embeddings.csv:\n", + "Results for ReefCLR-florida_embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.5369318181818182\n", - "Precision: 0.4704223593234795\n", - "Recall: 0.5369318181818182\n", - "F1 Score: 0.4922555099543746\n", + "Accuracy: 0.907920792079208\n", + "Precision: 0.9070892323092766\n", + "Recall: 0.907920792079208\n", + "F1 Score: 0.906329942637712\n", "--- Training Metrics ---\n", - "Accuracy: 0.9601990049751243\n", - "Precision: 0.9592846419093018\n", - "Recall: 0.9601990049751243\n", - "F1 Score: 0.9596426430405053\n", + "Accuracy: 1.0\n", + "Precision: 1.0\n", + "Recall: 1.0\n", + "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ImageNet_test_kenya_embeddings.csv:\n", + "Results for ReefCLR-french_polynesia_embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.8242424242424242\n", - "Precision: 0.8200522187178688\n", - "Recall: 0.8242424242424242\n", - "F1 Score: 0.8192826359903629\n", + "Accuracy: 0.9448775055679287\n", + "Precision: 0.9449035835575814\n", + "Recall: 0.9448775055679287\n", + "F1 Score: 0.9448761896669364\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ImageNet_test_french_polynesia_embeddings.csv:\n", + "Results for VGGish-australia-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.9615812917594655\n", - "Precision: 0.9617898113345116\n", - "Recall: 0.9615812917594655\n", - "F1 Score: 0.9615778970293851\n", + "Accuracy: 0.7883333333333333\n", + "Precision: 0.788962629726961\n", + "Recall: 0.7883333333333333\n", + "F1 Score: 0.7882180298162332\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n", "F1 Score: 1.0\n", "----------------------------------------\n", - "Results for ImageNet_test_australia_embeddings.csv:\n", + "Results for VGGish-bermuda-embeddings.csv:\n", "--- Test Metrics ---\n", - "Accuracy: 0.74\n", - "Precision: 0.7402161945751177\n", - "Recall: 0.74\n", - "F1 Score: 0.7399414868345378\n", + "Accuracy: 0.625\n", + "Precision: 0.6227494346615998\n", + "Recall: 0.625\n", + "F1 Score: 0.6129368689748227\n", + "--- Training Metrics ---\n", + "Accuracy: 0.9580668088130775\n", + "Precision: 0.9563598455915883\n", + "Recall: 0.9580668088130775\n", + "F1 Score: 0.9569416140540694\n", + "----------------------------------------\n", + "Results for VGGish-florida-embeddings.csv:\n", + "--- Test Metrics ---\n", + "Accuracy: 0.9495049504950495\n", + "Precision: 0.9493190993880304\n", + "Recall: 0.9495049504950495\n", + "F1 Score: 0.949384689150932\n", "--- Training Metrics ---\n", "Accuracy: 1.0\n", "Precision: 1.0\n", @@ -157,12 +230,6 @@ } ], "source": [ - "import os\n", - "import pandas as pd\n", - "from sklearn.ensemble import RandomForestClassifier\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n", - "\n", "# Function to calculate metrics\n", "def calculate_metrics(y_true, y_pred):\n", " accuracy = accuracy_score(y_true, y_pred)\n", @@ -171,8 +238,13 @@ " f1 = f1_score(y_true, y_pred, average='weighted')\n", " return accuracy, precision, recall, f1\n", "\n", + "# Initialize an empty DataFrame to store metrics\n", + "columns = ['Filename', 'Test Accuracy', 'Test Precision', 'Test Recall', 'Test F1',\n", + " 'Train Accuracy', 'Train Precision', 'Train Recall', 'Train F1']\n", + "results_df = pd.DataFrame(columns=columns)\n", + "\n", "# Path to the folder containing the CSV files\n", - "folder_path = '/home/ben/reef-audio-representation-learning/code/notebooks/embedding_extractor/embeddings'\n", + "folder_path = '/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/embeddings/raw_embeddings'\n", "\n", "# Loop through each file in the folder\n", "for filename in os.listdir(folder_path):\n", @@ -189,10 +261,10 @@ " y = df['Label']\n", " \n", " # Split the data into training and testing sets (80:20 ratio)\n", - " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n", + " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)\n", " \n", " # Initialize and train the Random Forest Classifier\n", - " clf = RandomForestClassifier(random_state=42)\n", + " clf = RandomForestClassifier(random_state=0)\n", " clf.fit(X_train, y_train)\n", " \n", " # Make predictions on test set\n", @@ -205,6 +277,20 @@ " # Calculate metrics for training set\n", " accuracy_train, precision_train, recall_train, f1_train = calculate_metrics(y_train, y_pred_train)\n", " \n", + " # Create a DataFrame for the new row and concatenate it to the existing DataFrame\n", + " new_row_df = pd.DataFrame({\n", + " 'Filename': [filename],\n", + " 'Test Accuracy': [accuracy_test],\n", + " 'Test Precision': [precision_test],\n", + " 'Test Recall': [recall_test],\n", + " 'Test F1': [f1_test],\n", + " 'Train Accuracy': [accuracy_train],\n", + " 'Train Precision': [precision_train],\n", + " 'Train Recall': [recall_train],\n", + " 'Train F1': [f1_train]\n", + " })\n", + " results_df = pd.concat([results_df, new_row_df], ignore_index=True)\n", + " \n", " # Print metrics\n", " print(f\"Results for {filename}:\")\n", " print(\"--- Test Metrics ---\")\n", @@ -217,7 +303,298 @@ " print(f\"Precision: {precision_train}\")\n", " print(f\"Recall: {recall_train}\")\n", " print(f\"F1 Score: {f1_train}\")\n", - " print(\"-\" * 40)" + " print(\"-\" * 40)\n", + " \n", + "\n", + "# Generate a timestamp\n", + "current_time = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + "\n", + "# Save the DataFrame to a CSV file with a timestamp in the filename\n", + "results_df.to_csv(f\"RF_results/RF_results-{current_time}.csv\", index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FilenameTest AccuracyTest PrecisionTest RecallTest F1Train AccuracyTrain PrecisionTrain RecallTrain F1
0ImageNet-kenya-embeddings.csv0.7058820.6900450.7058820.6954251.0000001.0000001.0000001.000000
1ImageNet-australia-embeddings.csv0.7425000.7435290.7425000.7422281.0000001.0000001.0000001.000000
2ImageNet-florida-embeddings.csv0.9099010.9090400.9099010.9092351.0000001.0000001.0000001.000000
3ImageNet-french_polynesia-embeddings.csv0.9677060.9677080.9677060.9677061.0000001.0000001.0000001.000000
4ImageNet-indonesia-embeddings.csv0.9725690.9736750.9725690.9729951.0000001.0000001.0000001.000000
5ReefCLR-indonesia_embeddings.csv0.9675810.9698800.9675810.9683991.0000001.0000001.0000001.000000
6ImageNet-bermuda-embeddings.csv0.5056820.4368830.5056820.4575950.9616200.9597610.9616200.959583
7ReefCLR-australia_embeddings.csv0.6625000.6625550.6625000.6624721.0000001.0000001.0000001.000000
8ReefCLR-bermuda_embeddings.csv0.6164770.5565760.6164770.5845620.9587780.9573280.9587780.957746
9ReefCLR-kenya_embeddings.csv0.8606060.8599900.8606060.8555971.0000001.0000001.0000001.000000
10ReefCLR-florida_embeddings.csv0.9079210.9070890.9079210.9063301.0000001.0000001.0000001.000000
11ReefCLR-french_polynesia_embeddings.csv0.9448780.9449040.9448780.9448761.0000001.0000001.0000001.000000
12VGGish-australia-embeddings.csv0.7883330.7889630.7883330.7882181.0000001.0000001.0000001.000000
13VGGish-bermuda-embeddings.csv0.6250000.6227490.6250000.6129370.9580670.9563600.9580670.956942
14VGGish-florida-embeddings.csv0.9495050.9493190.9495050.9493851.0000001.0000001.0000001.000000
\n", + "
" + ], + "text/plain": [ + " Filename Test Accuracy Test Precision \\\n", + "0 ImageNet-kenya-embeddings.csv 0.705882 0.690045 \n", + "1 ImageNet-australia-embeddings.csv 0.742500 0.743529 \n", + "2 ImageNet-florida-embeddings.csv 0.909901 0.909040 \n", + "3 ImageNet-french_polynesia-embeddings.csv 0.967706 0.967708 \n", + "4 ImageNet-indonesia-embeddings.csv 0.972569 0.973675 \n", + "5 ReefCLR-indonesia_embeddings.csv 0.967581 0.969880 \n", + "6 ImageNet-bermuda-embeddings.csv 0.505682 0.436883 \n", + "7 ReefCLR-australia_embeddings.csv 0.662500 0.662555 \n", + "8 ReefCLR-bermuda_embeddings.csv 0.616477 0.556576 \n", + "9 ReefCLR-kenya_embeddings.csv 0.860606 0.859990 \n", + "10 ReefCLR-florida_embeddings.csv 0.907921 0.907089 \n", + "11 ReefCLR-french_polynesia_embeddings.csv 0.944878 0.944904 \n", + "12 VGGish-australia-embeddings.csv 0.788333 0.788963 \n", + "13 VGGish-bermuda-embeddings.csv 0.625000 0.622749 \n", + "14 VGGish-florida-embeddings.csv 0.949505 0.949319 \n", + "\n", + " Test Recall Test F1 Train Accuracy Train Precision Train Recall \\\n", + "0 0.705882 0.695425 1.000000 1.000000 1.000000 \n", + "1 0.742500 0.742228 1.000000 1.000000 1.000000 \n", + "2 0.909901 0.909235 1.000000 1.000000 1.000000 \n", + "3 0.967706 0.967706 1.000000 1.000000 1.000000 \n", + "4 0.972569 0.972995 1.000000 1.000000 1.000000 \n", + "5 0.967581 0.968399 1.000000 1.000000 1.000000 \n", + "6 0.505682 0.457595 0.961620 0.959761 0.961620 \n", + "7 0.662500 0.662472 1.000000 1.000000 1.000000 \n", + "8 0.616477 0.584562 0.958778 0.957328 0.958778 \n", + "9 0.860606 0.855597 1.000000 1.000000 1.000000 \n", + "10 0.907921 0.906330 1.000000 1.000000 1.000000 \n", + "11 0.944878 0.944876 1.000000 1.000000 1.000000 \n", + "12 0.788333 0.788218 1.000000 1.000000 1.000000 \n", + "13 0.625000 0.612937 0.958067 0.956360 0.958067 \n", + "14 0.949505 0.949385 1.000000 1.000000 1.000000 \n", + "\n", + " Train F1 \n", + "0 1.000000 \n", + "1 1.000000 \n", + "2 1.000000 \n", + "3 1.000000 \n", + "4 1.000000 \n", + "5 1.000000 \n", + "6 0.959583 \n", + "7 1.000000 \n", + "8 0.957746 \n", + "9 1.000000 \n", + "10 1.000000 \n", + "11 1.000000 \n", + "12 1.000000 \n", + "13 0.956942 \n", + "14 1.000000 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results_df" ] } ], diff --git a/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all.sh b/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all.sh index 5563ae8..7bbb375 100755 --- a/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all.sh +++ b/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all.sh @@ -5,11 +5,14 @@ configs=("config_bermuda.yml" "config_kenya.yml" "config_florida.yml" "config_fr # Set the desired batch_size and num_epochs IF ADDING HERE, ALSO ADD TO THE FOR LOOP BELOW batch_size=256 -num_epochs=2 +num_epochs=100 learning_rate=0.001 train_percent=0.8 # may want to change by dataset starting_weights="ImageNet" # "ReefCLR" or "ImageNet" - should always be ImageNet for fully training! finetune=False +transform=False +device="cuda:0" +wandb_project="Fully_trained_ResNet2" # to add: starting weights, learning rate etc # to do: name the wandb somthing sensible. @@ -25,6 +28,9 @@ for config in "${configs[@]}"; do sed -i "s/train_percent: .*/train_percent: $train_percent/" multiple_config_runs/$config sed -i "s/starting_weights: .*/starting_weights: $starting_weights/" multiple_config_runs/$config sed -i "s/finetune: .*/finetune: $finetune/" multiple_config_runs/$config + sed -i "s/transform: .*/transform: $transform/" multiple_config_runs/$config + sed -i "s/device: .*/device: $device/" multiple_config_runs/$config + sed -i "s/wandb_project: .*/wandb_project: $wandb_project/" multiple_config_runs/$config python train_eval.py --config multiple_config_runs/$config diff --git a/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all_augs.sh b/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all_augs.sh index 8644606..269f2d4 100755 --- a/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all_augs.sh +++ b/code/simclr-pytorch-reefs/evaluation/fully_train_resnet_all_augs.sh @@ -12,7 +12,7 @@ starting_weights="ImageNet" # "ReefCLR" or "ImageNet" - should always be ImageNe finetune=False # True = train only final layer, False = train all layers transform=True device="cuda:1" -wandb_project="Fully_trained_ResNet_augmented" +wandb_project="Fully_trained_ResNet_augmented2" # to add: starting weights, learning rate etc # to do: name the wandb somthing sensible. diff --git a/code/simclr-pytorch-reefs/evaluation/model_states/config.yaml b/code/simclr-pytorch-reefs/evaluation/model_states/config.yaml new file mode 100644 index 0000000..ff082bb --- /dev/null +++ b/code/simclr-pytorch-reefs/evaluation/model_states/config.yaml @@ -0,0 +1,24 @@ +batch_size: 64 +data_path: /mnt/ssd-cluster/ben/data/full_dataset/ +data_root: /mnt/ssd-cluster/ben/data/full_dataset/ +device: cuda:1 +finetune: false +image_size: +- 224 +- 224 +inference_weights: /root/ct_classifier/model_states/resnet50_10p_200epochs.pt +json_path: /home/ben/reef-audio-representation-learning/data/dataset.json +learning_rate: 0.001 +num_classes: 2 +num_epochs: 100 +num_workers: 4 +seed: 0 +starting_weights: ImageNet +test_dataset: test_florida +test_label_file: /root/10_percent_test_with_unknown.csv +train_label_file: +- /root/10_percent_train_with_unknown.csv +train_percent: 0.8 +unlabeled_file: /root/75_percent_unlabeled_with_unknown.csv +val_label_file: /root/5_percent_val_with_unknown.csv +weight_decay: 0.001 diff --git a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_australia.yml b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_australia.yml index 92fce4e..31a3af1 100644 --- a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_australia.yml +++ b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_australia.yml @@ -16,10 +16,14 @@ data_path: /mnt/ssd-cluster/ben/data/full_dataset/ json_path: /home/ben/reef-audio-representation-learning/data/dataset.json # Hyper parameters -num_epochs: 2 -batch_size: 256 +num_epochs: 100 +batch_size: 64 learning_rate: 0.001 weight_decay: 0.001 +transform: True + +#wandb project +wandb_project: Fully_trained_ResNet_augmented2 # Not to change finetune: False @@ -28,7 +32,7 @@ image_size: [224, 224] # environment/computational parameters seed: 0 # random number generator seed (long integer value) -device: cuda +device: cuda:1 num_workers: 4 diff --git a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_bermuda.yml b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_bermuda.yml index d6eaf20..54e42b7 100644 --- a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_bermuda.yml +++ b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_bermuda.yml @@ -16,10 +16,14 @@ data_path: /mnt/ssd-cluster/ben/data/full_dataset/ json_path: /home/ben/reef-audio-representation-learning/data/dataset.json # Hyper parameters -num_epochs: 2 -batch_size: 256 +num_epochs: 100 +batch_size: 64 learning_rate: 0.001 weight_decay: 0.001 +transform: True + +#wandb project +wandb_project: Fully_trained_ResNet_augmented2 # Not to change finetune: False @@ -28,7 +32,7 @@ image_size: [224, 224] # environment/computational parameters seed: 0 # random number generator seed (long integer value) -device: cuda +device: cuda:1 num_workers: 4 diff --git a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_florida.yml b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_florida.yml index 6f6a7bc..5e84b51 100644 --- a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_florida.yml +++ b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_florida.yml @@ -16,10 +16,14 @@ data_path: /mnt/ssd-cluster/ben/data/full_dataset/ json_path: /home/ben/reef-audio-representation-learning/data/dataset.json # Hyper parameters -num_epochs: 2 -batch_size: 256 +num_epochs: 100 +batch_size: 64 learning_rate: 0.001 weight_decay: 0.001 +transform: True + +#wandb project +wandb_project: Fully_trained_ResNet_augmented2 # Not to change finetune: False @@ -28,7 +32,7 @@ image_size: [224, 224] # environment/computational parameters seed: 0 # random number generator seed (long integer value) -device: cuda +device: cuda:1 num_workers: 4 diff --git a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_french_polynesia.yml b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_french_polynesia.yml index 9fe332a..ba09f37 100644 --- a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_french_polynesia.yml +++ b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_french_polynesia.yml @@ -16,10 +16,14 @@ data_path: /mnt/ssd-cluster/ben/data/full_dataset/ json_path: /home/ben/reef-audio-representation-learning/data/dataset.json # Hyper parameters -num_epochs: 2 -batch_size: 256 +num_epochs: 100 +batch_size: 64 learning_rate: 0.001 weight_decay: 0.001 +transform: True + +#wandb project +wandb_project: Fully_trained_ResNet_augmented2 # Not to change finetune: False @@ -28,7 +32,7 @@ image_size: [224, 224] # environment/computational parameters seed: 0 # random number generator seed (long integer value) -device: cuda +device: cuda:1 num_workers: 4 diff --git a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_indonesia.yml b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_indonesia.yml index baf65b8..b774ca8 100644 --- a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_indonesia.yml +++ b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_indonesia.yml @@ -16,10 +16,14 @@ data_path: /mnt/ssd-cluster/ben/data/full_dataset/ json_path: /home/ben/reef-audio-representation-learning/data/dataset.json # Hyper parameters -num_epochs: 2 -batch_size: 256 +num_epochs: 100 +batch_size: 64 learning_rate: 0.001 weight_decay: 0.001 +transform: True + +#wandb project +wandb_project: Fully_trained_ResNet_augmented2 # Not to change finetune: False @@ -28,7 +32,7 @@ image_size: [224, 224] # environment/computational parameters seed: 0 # random number generator seed (long integer value) -device: cuda +device: cuda:1 num_workers: 4 diff --git a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_kenya.yml b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_kenya.yml index 290b448..c9de147 100644 --- a/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_kenya.yml +++ b/code/simclr-pytorch-reefs/evaluation/multiple_config_runs/config_kenya.yml @@ -16,10 +16,14 @@ data_path: /mnt/ssd-cluster/ben/data/full_dataset/ json_path: /home/ben/reef-audio-representation-learning/data/dataset.json # Hyper parameters -num_epochs: 2 -batch_size: 256 +num_epochs: 100 +batch_size: 64 learning_rate: 0.001 weight_decay: 0.001 +transform: True + +#wandb project +wandb_project: Fully_trained_ResNet_augmented2 # Not to change finetune: False @@ -28,7 +32,7 @@ image_size: [224, 224] # environment/computational parameters seed: 0 # random number generator seed (long integer value) -device: cuda +device: cuda:1 num_workers: 4 diff --git a/code/simclr-pytorch-reefs/evaluation/train_eval.py b/code/simclr-pytorch-reefs/evaluation/train_eval.py index 5dfe905..2546384 100644 --- a/code/simclr-pytorch-reefs/evaluation/train_eval.py +++ b/code/simclr-pytorch-reefs/evaluation/train_eval.py @@ -40,10 +40,11 @@ def create_dataloader(cfg, split='test_data', transform=False, train_percent=Non PyTorch DataLoader object. ''' #dataset_instance = CTDataset(cfg, split) # create an object instance of our CTDataset class + to_transform = cfg['transform'] if train_test == 'train': - dataset_instance = CTDataset_train(cfg, split=split, transform=transform, train_percent=train_percent) + dataset_instance = CTDataset_train(cfg, split=split, transform=to_transform, train_percent=train_percent) elif train_test == 'test': - dataset_instance = CTDataset_test(cfg, split=split, transform=False, train_percent=train_percent) + dataset_instance = CTDataset_test(cfg, split=split, transform=to_transform, train_percent=train_percent) device = cfg['device'] @@ -109,6 +110,8 @@ def load_pretrained_weights(cfg, model, starting_weights): parameters = list(filter(lambda p: p.requires_grad, model.parameters())) assert len(parameters) == 2 # classifier.weight, classifier.bias + else: + pass return model @@ -123,11 +126,11 @@ def save_model(cfg, epoch, model, stats): # ...and save torch.save(stats, open(f'model_states_i2map_simclr/10p_{epoch}.pt', 'wb')) - # also save config file if not present - cfpath = 'model_states/config.yaml' - if not os.path.exists(cfpath): - with open(cfpath, 'w') as f: - yaml.dump(cfg, f) + # # also save config file if not present + # cfpath = 'model_states/config.yaml' + # if not os.path.exists(cfpath): + # with open(cfpath, 'w') as f: + # yaml.dump(cfg, f) @@ -160,7 +163,11 @@ def train(cfg, dataLoader, model, optimizer, class_weights_train): # loss function criterion = nn.CrossEntropyLoss(class_weights_train) - #criterion = nn.CrossEntropyLoss() + #criterion = nn.BCELoss() ############################################################################################### + ############################################## BCELoss() ############################################################## + ############################################## BCELoss() ############################################################## + ############################################## BCELoss() ############################################################## + ############################################## BCELoss() ############################################################## # running averages loss_total, oa_total, f1 = 0.0, 0.0, 0.0 # for now, we just log the loss and overall accuracy (OA) @@ -323,10 +330,9 @@ def main(): now = datetime.now() time_stamp = now.strftime("%y%m%d%H%M") - - # for extracting country from test dataset name + # get country name def extract_after_underscore(s): - return s.split("_")[1] + return "_".join(s.split("_")[1:]) country = extract_after_underscore(cfg['test_dataset']) # get model type used @@ -336,11 +342,11 @@ def extract_after_underscore(s): base_weights = 'ReefCLR' # name it - run_name = base_weights +'-' + country + '-' + time_stamp + run_name = base_weights + str(cfg['batch_size']) +'-' + country + '-' + time_stamp # Initialize the wandb run with the generated name - wandb.init(project="Fully trained ResNets", name=run_name, + wandb.init(project=cfg['wandb_project'], name=run_name, # what hyperparams to note config={ "learning_rate": cfg['learning_rate'], @@ -352,15 +358,15 @@ def extract_after_underscore(s): # initialize data loaders for training and validation set - dl_train, class_weights_train = create_dataloader(cfg, split='test_data', transform=False, train_percent = cfg['train_percent'], train_test = 'train') - dl_val, class_weights_val = create_dataloader(cfg, split='test_data', transform=False, train_percent = cfg['train_percent'], train_test = 'test') + dl_train, class_weights_train = create_dataloader(cfg, split='test_data', transform=cfg['transform'], train_percent = cfg['train_percent'], train_test = 'train') + dl_val, class_weights_val = create_dataloader(cfg, split='test_data', transform=cfg['transform'], train_percent = cfg['train_percent'], train_test = 'test') # initialize model model, current_epoch = load_model(cfg) if cfg['starting_weights'] == 'ReefCLR': - starting_weights="/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/logs/exman-train.py/runs/baseline/checkpoint-5100.pth.tar" + starting_weights="/home/ben/reef-audio-representation-learning/scratch/baseline/checkpoint-5100.pth.tar" print (f'loading custom starting weights: {starting_weights}') model = load_pretrained_weights(cfg, model, starting_weights) @@ -379,7 +385,7 @@ def extract_after_underscore(s): csv_path = '/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/log_metrics/' + run_name + '.csv' with open(csv_path, 'w') as f: writer = csv.writer(f) - writer.writerow(['Epoch', 'F1 - val:', 'Accuracy - val', 'Balanced accuracy - val', 'Loss - val', + writer.writerow(['Epoch', 'F1 - val', 'Accuracy - val', 'Balanced accuracy - val', 'Loss - val', 'F1 - train', 'Accuracy - train', 'Balanced accuracy - train', 'Loss - train']) # we have everything now: data loaders, model, optimizer, metrics; let's do the epochs! @@ -394,7 +400,7 @@ def extract_after_underscore(s): # combine stats and save stats = { - 'F1 - val:': f1_val, + 'F1 - val': f1_val, 'Accuracy - val': oa_val, 'Balanced accuracy - val':bac_val, 'Loss - val': loss_val, @@ -406,7 +412,7 @@ def extract_after_underscore(s): wandb.log(stats) metrics[current_epoch] = { - 'F1 - val:': f1_val, + 'F1 - val': f1_val, 'Accuracy - val': oa_val, 'Balanced accuracy - val':bac_val, 'Loss - val': loss_val, @@ -423,26 +429,13 @@ def extract_after_underscore(s): # Log to W&B wandb.log(metrics[current_epoch]) - if current_epoch % 40 ==0: - save_model(cfg, current_epoch, model, stats) - + # if current_epoch % 40 ==0: + # save_model(cfg, current_epoch, model, stats) - # csv_path = '/home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/log_metrics/' + run_name + '.csv' - # with open(csv_path, 'w') as f: - # writer = csv.writer(f) - - # # Write header - # writer.writerow(['Epoch', 'F1 - val:', 'Accuracy - val', 'Balanced accuracy - val', 'Loss - val', - # 'F1 - train', 'Accuracy - train', 'Balanced accuracy - train', 'Loss - train']) - - # # Write each row - # for epoch in metrics: - # row = [epoch] + list(metrics[epoch].values()) - # writer.writerow(row) # Log entire metrics dict at the end - wandb.log({"metrics": metrics}) + # wandb.log({"metrics": metrics}) wandb.finish() diff --git a/remove.txt b/remove.txt deleted file mode 100644 index ef328e7..0000000 --- a/remove.txt +++ /dev/null @@ -1,5 +0,0 @@ -code/notebooks/embedding_extractor/embeddings/ -home/ben/reef-audio-representation-learning/code/simclr-pytorch-reefs/evaluation/embeddings/raw_embeddings - -home/ben/reef-audio-representation-learning/scratch/baseline -scratch/baseline \ No newline at end of file