diff --git a/models/internal_priming.pth b/models/internal_priming.pth index eeab5fda317b000d341c6d4f6badf410ba6e96f0..c11ec4e8f00da9f030e529dda0343bf445ccdc29 100644 Binary files a/models/internal_priming.pth and b/models/internal_priming.pth differ diff --git a/notebooks/internal_priming.ipynb b/notebooks/internal_priming.ipynb index d1c274f997859f2959cf0e04a2284ea5ced0a835..3728c62592ed2d0fabd0bc190acbdd2a28db4d73 100644 --- a/notebooks/internal_priming.ipynb +++ b/notebooks/internal_priming.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 26, "outputs": [], "source": [ "# importing the libraries\n", @@ -52,7 +52,7 @@ "\n", " self.cnn_layers = Sequential(\n", " # Defining a 1D convolution layer\n", - " Conv1d(1, 4, kernel_size=3, stride=1, padding=1),\n", + " Conv1d(4, 4, kernel_size=3, stride=1, padding=1),\n", " BatchNorm1d(4),\n", " ReLU(inplace=True),\n", " MaxPool1d(kernel_size=2, stride=2),\n", @@ -128,13 +128,13 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 27, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 20000/20000 [00:00<00:00, 27099.07it/s]\n" + "100%|██████████| 20000/20000 [00:00<00:00, 23948.83it/s]\n" ] } ], @@ -185,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 28, "outputs": [], "source": [ "# TODO: reshape shape from [n, l] to [n, 1, l]\n", @@ -199,8 +199,8 @@ "train_shape = train_x.shape\n", "val_shape = val_x.shape\n", "\n", - "train_x = train_x.reshape(train_shape[0], 1, train_shape[1], 4)\n", - "val_x = val_x.reshape(val_shape[0], 1, val_shape[1], 4)\n", + "train_x = train_x.reshape(train_shape[0], 4, train_shape[1])\n", + "val_x = val_x.reshape(val_shape[0], 4, val_shape[1])\n", "\n", "train_x = torch.from_numpy(train_x)\n", "train_y = torch.from_numpy(train_y)\n", @@ -229,32 +229,13 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 29, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/25 [00:00<?, ?it/s]\n" - ] - }, - { - "ename": "RuntimeError", - "evalue": "Expected 3-dimensional input for 3-dimensional weight [4, 1, 3], but got 4-dimensional input of size [18000, 1, 200, 4] instead", - "output_type": "error", - "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mRuntimeError\u001B[0m Traceback (most recent call last)", - "\u001B[1;32m~\\AppData\\Local\\Temp/ipykernel_14744/999922600.py\u001B[0m in \u001B[0;36m<module>\u001B[1;34m\u001B[0m\n\u001B[0;32m 24\u001B[0m \u001B[1;31m# training the model\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 25\u001B[0m \u001B[1;32mfor\u001B[0m \u001B[0mepoch\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mtqdm\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mrange\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mn_epochs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 26\u001B[1;33m \u001B[0mtrain_loss\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mval_loss\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mtrain\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 27\u001B[0m \u001B[0mtrain_losses\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mappend\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mtrain_loss\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 28\u001B[0m \u001B[0mval_losses\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mappend\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mval_loss\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32m~\\AppData\\Local\\Temp/ipykernel_14744/2669949571.py\u001B[0m in \u001B[0;36mtrain\u001B[1;34m()\u001B[0m\n\u001B[0;32m 67\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 68\u001B[0m \u001B[1;31m# prediction for training and validation set\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 69\u001B[1;33m \u001B[0moutput_train\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mmodel\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mx_train\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 70\u001B[0m \u001B[0moutput_val\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mmodel\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mx_val\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 71\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32mc:\\users\\gzaug\\onedrive\\dokumente\\uni\\programming in life sciences\\scrna-seq-simulation\\venv\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001B[0m in \u001B[0;36m_call_impl\u001B[1;34m(self, *input, **kwargs)\u001B[0m\n\u001B[0;32m 1100\u001B[0m if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks\n\u001B[0;32m 1101\u001B[0m or _global_forward_hooks or _global_forward_pre_hooks):\n\u001B[1;32m-> 1102\u001B[1;33m \u001B[1;32mreturn\u001B[0m \u001B[0mforward_call\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 1103\u001B[0m \u001B[1;31m# Do not call functions when jit is used\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 1104\u001B[0m \u001B[0mfull_backward_hooks\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mnon_full_backward_hooks\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32m~\\AppData\\Local\\Temp/ipykernel_14744/2669949571.py\u001B[0m in \u001B[0;36mforward\u001B[1;34m(self, x)\u001B[0m\n\u001B[0;32m 43\u001B[0m \u001B[1;31m# Defining the forward pass\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 44\u001B[0m \u001B[1;32mdef\u001B[0m \u001B[0mforward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mself\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mx\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 45\u001B[1;33m \u001B[0mx\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mcnn_layers\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mx\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 46\u001B[0m \u001B[0mx\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mx\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mview\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mx\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0msize\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;36m0\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m-\u001B[0m\u001B[1;36m1\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 47\u001B[0m \u001B[0mx\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mlinear_layers\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mx\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32mc:\\users\\gzaug\\onedrive\\dokumente\\uni\\programming in life sciences\\scrna-seq-simulation\\venv\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001B[0m in \u001B[0;36m_call_impl\u001B[1;34m(self, *input, **kwargs)\u001B[0m\n\u001B[0;32m 1100\u001B[0m if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks\n\u001B[0;32m 1101\u001B[0m or _global_forward_hooks or _global_forward_pre_hooks):\n\u001B[1;32m-> 1102\u001B[1;33m \u001B[1;32mreturn\u001B[0m \u001B[0mforward_call\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 1103\u001B[0m \u001B[1;31m# Do not call functions when jit is used\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 1104\u001B[0m \u001B[0mfull_backward_hooks\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mnon_full_backward_hooks\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32mc:\\users\\gzaug\\onedrive\\dokumente\\uni\\programming in life sciences\\scrna-seq-simulation\\venv\\lib\\site-packages\\torch\\nn\\modules\\container.py\u001B[0m in \u001B[0;36mforward\u001B[1;34m(self, input)\u001B[0m\n\u001B[0;32m 139\u001B[0m \u001B[1;32mdef\u001B[0m \u001B[0mforward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mself\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0minput\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 140\u001B[0m \u001B[1;32mfor\u001B[0m \u001B[0mmodule\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 141\u001B[1;33m \u001B[0minput\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mmodule\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 142\u001B[0m \u001B[1;32mreturn\u001B[0m \u001B[0minput\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 143\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32mc:\\users\\gzaug\\onedrive\\dokumente\\uni\\programming in life sciences\\scrna-seq-simulation\\venv\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001B[0m in \u001B[0;36m_call_impl\u001B[1;34m(self, *input, **kwargs)\u001B[0m\n\u001B[0;32m 1100\u001B[0m if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks\n\u001B[0;32m 1101\u001B[0m or _global_forward_hooks or _global_forward_pre_hooks):\n\u001B[1;32m-> 1102\u001B[1;33m \u001B[1;32mreturn\u001B[0m \u001B[0mforward_call\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 1103\u001B[0m \u001B[1;31m# Do not call functions when jit is used\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 1104\u001B[0m \u001B[0mfull_backward_hooks\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mnon_full_backward_hooks\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32mc:\\users\\gzaug\\onedrive\\dokumente\\uni\\programming in life sciences\\scrna-seq-simulation\\venv\\lib\\site-packages\\torch\\nn\\modules\\conv.py\u001B[0m in \u001B[0;36mforward\u001B[1;34m(self, input)\u001B[0m\n\u001B[0;32m 299\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 300\u001B[0m \u001B[1;32mdef\u001B[0m \u001B[0mforward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mself\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0minput\u001B[0m\u001B[1;33m:\u001B[0m \u001B[0mTensor\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;33m->\u001B[0m \u001B[0mTensor\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 301\u001B[1;33m \u001B[1;32mreturn\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_conv_forward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mweight\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mbias\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 302\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 303\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32mc:\\users\\gzaug\\onedrive\\dokumente\\uni\\programming in life sciences\\scrna-seq-simulation\\venv\\lib\\site-packages\\torch\\nn\\modules\\conv.py\u001B[0m in \u001B[0;36m_conv_forward\u001B[1;34m(self, input, weight, bias)\u001B[0m\n\u001B[0;32m 295\u001B[0m \u001B[0mweight\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mbias\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mstride\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 296\u001B[0m _single(0), self.dilation, self.groups)\n\u001B[1;32m--> 297\u001B[1;33m return F.conv1d(input, weight, bias, self.stride,\n\u001B[0m\u001B[0;32m 298\u001B[0m self.padding, self.dilation, self.groups)\n\u001B[0;32m 299\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;31mRuntimeError\u001B[0m: Expected 3-dimensional input for 3-dimensional weight [4, 1, 3], but got 4-dimensional input of size [18000, 1, 200, 4] instead" + "100%|██████████| 25/25 [00:19<00:00, 1.25it/s]\n" ] } ], @@ -309,8 +290,19 @@ }, { "cell_type": "code", - "execution_count": null, - "outputs": [], + "execution_count": 30, + "outputs": [ + { + "data": { + "text/plain": "<Figure size 432x288 with 1 Axes>", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "train_losses_list = [train_loss.item() for train_loss in train_losses]\n", "val_losses_list = [val_loss.item() for val_loss in val_losses]\n", @@ -330,8 +322,17 @@ }, { "cell_type": "code", - "execution_count": null, - "outputs": [], + "execution_count": 31, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.9966111111111111\n", + "0.998\n" + ] + } + ], "source": [ "# prediction for training set\n", "with torch.no_grad():\n", @@ -375,8 +376,68 @@ }, { "cell_type": "code", - "execution_count": null, - "outputs": [], + "execution_count": 32, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cnn_layers.0.weight tensor([[[-0.0161, -0.1727, -0.0706],\n", + " [-0.1442, -0.2347, -0.1731],\n", + " [ 0.0937, -0.2319, 0.0297],\n", + " [ 0.4707, 1.2928, -0.7642]],\n", + "\n", + " [[ 0.6057, 0.1347, -0.0041],\n", + " [ 0.0967, -0.9823, -0.6446],\n", + " [ 0.5267, 0.5432, 0.1329],\n", + " [-0.0482, -0.0046, -0.0177]],\n", + "\n", + " [[-0.3372, -0.1560, -0.0196],\n", + " [ 0.1110, -0.3352, -0.1544],\n", + " [-0.4499, -0.2293, 0.0253],\n", + " [ 0.9977, -0.9843, -1.0379]],\n", + "\n", + " [[-0.1263, -0.5871, -0.0511],\n", + " [-0.1365, -0.1569, 0.0979],\n", + " [-0.3475, -0.3901, 0.0927],\n", + " [-0.6534, -0.9329, 0.6516]]])\n", + "cnn_layers.0.bias tensor([-0.0021, -0.1551, -1.0721, 0.4632])\n", + "cnn_layers.1.weight tensor([1.8590, 0.1158, 1.1549, 0.8114])\n", + "cnn_layers.1.bias tensor([ 0.7813, -0.7185, 0.1945, 0.2015])\n", + "cnn_layers.4.weight tensor([[[-1.0589, 0.3008, -1.0521],\n", + " [ 0.2243, 0.5245, 0.1523],\n", + " [ 0.0767, 0.6713, -0.4829],\n", + " [-0.6312, -0.4684, -0.3525]],\n", + "\n", + " [[ 0.6076, 0.0118, 0.3328],\n", + " [-0.6541, 0.2015, 0.1579],\n", + " [-0.8182, 0.1377, -0.8822],\n", + " [ 0.5961, -0.2152, 0.7089]],\n", + "\n", + " [[ 0.5840, 0.3963, -0.3982],\n", + " [ 0.4481, 0.1088, 0.2149],\n", + " [ 0.4938, 0.3682, 0.5467],\n", + " [-0.1666, 0.2545, 0.4419]],\n", + "\n", + " [[ 0.2782, -0.2773, -0.6268],\n", + " [ 0.1686, 0.1611, -0.3611],\n", + " [-0.9431, -0.2470, -0.1781],\n", + " [-0.2127, 0.1223, -0.0467]]])\n", + "cnn_layers.4.bias tensor([ 0.0243, 0.1496, -0.2523, -0.1505])\n", + "cnn_layers.5.weight tensor([0.9917, 1.0135, 0.2734, 0.0942])\n", + "cnn_layers.5.bias tensor([-0.2346, -0.1730, -0.6458, -0.8736])\n", + "linear_layers.0.weight tensor([[ 0.2819, 0.3333, 0.3363, ..., 0.3874, 0.3519, 0.2827],\n", + " [ 0.3381, 0.3392, 0.2918, ..., 0.3641, 0.2983, 0.3425],\n", + " [-0.3373, -0.3675, -0.4146, ..., -0.3503, -0.4156, -0.3663],\n", + " ...,\n", + " [-0.3867, -0.3346, -0.3592, ..., -0.4135, -0.3362, -0.3592],\n", + " [-0.3415, -0.3677, -0.3740, ..., -0.4074, -0.3575, -0.3526],\n", + " [-0.4087, -0.3892, -0.3258, ..., -0.3189, -0.4211, -0.3985]])\n", + "linear_layers.0.bias tensor([ 0.1986, 0.3250, -0.4212, -0.3442, -0.3814, -0.3203, -0.3380, -0.4000,\n", + " -0.3805, -0.4522])\n" + ] + } + ], "source": [ "torch.save(model.state_dict(), '../models/internal_priming.pth')\n", "\n", diff --git a/src/polyA_classifier/polyA_classifier.py b/src/polyA_classifier/polyA_classifier.py index 4570e9d9b70b7e0bd582b2073cd61f15090672e7..31766e973a4f1485a6fa1989055fa830f61f7a8f 100644 --- a/src/polyA_classifier/polyA_classifier.py +++ b/src/polyA_classifier/polyA_classifier.py @@ -15,7 +15,7 @@ class Net(Module): self.cnn_layers = Sequential( # Defining a 1D convolution layer - Conv1d(1, 4, kernel_size=3, stride=1, padding=1), + Conv1d(4, 4, kernel_size=3, stride=1, padding=1), BatchNorm1d(4), ReLU(inplace=True), MaxPool1d(kernel_size=2, stride=2), @@ -42,11 +42,11 @@ class PolyAClassifier: """Classifier object using the state-dict of a pretrained pytorch model.""" enum = { - 'A': 0.0, - 'U': 1 / 3, - 'T': 1 / 3, - 'G': 2 / 3, - 'C': 1.0 + 'A': [1, 0, 0, 0], + 'U': [0, 1, 0, 0], + 'T': [0, 1, 0, 0], + 'G': [0, 0, 1, 0], + 'C': [0, 0, 0, 1] } def __init__(self, model=Net, state_dict_path: str = './models/internal_priming.pth'): @@ -103,7 +103,7 @@ class PolyAClassifier: raise ValueError('Not all sequences of length 200') test_shape = test.shape - test = test.reshape(test_shape[0], 1, test_shape[1]) + test = test.reshape(test_shape[0], 4, test_shape[1]) if test_shape[1] != 200: raise ValueError('Sequences not of length 200') diff --git a/tests/resources/internal_priming_test_model.pth b/tests/resources/internal_priming_test_model.pth index 7eb6ff99f2a924ff4bc1a60a12fc26199d0b0e09..c11ec4e8f00da9f030e529dda0343bf445ccdc29 100644 Binary files a/tests/resources/internal_priming_test_model.pth and b/tests/resources/internal_priming_test_model.pth differ