diff --git a/docs/notebooks/introduction.ipynb b/docs/notebooks/introduction.ipynb index bdfb74d..43b1e0b 100644 --- a/docs/notebooks/introduction.ipynb +++ b/docs/notebooks/introduction.ipynb @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "013dbcb4", "metadata": {}, "outputs": [], @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "2601dd00-7bd2-49d5-9bdf-a84205872890", "metadata": {}, "outputs": [], @@ -71,15 +71,15 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "d7a98ea2-100f-43ef-8c45-c786ddcd313e", "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "CUDA-enabled GPU/TPU is available.\n" + "No CUDA-enabled GPU found, using CPU.\n" ] } ], @@ -107,115 +107,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "1df49737-dc02-4d6b-acd7-d03b79f18a29", "metadata": { "scrolled": true }, "outputs": [ { + "output_type": "execute_result", "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", - "
horThagemenostattsizetgradepnodesprogrecestrectimecens
0no70Post21II3486618141
1yes56Post12II7617720181
2yes58Post35II9522717121
3yes59Post17II4602918071
4no73Post35II126657721
\n", - "
" - ], "text/plain": [ " horTh age menostat tsize tgrade pnodes progrec estrec time cens\n", "0 no 70 Post 21 II 3 48 66 1814 1\n", @@ -223,11 +123,11 @@ "2 yes 58 Post 35 II 9 52 271 712 1\n", "3 yes 59 Post 17 II 4 60 29 1807 1\n", "4 no 73 Post 35 II 1 26 65 772 1" - ] + ], + "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
horThagemenostattsizetgradepnodesprogrecestrectimecens
0no70Post21II3486618141
1yes56Post12II7617720181
2yes58Post35II9522717121
3yes59Post17II4602918071
4no73Post35II126657721
\n
" }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "execution_count": 4 } ], "source": [ @@ -270,119 +170,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "7a5fd9ef-2643-46b7-9c98-05ff919026ea", "metadata": {}, "outputs": [ { + "output_type": "execute_result", "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", - "
agetsizepnodesprogrecestrectimecenshorTh_yesmenostat_Pretgrade_IItgrade_III
070.021.03.048.066.01814.01.00.00.01.00.0
156.012.07.061.077.02018.01.01.00.01.00.0
258.035.09.052.0271.0712.01.01.00.01.00.0
359.017.04.060.029.01807.01.01.00.01.00.0
473.035.01.026.065.0772.01.00.00.01.00.0
\n", - "
" - ], "text/plain": [ " age tsize pnodes progrec estrec time cens horTh_yes \\\n", "0 70.0 21.0 3.0 48.0 66.0 1814.0 1.0 0.0 \n", @@ -397,11 +191,11 @@ "2 0.0 1.0 0.0 \n", "3 0.0 1.0 0.0 \n", "4 0.0 1.0 0.0 " - ] + ], + "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
agetsizepnodesprogrecestrectimecenshorTh_yesmenostat_Pretgrade_IItgrade_III
070.021.03.048.066.01814.01.00.00.01.00.0
156.012.07.061.077.02018.01.01.00.01.00.0
258.035.09.052.0271.0712.01.01.00.01.00.0
359.017.04.060.029.01807.01.01.00.01.00.0
473.035.01.026.065.0772.01.00.00.01.00.0
\n
" }, - "execution_count": 6, "metadata": {}, - "output_type": "execute_result" + "execution_count": 5 } ], "source": [ @@ -416,13 +210,13 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "0f8b7f3b-fb2a-4d74-ac99-8f6390b2f5eb", "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "(Sample size) Training:336 | Validation:144 |Testing:206\n" ] @@ -470,13 +264,10 @@ "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "x (shape) = torch.Size([128, 9])\n", - "num_features = 9\n", - "event = torch.Size([128])\n", - "time = torch.Size([128])\n" + "x (shape) = torch.Size([32, 9])\nnum_features = 9\nevent = torch.Size([32])\ntime = torch.Size([32])\n" ] } ], @@ -600,6 +391,95 @@ " )" ] }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# print statements to get an idea of what the network is doing\n", + "# same as above just added print statements\n", + "\n", + "# create a funciton to print each layer of a sequential\n", + "class PrintLayer(torch.nn.Module):\n", + " def __init__(self):\n", + " super(PrintLayer, self).__init__()\n", + " \n", + " def forward(self, x):\n", + " # Do your print / debug stuff here\n", + " print(x.shape)\n", + " return x\n", + "\n", + "# create a new cox model that includes the print function in between layers where we want it\n", + "cox_model = torch.nn.Sequential(\n", + " torch.nn.BatchNorm1d(num_features), # Batch normalization\n", + " PrintLayer(),\n", + " torch.nn.Linear(num_features, 32),\n", + " PrintLayer(),\n", + " torch.nn.ReLU(),\n", + " torch.nn.Dropout(),\n", + " torch.nn.Linear(32, 64),\n", + " PrintLayer(),\n", + " torch.nn.ReLU(),\n", + " torch.nn.Dropout(),\n", + " torch.nn.Linear(64, 1), \n", + " PrintLayer(), # Estimating log hazards for Cox models\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "x (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([32, 9])\ntorch.Size([32, 9])\ntorch.Size([32, 32])\ntorch.Size([32, 64])\ntorch.Size([32, 1])\nx (shape) = torch.Size([16, 9])\ntorch.Size([16, 9])\ntorch.Size([16, 32])\ntorch.Size([16, 64])\ntorch.Size([16, 1])\n" + ] + } + ], + "source": [ + "\n", + "torch.manual_seed(42)\n", + "\n", + "# Init optimizer for Cox\n", + "optimizer = torch.optim.Adam(cox_model.parameters(), lr=LEARNING_RATE)\n", + "\n", + "# Initiate empty list to store the loss on the train and validation sets\n", + "train_losses = []\n", + "val_losses = []\n", + "\n", + "# training loop\n", + "for epoch in range(EPOCHS):\n", + " epoch_loss = torch.tensor(0.0)\n", + " for i, batch in enumerate(dataloader_train):\n", + " x, (event, time) = batch\n", + " print(f\"x (shape) = {x.shape}\")\n", + " optimizer.zero_grad()\n", + " log_hz = cox_model(x) # shape = (16, 1)\n", + " loss = neg_partial_log_likelihood(log_hz, event, time, reduction=\"mean\")\n", + " loss.backward()\n", + " optimizer.step()\n", + " epoch_loss += loss.detach()\n", + " break\n", + "\n", + " if epoch % (EPOCHS // 10) == 0:\n", + " print(f\"Epoch: {epoch:03}, Training loss: {epoch_loss:0.2f}\")\n", + "\n", + " # Reccord loss on train and test sets\n", + " epoch_loss /= i + 1\n", + " train_losses.append(epoch_loss)\n", + " with torch.no_grad():\n", + " x, (event, time) = next(iter(dataloader_val))\n", + " val_losses.append(\n", + " neg_partial_log_likelihood(cox_model(x), event, time, reduction=\"mean\")\n", + " )" + ] + }, { "cell_type": "markdown", "id": "0e2bdd8c-f84c-4003-98f4-220ddab518d1", @@ -1183,7 +1063,7 @@ ], "metadata": { "kernelspec": { - "display_name": "torchsurv_env", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1197,9 +1077,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.10.15" } }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/docs/notebooks/momentum.ipynb b/docs/notebooks/momentum.ipynb index d7d8082..7751fc6 100644 --- a/docs/notebooks/momentum.ipynb +++ b/docs/notebooks/momentum.ipynb @@ -22,32 +22,126 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "id": "d31df87a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0mLooking in indexes: https://artifactory.f1.novartis.net/artifactory/api/pypi/f1-all-all-pythonhosted-remote-pypi/simple\n", + "Requirement already satisfied: lightning in /home/demboso1/conda-env/lib/python3.10/site-packages (2.4.0)\n", + "Requirement already satisfied: PyYAML<8.0,>=5.4 in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (6.0.2)\n", + "Requirement already satisfied: fsspec<2026.0,>=2022.5.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from fsspec[http]<2026.0,>=2022.5.0->lightning) (2024.10.0)\n", + "Requirement already satisfied: lightning-utilities<2.0,>=0.10.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (0.11.8)\n", + "Requirement already satisfied: packaging<25.0,>=20.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (24.2)\n", + "Requirement already satisfied: torch<4.0,>=2.1.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (2.5.1)\n", + "Requirement already satisfied: torchmetrics<3.0,>=0.7.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (1.6.0)\n", + "Requirement already satisfied: tqdm<6.0,>=4.57.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (4.67.0)\n", + "Requirement already satisfied: typing-extensions<6.0,>=4.4.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (4.12.2)\n", + "Requirement already satisfied: pytorch-lightning in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning) (2.4.0)\n", + "Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from fsspec[http]<2026.0,>=2022.5.0->lightning) (3.11.6)\n", + "Requirement already satisfied: setuptools in /home/demboso1/conda-env/lib/python3.10/site-packages (from lightning-utilities<2.0,>=0.10.0->lightning) (75.3.0)\n", + "Requirement already satisfied: filelock in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (3.16.1)\n", + "Requirement already satisfied: networkx in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (3.4.2)\n", + "Requirement already satisfied: jinja2 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (3.1.4)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (12.4.127)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (12.4.127)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (12.4.127)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (9.1.0.70)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (12.4.5.8)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (11.2.1.3)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (10.3.5.147)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (11.6.1.9)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (12.3.1.170)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (2.21.5)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (12.4.127)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (12.4.127)\n", + "Requirement already satisfied: triton==3.1.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (3.1.0)\n", + "Requirement already satisfied: sympy==1.13.1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch<4.0,>=2.1.0->lightning) (1.13.1)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from sympy==1.13.1->torch<4.0,>=2.1.0->lightning) (1.3.0)\n", + "Requirement already satisfied: numpy>1.20.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torchmetrics<3.0,>=0.7.0->lightning) (2.1.3)\n", + "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (2.4.3)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (1.3.1)\n", + "Requirement already satisfied: attrs>=17.3.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (24.2.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (1.5.0)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (6.1.0)\n", + "Requirement already satisfied: propcache>=0.2.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (0.2.0)\n", + "Requirement already satisfied: yarl<2.0,>=1.17.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (1.17.2)\n", + "Requirement already satisfied: async-timeout<6.0,>=4.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (5.0.1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from jinja2->torch<4.0,>=2.1.0->lightning) (3.0.2)\n", + "Requirement already satisfied: idna>=2.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from yarl<2.0,>=1.17.0->aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2026.0,>=2022.5.0->lightning) (3.10)\n", + "\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n", + "\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0mLooking in indexes: https://artifactory.f1.novartis.net/artifactory/api/pypi/f1-all-all-pythonhosted-remote-pypi/simple\n", + "Requirement already satisfied: matplotlib in /home/demboso1/conda-env/lib/python3.10/site-packages (3.9.2)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (1.3.1)\n", + "Requirement already satisfied: cycler>=0.10 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (4.55.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (1.4.7)\n", + "Requirement already satisfied: numpy>=1.23 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (2.1.3)\n", + "Requirement already satisfied: packaging>=20.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (24.2)\n", + "Requirement already satisfied: pillow>=8 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (11.0.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (3.2.0)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /home/demboso1/conda-env/lib/python3.10/site-packages (from matplotlib) (2.9.0.post0)\n", + "Requirement already satisfied: six>=1.5 in /home/demboso1/conda-env/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", + "\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n", + "\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0mLooking in indexes: https://artifactory.f1.novartis.net/artifactory/api/pypi/f1-all-all-pythonhosted-remote-pypi/simple\n", + "Collecting torchvision\n", + " Downloading https://artifactory.f1.novartis.net/artifactory/api/pypi/f1-all-all-pythonhosted-remote-pypi/packages/packages/a2/f6/7ff89a9f8703f623f5664afd66c8600e3f09fe188e1e0b7e6f9a8617f865/torchvision-0.20.1-cp310-cp310-manylinux1_x86_64.whl (7.2 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.2/7.2 MB\u001b[0m \u001b[31m29.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: numpy in /home/demboso1/conda-env/lib/python3.10/site-packages (from torchvision) (2.1.3)\n", + "Requirement already satisfied: torch==2.5.1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torchvision) (2.5.1)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torchvision) (11.0.0)\n", + "Requirement already satisfied: filelock in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (3.16.1)\n", + "Requirement already satisfied: typing-extensions>=4.8.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (4.12.2)\n", + "Requirement already satisfied: networkx in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (3.4.2)\n", + "Requirement already satisfied: jinja2 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (3.1.4)\n", + "Requirement already satisfied: fsspec in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (2024.10.0)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (12.4.127)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (12.4.127)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (12.4.127)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (9.1.0.70)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (12.4.5.8)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (11.2.1.3)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (10.3.5.147)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (11.6.1.9)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (12.3.1.170)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (2.21.5)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (12.4.127)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (12.4.127)\n", + "Requirement already satisfied: triton==3.1.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (3.1.0)\n", + "Requirement already satisfied: sympy==1.13.1 in /home/demboso1/conda-env/lib/python3.10/site-packages (from torch==2.5.1->torchvision) (1.13.1)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from sympy==1.13.1->torch==2.5.1->torchvision) (1.3.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /home/demboso1/conda-env/lib/python3.10/site-packages (from jinja2->torch==2.5.1->torchvision) (3.0.2)\n", + "\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0mInstalling collected packages: torchvision\n", + "\u001b[33mWARNING: Ignoring invalid distribution -ympy (/home/demboso1/conda-env/lib/python3.10/site-packages)\u001b[0m\u001b[33m\n", + "\u001b[0mSuccessfully installed torchvision-0.20.1\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ "# Install only required packages (optional)\n", - "# %pip install lightning\n", - "# %pip install matplotlib\n", - "# %pip install torchvision" + "%pip install lightning\n", + "%pip install matplotlib\n", + "%pip install torchvision" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "id": "eac2861e-9c15-4ab6-85b0-f8120a07119f", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/corolth1/anaconda3/envs/torchsurv/lib/python3.10/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" - ] - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import torch\n", @@ -60,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "id": "85c14ecf-33f2-4b48-bc94-db582e02bc8f", "metadata": {}, "outputs": [], @@ -71,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "id": "307fea5f-9a28-4258-90ea-05c3793d5a59", "metadata": {}, "outputs": [], @@ -83,18 +177,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "dc09dd82", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Seed set to 123\n" - ] - } - ], + "outputs": [], "source": [ "from lightning.pytorch import seed_everything\n", "\n", @@ -103,15 +189,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "id": "ebaf967b", "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "CUDA-enabled GPU/TPU is available.\n" + "No CUDA-enabled GPU found, using CPU.\n" ] } ], @@ -127,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "id": "794004c5-588c-4590-ae96-c6d9e52109ff", "metadata": {}, "outputs": [], @@ -158,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 15, "id": "4abbc6b0", "metadata": {}, "outputs": [], @@ -176,21 +262,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "ebf5caff", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABCcAAADtCAYAAACMCR9lAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACxbklEQVR4nO39e5ysV1Xnj3+q636v6vs5yclJcAhKTkCJEohiEsHEjITJwEwYeA0TQDEOJBJIBuQbhYRLEsAJ+FIiMjJJiKPxAipoVE4Ugk7wJQYwXDSDmpxc+/St7tfuruf3R36ffdaz66nuru6qrtt6v17Pq6rrVFdX1XnWs/f+7LU+y+c4jgNFURRFURRFURRFUZQBMTXoN6AoiqIoiqIoiqIoymSj4oSiKIqiKIqiKIqiKANFxQlFURRFURRFURRFUQaKihOKoiiKoiiKoiiKogwUFScURVEURVEURVEURRkoKk4oiqIoiqIoiqIoijJQVJxQFEVRFEVRFEVRFGWgqDihKIqiKIqiKIqiKMpAUXFCURRFURRFURRFUZSBMjHixIMPPoibbroJ+Xy+7d8uuugiXHTRRQf+nvbKn/zJn+DCCy9EKpVCPB7HOeecg0996lODflt9Y7v/u35TKpXwrne9C5dccgnm5ubg8/lw0003Hfj7GDTjED8XXXQRfD5fx2NpaWnQb7EvaPwMB+MQQ0THoINDY+hZxiV+/vIv/xI/+qM/img0inQ6jcsvvxzf+c53Bv22+orGz3AwLjEk+aVf+iX4fD4cO3Zs0G+lr0xaDE2UOHHzzTd7/sfecccduOOOOw7+Te2B2267Da9+9atx7Ngx/P7v/z4+//nP461vfSuazeag31rf2O7/rt+sra3hU5/6FBqNBq644ooD//vDwjjEzx133IGvfvWrruOv/uqvEAwG8ZKXvASLi4uDfot9QeNnOBiHGAJ0DDpoNIaeZRzi50/+5E9w2WWXYX5+Hp/97GfxyU9+Et/73vfwspe9DP/6r/866LfXNzR+hoNxiCHJN7/5TfzKr/wKFhYWBv1W+s6kxVDgQP7KkPP85z9/0G9hVzz00EO48cYbceutt+Jd73qXefzlL3/5AN/VeHP06FHkcjn4fD6srq7it37rtwb9loaOUYkfr/d59913Y2NjAz/7sz87gHc0/mj87I5RiSEdgw4ejaGdGZX4efe7341zzz0Xn/vc5+Dz+QAAF1xwAc4++2y8973vxf/5P/9nwO9w/ND42R2jEkNkc3MTb3rTm3D11VfjH//xH7G6ujrotzS2DCSGnAngfe97nwOg7fjSl77kOI7jXHjhhc6FF15onv/oo486AJyPfOQjzm233eYcPXrUiUQizoUXXug88sgjTrPZdN797nc7hw4dclKplHPFFVc4J0+ebPu79957r/OSl7zEicViTjwedy655BLn61//+p4/xxvf+EYnGo061Wp1z6/hxTPPPOP83M/9nHPaaac5wWDQOfPMM52bbrrJ2djYcBzHcZrNpjM3N+f81//6X9t+N5fLOZFIxHnHO95hHisUCs7111/vnHnmmU4wGHQOHz7svP3tb3fK5bLrdwE4b3vb25zPfOYzzvd///c70WjUecELXuB84QtfMM/Z6f/uIFlZWXEAOO973/sO/G8PknGJHy9e9rKXOYlEwimVSnt+DY2f3TGp8eM44xNDOgZpDA2CcYif1dVVB4Dz7ne/u+3fXvSiFzmxWMzZ3Nzc02tr/OyOSY0fxxmPGJJ84AMfcM444wynVCo5F154oXPOOefs6/U0hnbHQcXQRIgTTzzxhHPttdc6AJzPfe5zzle/+lXnq1/9qlMoFBzH6RyUR48edS6//HLnT//0T53f/u3fdhYWFpyzzz7becMb3uC8+c1vdv78z//c+eQnP+kkEgnn8ssvd/3ND33oQ47P53Pe/OY3O3/6p3/qfO5zn3Ne+tKXOvF43PnOd77T9reuuuqqHT/Hc57zHOdFL3qRc8899zhnn322MzU15Zx22mnOu9/9bqfRaOzpu3nmmWecI0eOOEePHnV+8zd/07n//vudD3zgA044HHbe+MY3mue94x3vcKLRqPnOyB133OEAcB5++GHHcRynUqk4P/iDP+jMzs46t99+u3P//fc7v/qrv+qk02nnJ37iJ5xWq2V+F4Bz5plnOi9+8Yud3//933fuu+8+56KLLnICgYDzr//6r47j7Px/50Wr1XI2NjZ2dXTDpA5s4xI/Nv/v//0/B4Dzsz/7s3v6XhxH46cbJjV+HGd8YkjHII2hQTAO8fP00087AJz3vve9bf/20pe+1AHgPPLII11/Nxo/u2dS48dxxiOGyHe+8x0nHA47f/Znf2be+37ECY2h3aPiRI/56Ec/6gBwHn300bZ/6xSUL3zhC52trS3z+Mc//nEHgPOqV73K9fvXXXedA8CcKI8//rgTCASca6+91vW8UqnkLC4uOldeeaV57LHHHnP8fr/z5je/ecfPEA6HnWQy6WSzWefXf/3Xnb/+6792brzxRsfv9zuvf/3rd/M1tHH11Vc7iUTCOXHihOvxX/mVX3EAmAvIww8/7ABwPvWpT7me9+IXv9g577zzzM+33nqrMzU15Xzta19zPe8P//APHQDOfffdZx4D4CwsLDjFYtE8trS05ExNTTm33nqreWy7/zsv7rzzTk+V0evohkke2MYhfmze/e53OwCcr371q13/LtH42T2THD+OMx4xpGPQo7v6TBpDvWfU42dra8uZnp52Xv7yl7sez+VyTjKZdAA4Dz744Lav4YXGz+6Z5PhxnNGPIcd5No7OP/9853Wve53rve9HnNAY2j0HFUPqObEN//7f/3tMTZ3yDP2BH/gBAMBP//RPu57Hxx9//HEcO3YMf/mXf4nNzU38t//237C5uWmeF4lEcOGFF+JLX/qSeezo0aOu52xHq9VCqVTC7/7u7+K//Jf/AgC4+OKLUalU8PGPfxw333wz/t2/+3ddfcY//dM/xcUXX4zDhw+73sdll12GG264AQ888ACe//zn49xzz8V5552HO++8E295y1sAAP/0T/+Ev//7v8cnPvEJ1+sdO3YMP/iDP+h6vUsvvRQ+nw9f/vKXcdlll5nHL774YiSTSfPzwsIC5ufnceLEia4+h+Tyyy/H1772tT3/vtIbhi1+JJubm7j77rtxzjnn4CUveUnXv080fpR+MmwxpGPQ7tAYGg6GKX6mpqbwtre9DR/4wAfwgQ98AFdffTWKxSKuu+46VKtV85xu0fhR+skwxRAA3H777fje976Hz3/+83v+TDYaQ8OHihPbMD097fo5FApt+3i9XgcAnDx5EgDwIz/yI56vu5cBCABmZmawtLSESy+91PX4ZZddho9//OP4+te/3vXE8OTJk/jCF76AYDDo+e/SZObNb34z3va2t+Gf//mf8f3f//248847EQ6H8brXvc71ev/yL/+yq9fjZ7IJh8Oo1WpdfQ7J9PQ00un0nn9f6Q3DFj+S++67D0tLS3j3u9+9r9fR+FH6ybDFkI5Bu0NjaDgYtvh573vfi3K5jA9+8IN473vfC+DZRd6b3vQm/NZv/RZOO+20rl9T40fpJ8MUQ48//jje+9734rbbbkMoFDKdKzY3N9FqtZDP5xEOhxGNRrt6XY2h4UPFiT4wOzsLAPjDP/xDHD16tGev+4IXvABLS0ttjzuOA2BvwT47O4sXvOAF+NCHPuT574cPHzb3X/e61+Gd73wn7rrrLnzoQx/CPffcgyuuuALZbNb1etFoFP/7f//vjn+v39x9991405vetKvn8rtThod+xY/k05/+NEKhEN7whjfs63U0fjR+hhEdgzSGlL3Tr/gJBAK4/fbb8f73vx+PPvooZmdncejQIVx66aU466yzcPrpp+/pvWr8KMNGP2Lo3/7t31Cr1fD2t78db3/729v+PZvN4u1vfzs+/vGPd/W6GkPDF0MTI06Ew2EA2JcStVsuvfRSBAIB/Ou//ite85rX9Ox1X/Oa1+CLX/wi/vzP/xyvf/3rzeP33XcfpqamOiqU2/HKV74S9913H77v+77PFVxeZLNZXHHFFfjMZz6Dl770pVhaWsKb3/zmtte75ZZbMDMzg7POOqvr9+NFt/93o57ONIyMQ/yQpaUl3HfffXj1q1/tqVh3g8aPslvGIYZ0DNIYGhTjED8kkUjg3HPPBQB8/etfx1/91V/hf/7P/7mn19L4UXbLqMfQD/7gD7rKQch1112HQqGAO++8c08Cn8bQ8DEx4gQHgl/91V/FVVddhWAwiOc973muOp9eceaZZ+L9738/brzxRvzbv/0bfuqnfgrZbBYnT57E3//93yMej+Pmm28GAJw4cQLf933fh6uuugqf/vSnt33dN73pTfjN3/xNvPWtb8Xq6iqe//zn4/7778cnPvEJvPWtb3WpkzfddBNuvvlmfOlLX8JFF13U8TXf//734/jx47jgggvwC7/wC3je856Her2Oxx57DPfddx8++clPuoL9zW9+M37v934P11xzDU4//XS84hWvcL3eddddh89+9rP48R//cbzjHe/AC17wArRaLTz++OP44he/iOuvvx7nn39+V99nt/93MzMz+150Sv78z/8clUoFpVIJAPDd734Xf/iHfwjg2Xq8WCzWs781rIxD/JC7774bm5ub+Nmf/dmOz9H40fjpNeMQQzoGaQwNinGIny9/+cv42te+hhe84AVwHAd///d/jw9/+MP4qZ/6KVxzzTWu52r8aPz0mlGPoUwm4xkLmUwGm5ubbf+mMTTCMdRX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B/tF40fjZzeM63mwXyY1fgCNoW4Z53NhP0xqDGn8dMe4ngf7ZejjZ192mgOALXQ+/elPO9/97ned6667zonH485jjz026Lc2MEqlkvONb3zD+cY3vuEAcG6//XbnG9/4hmkrdNtttznpdNr53Oc+53zrW99yXve613m2gzn99NOd+++/3/n617/u/MRP/MRYt9H57//9vzvpdNr58pe/7DzzzDPmqFar5jnj+r1pDLnR+OkejR+NH6Lx0z2THD+OozFkozHUPZMcQxo/bjR+umfY42fkxAnHcZxPfOITztGjR51QKOS86EUvMq1PJpUvfelLDoC246qrrnIc59mWMO973/ucxcVFJxwOOz/+4z/ufOtb33K9Rq1Wc6655hpnenraiUajzitf+Urn8ccfH8CnORi8vi8Azp133mmeM87fm8bQKTR+ukfjR+OHaPx0z6THj+NoDEk0hrpn0mNI4+cUGj/dM+zx4/v/v0lFURRFURRFURRFUZSBMFKeE4qiKIqiKIqiKIqijB8qTiiKoiiKoiiKoiiKMlBUnFAURVEURVEURVEUZaCoOKEoiqIoiqIoiqIoykBRcUJRFEVRFEVRFEVRlIGi4oSiKIqiKIqiKIqiKANFxQlFURRFURRFURRFUQaKihOKoiiKoiiKoiiKogwUFScURVEURVEURVEURRkoKk4oiqIoiqIoiqIoijJQVJxQFEVRFEVRFEVRFGWg/P8ARRa7+UWnvQQAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "torch.manual_seed(42)\n", "\n", @@ -224,7 +299,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 25, "id": "c216fa33-de09-4be2-82cc-83cb73db3a42", "metadata": {}, "outputs": [], @@ -240,13 +315,13 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 26, "id": "8056a675-fbce-4f4b-86c0-ab7dd924e4b1", "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "torch.Size([6, 1, 224, 224])\n", "torch.Size([6, 1])\n" @@ -278,7 +353,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 27, "id": "1e7a2c7e-a1ef-42fa-ba74-1d33a1dcf2f3", "metadata": {}, "outputs": [], @@ -289,17 +364,16 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 28, "id": "3f577acf-a821-41a4-8544-318617755d1e", "metadata": {}, "outputs": [ { - "name": "stderr", "output_type": "stream", + "name": "stderr", "text": [ - "GPU available: True (mps), used: True\n", + "GPU available: False, used: False\n", "TPU available: False, using: 0 TPU cores\n", - "IPU available: False, using: 0 IPUs\n", "HPU available: False, using: 0 HPUs\n" ] } @@ -319,30 +393,42 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 29, "id": "430079cc-4fad-4da2-8ea5-aa904c41ec0e", "metadata": {}, "outputs": [ { - "name": "stderr", "output_type": "stream", + "name": "stdout", "text": [ + "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\n", + "Failed to download (trying next):\n", + "HTTP Error 403: Forbidden\n", "\n", - " | Name | Type | Params\n", - "---------------------------------\n", - "0 | model | ResNet | 11.2 M\n", - "---------------------------------\n", - "11.2 M Trainable params\n", - "0 Non-trainable params\n", - "11.2 M Total params\n", - "44.683 Total estimated model params size (MB)\n" + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz\n", + "Failed to download (trying next):\n", + "\n", + "\n" ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 0: 0%| | 0/11 [00:00 2\u001b[0m \u001b[43mtrainer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel_regular\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdatamodule\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/lightning/pytorch/trainer/trainer.py:538\u001b[0m, in \u001b[0;36mTrainer.fit\u001b[0;34m(self, model, train_dataloaders, val_dataloaders, datamodule, ckpt_path)\u001b[0m\n\u001b[1;32m 536\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mstatus \u001b[38;5;241m=\u001b[39m TrainerStatus\u001b[38;5;241m.\u001b[39mRUNNING\n\u001b[1;32m 537\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtraining \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m--> 538\u001b[0m \u001b[43mcall\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_and_handle_interrupt\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 539\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_fit_impl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrain_dataloaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mval_dataloaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdatamodule\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mckpt_path\u001b[49m\n\u001b[1;32m 540\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/lightning/pytorch/trainer/call.py:47\u001b[0m, in \u001b[0;36m_call_and_handle_interrupt\u001b[0;34m(trainer, trainer_fn, *args, **kwargs)\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m trainer\u001b[38;5;241m.\u001b[39mstrategy\u001b[38;5;241m.\u001b[39mlauncher \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 46\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m trainer\u001b[38;5;241m.\u001b[39mstrategy\u001b[38;5;241m.\u001b[39mlauncher\u001b[38;5;241m.\u001b[39mlaunch(trainer_fn, \u001b[38;5;241m*\u001b[39margs, trainer\u001b[38;5;241m=\u001b[39mtrainer, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m---> 47\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mtrainer_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m _TunerExitException:\n\u001b[1;32m 50\u001b[0m _call_teardown_hook(trainer)\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/lightning/pytorch/trainer/trainer.py:574\u001b[0m, in \u001b[0;36mTrainer._fit_impl\u001b[0;34m(self, model, train_dataloaders, val_dataloaders, datamodule, ckpt_path)\u001b[0m\n\u001b[1;32m 567\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mfn \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 568\u001b[0m ckpt_path \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_checkpoint_connector\u001b[38;5;241m.\u001b[39m_select_ckpt_path(\n\u001b[1;32m 569\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mfn,\n\u001b[1;32m 570\u001b[0m ckpt_path,\n\u001b[1;32m 571\u001b[0m model_provided\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 572\u001b[0m model_connected\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlightning_module \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 573\u001b[0m )\n\u001b[0;32m--> 574\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mckpt_path\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mckpt_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 576\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mstopped\n\u001b[1;32m 577\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtraining \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/lightning/pytorch/trainer/trainer.py:941\u001b[0m, in \u001b[0;36mTrainer._run\u001b[0;34m(self, model, ckpt_path)\u001b[0m\n\u001b[1;32m 938\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__setup_profiler()\n\u001b[1;32m 940\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: preparing data\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 941\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_data_connector\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 943\u001b[0m call\u001b[38;5;241m.\u001b[39m_call_setup_hook(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;66;03m# allow user to set up LightningModule in accelerator environment\u001b[39;00m\n\u001b[1;32m 944\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: configuring model\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:93\u001b[0m, in \u001b[0;36m_DataConnector.prepare_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _InfiniteBarrier():\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (prepare_data_per_node \u001b[38;5;129;01mand\u001b[39;00m local_rank_zero) \u001b[38;5;129;01mor\u001b[39;00m (\u001b[38;5;129;01mnot\u001b[39;00m prepare_data_per_node \u001b[38;5;129;01mand\u001b[39;00m global_rank_zero):\n\u001b[0;32m---> 93\u001b[0m \u001b[43mcall\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_lightning_datamodule_hook\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrainer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mprepare_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[38;5;66;03m# handle lightning module prepare data:\u001b[39;00m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m lightning_module \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m is_overridden(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mprepare_data\u001b[39m\u001b[38;5;124m\"\u001b[39m, lightning_module):\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/lightning/pytorch/trainer/call.py:189\u001b[0m, in \u001b[0;36m_call_lightning_datamodule_hook\u001b[0;34m(trainer, hook_name, *args, **kwargs)\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(fn):\n\u001b[1;32m 188\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m trainer\u001b[38;5;241m.\u001b[39mprofiler\u001b[38;5;241m.\u001b[39mprofile(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m[LightningDataModule]\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtrainer\u001b[38;5;241m.\u001b[39mdatamodule\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mhook_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m--> 189\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 190\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m~/torchsurv/docs/notebooks/helpers_momentum.py:144\u001b[0m, in \u001b[0;36mMNISTDataModule.prepare_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 142\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mprepare_data\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 143\u001b[0m \u001b[38;5;66;03m# download\u001b[39;00m\n\u001b[0;32m--> 144\u001b[0m \u001b[43mMNIST\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrain\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownload\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 145\u001b[0m MNIST(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata_dir, train\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, download\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/torchvision/datasets/mnist.py:100\u001b[0m, in \u001b[0;36mMNIST.__init__\u001b[0;34m(self, root, train, transform, target_transform, download)\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m download:\n\u001b[0;32m--> 100\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdownload\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 102\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_exists():\n\u001b[1;32m 103\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDataset not found. You can use download=True to download it\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/conda-env/lib/python3.10/site-packages/torchvision/datasets/mnist.py:196\u001b[0m, in \u001b[0;36mMNIST.download\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 194\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 195\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 196\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError downloading \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfilename\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mRuntimeError\u001b[0m: Error downloading train-images-idx3-ubyte.gz" ] } ], @@ -501,9 +587,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.10.15" } }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/docs/notebooks/survival.md b/docs/notebooks/survival.md index f317942..08307a2 100644 --- a/docs/notebooks/survival.md +++ b/docs/notebooks/survival.md @@ -81,11 +81,12 @@ Let's assume that individual $i$ has a time-to-event $X_i$ and a time-to-censori A time-to-event outcome can be viewed as a time-varying binary outcome using the counting process representation: $$ -N_i(t) = 1(X_i \leq t). +N_i(t) = 1(X_i \leq t), $$ +which is zero until $t$ passes $X_i$ where it jumps to unity. -The risk score chosen can either predicts prevalence or incidence (Heagerty and Zheng, 2005). For example, the cumulative hazard can be seen as a measure of prevalence because it measures the cumulative risk, whereas the instantaneous hazard can be seen as a measure of incidence as it measures the risk of an event in a very short, infinitesimally small time. Consequently, there are two different types of sensitivity depending on the chosen risk score. +This function, also called the risk score chosen, can either predict prevalence or incidence (Heagerty and Zheng, 2005). For example, the cumulative hazard can be seen as a measure of prevalence because it measures the cumulative risk, whereas the instantaneous hazard can be seen as a measure of incidence as it measures the risk of an event in a very short, infinitesimally small time. Consequently, there are two different types of sensitivity depending on the chosen risk score. #### Cumulative sensitivity