--- a
+++ b/EEGLearn_ShortDemo.ipynb
@@ -0,0 +1,405 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Pytorch Implementation of EEGLearn - P. Bashivan"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This notebook describes a short summary of Pytorch implementation of the models described in \"Learning Representations from EEG with Deep Recurrent-Convolutional Neural Networks.\" Bashivan et al. at International conference on learning representations (2016).\n",
+    "\n",
+    "The rest of the code is in the different python scripts of this repo.\n",
+    "\n",
+    "All the codes have been inspired from the [original github](https://github.com/pbashivan/EEGLearn)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Librairies Import"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "import scipy.io as sio\n",
+    "import torch\n",
+    "import os \n",
+    "\n",
+    "import torch.optim as optim\n",
+    "import torch.nn.functional as F\n",
+    "\n",
+    "from torch.autograd import Variable\n",
+    "from torch.utils.data.dataset import Dataset\n",
+    "from torch.utils.data import DataLoader,random_split\n",
+    "\n",
+    "from Utils import *\n",
+    "from Models import *\n",
+    "\n",
+    "torch.manual_seed(1234)\n",
+    "np.random.seed(1234)\n",
+    "\n",
+    "import warnings\n",
+    "warnings.simplefilter(\"ignore\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Loading the original Images \n",
+    "The images have directly been taken from original implementation, given that they remain the same nevermind the implementation (Pytorch, Tensorflow, Theano)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "(2670, 3, 32, 32)\n",
+      "(2670, 7, 3, 32, 32)\n",
+      "(2670,)\n",
+      "(2670,)\n"
+     ]
+    }
+   ],
+   "source": [
+    "Mean_Images = sio.loadmat(\"Sample Data/images.mat\")[\"img\"] #corresponding to the images mean for all the seven windows\n",
+    "print(np.shape(Mean_Images)) \n",
+    "Images = sio.loadmat(\"Sample Data/images_time.mat\")[\"img\"] #corresponding to the images mean for all the seven windows\n",
+    "print(np.shape(Images)) \n",
+    "Label = (sio.loadmat(\"Sample Data/FeatureMat_timeWin\")[\"features\"][:,-1]-1).astype(int) #corresponding to the signal label (i.e. load levels).\n",
+    "print(np.shape(Label)) \n",
+    "Patient_id = sio.loadmat(\"Sample Data/trials_subNums.mat\")['subjectNum'][0] #corresponding to the patient id\n",
+    "print(np.shape(Patient_id))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Loading patient dataset \n",
+    "From the total data, we select the images corresponding patient. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Choose among the patient : [ 1  2  3  4  6  7  8  9 10 11 12 14 15]\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(\"Choose among the patient : \"+str(np.unique(Patient_id)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "choosen_patient = 9"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Introduction: BasicCNN\n",
+    "First Implementation of a CNN on the Mean Images from each patient"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "train_part = 0.8\n",
+    "test_part = 0.2\n",
+    "\n",
+    "batch_size = 32"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "EEG = EEGImagesDataset(label=Label[Patient_id==choosen_patient], image=Mean_Images[Patient_id==choosen_patient])\n",
+    "\n",
+    "lengths = [int(len(EEG)*train_part+1), int(len(EEG)*test_part)]\n",
+    "Train, Test = random_split(EEG, lengths)\n",
+    "\n",
+    "Trainloader = DataLoader(Train,batch_size=batch_size)\n",
+    "Testloader = DataLoader(Test, batch_size=batch_size)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "res = TrainTest_Model(BasicCNN, Trainloader, Testloader, n_epoch=50, learning_rate=0.001, print_epoch=-1, opti='Adam')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Maxpool CNN\n",
+    "Build the Max-pooling model performing a maxpool over the 7 parallel convnets."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "train_part = 0.8\n",
+    "test_part = 0.2\n",
+    "\n",
+    "batch_size = 32"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "EEG = EEGImagesDataset(label=Label[Patient_id==choosen_patient], image=Images[Patient_id==choosen_patient])\n",
+    "\n",
+    "lengths = [int(len(EEG)*train_part+1), int(len(EEG)*test_part)]\n",
+    "Train, Test = random_split(EEG, lengths)\n",
+    "\n",
+    "Trainloader = DataLoader(Train,batch_size=batch_size)\n",
+    "Testloader = DataLoader(Test, batch_size=batch_size)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Begin Training for Patient 9\n",
+      "[5,  45]\tloss: 0.850\tAccuracy : 0.617\t\tval-loss: 0.644\tval-Accuracy : 0.875\n",
+      "[10,  45]\tloss: 0.159\tAccuracy : 0.920\t\tval-loss: 0.980\tval-Accuracy : 0.825\n",
+      "[15,  45]\tloss: 0.094\tAccuracy : 0.963\t\tval-loss: 0.233\tval-Accuracy : 0.900\n",
+      "[20,  45]\tloss: 0.003\tAccuracy : 1.000\t\tval-loss: 0.090\tval-Accuracy : 0.950\n",
+      "[25,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 0.017\tval-Accuracy : 1.000\n",
+      "[30,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 0.017\tval-Accuracy : 1.000\n",
+      "[35,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 0.015\tval-Accuracy : 1.000\n",
+      "[40,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 0.011\tval-Accuracy : 1.000\n",
+      "[45,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 0.006\tval-Accuracy : 1.000\n"
+     ]
+    }
+   ],
+   "source": [
+    "print('Begin Training for Patient '+str(choosen_patient))\n",
+    "res = TrainTest_Model(MaxCNN, Trainloader, Testloader, n_epoch=45, learning_rate=0.001, print_epoch=5, opti='Adam')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Temp CNN\n",
+    "FBuild the Conv1D model performing a convolution1D over the 7 parallel convnets."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Begin Training for Patient 9\n",
+      "[5,  45]\tloss: 0.438\tAccuracy : 0.821\t\tval-loss: 1.963\tval-Accuracy : 0.750\n",
+      "[10,  45]\tloss: 0.153\tAccuracy : 0.938\t\tval-loss: 2.079\tval-Accuracy : 0.875\n",
+      "[15,  45]\tloss: 0.005\tAccuracy : 1.000\t\tval-loss: 4.025\tval-Accuracy : 0.825\n",
+      "[20,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 3.416\tval-Accuracy : 0.900\n",
+      "[25,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 3.587\tval-Accuracy : 0.900\n",
+      "[30,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 3.672\tval-Accuracy : 0.900\n",
+      "[35,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 3.827\tval-Accuracy : 0.900\n",
+      "[40,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 4.332\tval-Accuracy : 0.900\n",
+      "[45,  45]\tloss: 0.000\tAccuracy : 1.000\t\tval-loss: 5.142\tval-Accuracy : 0.900\n",
+      "Finished Training \n",
+      " loss: 0.000\tAccuracy : 1.000\t\tval-loss: 5.142\tval-Accuracy : 0.900\n"
+     ]
+    }
+   ],
+   "source": [
+    "print('Begin Training for Patient '+str(choosen_patient))\n",
+    "res = TrainTest_Model(TempCNN, Trainloader, Testloader, n_epoch=45, learning_rate=0.001, print_epoch=5, opti='Adam')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## LSTM CNN\n",
+    "Build the LSTM model applying a RNN over the 7 parallel convnets outputs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "EEG = EEGImagesDataset(label=Label[Patient_id==choosen_patient], image=Images[Patient_id==choosen_patient])\n",
+    "\n",
+    "lengths = [int(len(EEG)*train_part+1), int(len(EEG)*test_part)]\n",
+    "Train, Test = random_split(EEG, lengths)\n",
+    "\n",
+    "Trainloader = DataLoader(Train,batch_size=batch_size)\n",
+    "Testloader = DataLoader(Test, batch_size=batch_size)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Begin Training for Patient 9\n",
+      "[5,  45]\tloss: 1.321\tAccuracy : 0.333\t\tval-loss: 1.386\tval-Accuracy : 0.225\n",
+      "[10,  45]\tloss: 1.225\tAccuracy : 0.364\t\tval-loss: 1.427\tval-Accuracy : 0.325\n",
+      "[15,  45]\tloss: 1.002\tAccuracy : 0.562\t\tval-loss: 1.115\tval-Accuracy : 0.450\n",
+      "[20,  45]\tloss: 0.664\tAccuracy : 0.704\t\tval-loss: 0.744\tval-Accuracy : 0.600\n",
+      "[25,  45]\tloss: 0.392\tAccuracy : 0.895\t\tval-loss: 0.515\tval-Accuracy : 0.775\n",
+      "[30,  45]\tloss: 0.187\tAccuracy : 0.988\t\tval-loss: 0.285\tval-Accuracy : 0.900\n",
+      "[35,  45]\tloss: 0.082\tAccuracy : 1.000\t\tval-loss: 0.236\tval-Accuracy : 0.825\n",
+      "[40,  45]\tloss: 0.040\tAccuracy : 1.000\t\tval-loss: 0.170\tval-Accuracy : 0.900\n",
+      "[45,  45]\tloss: 0.022\tAccuracy : 1.000\t\tval-loss: 0.141\tval-Accuracy : 0.950\n",
+      "Finished Training \n",
+      " loss: 0.022\tAccuracy : 1.000\t\tval-loss: 0.141\tval-Accuracy : 0.950\n"
+     ]
+    }
+   ],
+   "source": [
+    "print('Begin Training for Patient '+str(choosen_patient))\n",
+    "res = TrainTest_Model(LSTM, Trainloader, Testloader, n_epoch=45, learning_rate=0.0001, print_epoch=5, opti='Adam')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Mix CNN\n",
+    "Build the LSTM model applying a RNN and a CNN over the 7 parallel convnets outputs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "EEG = EEGImagesDataset(label=Label[Patient_id==choosen_patient], image=Images[Patient_id==choosen_patient])\n",
+    "\n",
+    "lengths = [int(len(EEG)*train_part+1), int(len(EEG)*test_part)]\n",
+    "Train, Test = random_split(EEG, lengths)\n",
+    "\n",
+    "Trainloader = DataLoader(Train,batch_size=batch_size)\n",
+    "Testloader = DataLoader(Test, batch_size=batch_size)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Begin Training for Patient 9\n",
+      "[5, 100]\tloss: 1.375\tAccuracy : 0.296\t\tval-loss: 1.376\tval-Accuracy : 0.150\n",
+      "[10, 100]\tloss: 1.362\tAccuracy : 0.302\t\tval-loss: 1.371\tval-Accuracy : 0.225\n",
+      "[15, 100]\tloss: 1.352\tAccuracy : 0.302\t\tval-loss: 1.368\tval-Accuracy : 0.225\n",
+      "[20, 100]\tloss: 1.342\tAccuracy : 0.302\t\tval-loss: 1.362\tval-Accuracy : 0.225\n",
+      "[25, 100]\tloss: 1.312\tAccuracy : 0.302\t\tval-loss: 1.335\tval-Accuracy : 0.225\n",
+      "[30, 100]\tloss: 1.191\tAccuracy : 0.302\t\tval-loss: 1.250\tval-Accuracy : 0.225\n",
+      "[35, 100]\tloss: 0.981\tAccuracy : 0.586\t\tval-loss: 1.105\tval-Accuracy : 0.575\n",
+      "[40, 100]\tloss: 0.836\tAccuracy : 0.605\t\tval-loss: 1.015\tval-Accuracy : 0.650\n",
+      "[45, 100]\tloss: 0.760\tAccuracy : 0.611\t\tval-loss: 1.008\tval-Accuracy : 0.700\n",
+      "[50, 100]\tloss: 0.677\tAccuracy : 0.654\t\tval-loss: 1.047\tval-Accuracy : 0.725\n",
+      "[55, 100]\tloss: 0.561\tAccuracy : 0.753\t\tval-loss: 1.120\tval-Accuracy : 0.725\n",
+      "[60, 100]\tloss: 0.421\tAccuracy : 0.833\t\tval-loss: 1.253\tval-Accuracy : 0.800\n",
+      "[65, 100]\tloss: 0.301\tAccuracy : 0.895\t\tval-loss: 1.419\tval-Accuracy : 0.750\n",
+      "[70, 100]\tloss: 0.212\tAccuracy : 0.944\t\tval-loss: 1.557\tval-Accuracy : 0.825\n",
+      "[75, 100]\tloss: 0.145\tAccuracy : 0.969\t\tval-loss: 1.810\tval-Accuracy : 0.875\n",
+      "[80, 100]\tloss: 0.096\tAccuracy : 0.981\t\tval-loss: 2.223\tval-Accuracy : 0.875\n",
+      "[85, 100]\tloss: 0.063\tAccuracy : 0.994\t\tval-loss: 2.621\tval-Accuracy : 0.875\n",
+      "[90, 100]\tloss: 0.043\tAccuracy : 0.994\t\tval-loss: 2.955\tval-Accuracy : 0.900\n",
+      "[95, 100]\tloss: 0.031\tAccuracy : 0.994\t\tval-loss: 3.245\tval-Accuracy : 0.900\n",
+      "[100, 100]\tloss: 0.023\tAccuracy : 0.994\t\tval-loss: 3.496\tval-Accuracy : 0.900\n",
+      "Finished Training \n",
+      " loss: 0.023\tAccuracy : 0.994\t\tval-loss: 3.496\tval-Accuracy : 0.900\n"
+     ]
+    }
+   ],
+   "source": [
+    "print('Begin Training for Patient '+str(choosen_patient))\n",
+    "res = TrainTest_Model(Mix, Trainloader, Testloader, n_epoch=60, learning_rate=0.00001, print_epoch=5, opti='Adam')"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Pytorch",
+   "language": "python",
+   "name": "pytorch"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}