{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport torch\n\nfrom collections import defaultdict\nimport copy\nimport random\nimport os\nimport shutil\nfrom urllib.request import urlretrieve\n\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nimport cv2\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\nimport torch\nimport torch.backends.cudnn as cudnn\nimport torch.nn as nn\nimport torch.optim\nfrom torch.utils.data import Dataset, DataLoader\nimport torchvision.models as models\n\ncudnn.benchmark = True","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:48:55.28368Z","iopub.status.busy":"2022-06-19T05:48:55.283098Z","iopub.status.idle":"2022-06-19T05:48:57.096853Z","shell.execute_reply":"2022-06-19T05:48:57.095718Z","shell.execute_reply.started":"2022-06-19T05:48:55.283556Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df = pd.read_csv('../input/datasplit/train_P.csv')\n# print(df.info())\n# print(len(df))\n# print(len(df.dropna()))","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:48:57.099859Z","iopub.status.busy":"2022-06-19T05:48:57.09888Z","iopub.status.idle":"2022-06-19T05:49:04.60476Z","shell.execute_reply":"2022-06-19T05:49:04.603625Z","shell.execute_reply.started":"2022-06-19T05:48:57.09982Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df.columns","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:49:04.606782Z","iopub.status.busy":"2022-06-19T05:49:04.606283Z","iopub.status.idle":"2022-06-19T05:49:04.617524Z","shell.execute_reply":"2022-06-19T05:49:04.616478Z","shell.execute_reply.started":"2022-06-19T05:49:04.606735Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import Dataset\n\nclass P_Dataset(Dataset):\n    def __init__(self,csv_dir,limit=None):\n        if limit:\n            self.df = pd.read_csv(csv_dir).dropna()[:limit]\n        else:\n            self.df = pd.read_csv(csv_dir).dropna()\n        self.X_dict,self.y_dict = {},{}\n        self.idd = []\n        for i in range(len(self.df)):\n            idd,X,y = self.df.iloc[i,1],self.df.iloc[i,2:5],self.df.iloc[i,5]\n            self.X_dict[idd] = X\n            self.y_dict[idd] = y\n            self.idd.append(idd)\n    def __len__(self):\n        return len(self.df)\n    def __getitem__(self,item):\n        X,y = self.X_dict[self.idd[item]],self.y_dict[self.idd[item]]\n        X = torch.Tensor(np.array(X,dtype=float))\n        y = int(y)\n        return X,y","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:49:04.619351Z","iopub.status.busy":"2022-06-19T05:49:04.619026Z","iopub.status.idle":"2022-06-19T05:49:04.629904Z","shell.execute_reply":"2022-06-19T05:49:04.629069Z","shell.execute_reply.started":"2022-06-19T05:49:04.619322Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MetricMonitor:\n    def __init__(self, float_precision=3):\n        self.float_precision = float_precision\n        self.reset()\n\n    def reset(self):\n        self.metrics = defaultdict(lambda: {\"val\": 0, \"count\": 0, \"avg\": 0})\n\n    def update(self, metric_name, val):\n        metric = self.metrics[metric_name]\n\n        metric[\"val\"] += val\n        metric[\"count\"] += 1\n        metric[\"avg\"] = metric[\"val\"] / metric[\"count\"]\n\n    def __str__(self):\n        return \" | \".join(\n            [\n                \"{metric_name}: {avg:.{float_precision}f}\".format(\n                    metric_name=metric_name, avg=metric[\"avg\"], float_precision=self.float_precision\n                )\n                for (metric_name, metric) in self.metrics.items()])","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:49:04.633968Z","iopub.status.busy":"2022-06-19T05:49:04.633584Z","iopub.status.idle":"2022-06-19T05:49:04.643129Z","shell.execute_reply":"2022-06-19T05:49:04.641788Z","shell.execute_reply.started":"2022-06-19T05:49:04.633934Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(f\"Using {device} device\")\nfrom torch.autograd import Variable \n\nclass LSTM1(nn.Module):\n    def __init__(self, num_classes, input_size, hidden_size, num_layers, seq_length):\n        super(LSTM1, self).__init__()\n        self.num_classes = num_classes #number of classes\n        self.num_layers = num_layers #number of layers\n        self.input_size = input_size #input size\n        self.hidden_size = hidden_size #hidden state\n        self.seq_length = seq_length #sequence length\n\n        self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size,\n                          num_layers=num_layers, batch_first=True) #lstm\n        self.fc_1 =  nn.Linear(hidden_size, 128) #fully connected 1\n        self.fc = nn.Linear(128, num_classes) #fully connected last layer\n\n        self.relu = nn.ReLU()\n    \n    def forward(self,x):\n        h_0 = Variable(torch.zeros(self.num_layers, 1, self.hidden_size)).to(device) #hidden state\n        c_0 = Variable(torch.zeros(self.num_layers, 1, self.hidden_size)).to(device) #internal state\n        # Propagate input through LSTM\n        x = x.unsqueeze(0)\n        output, (hn, cn) = self.lstm(x, (h_0, c_0)) #lstm with input, hidden, and internal state\n        hn = hn.view(-1, self.hidden_size) #reshaping the data for Dense layer next\n        out = self.relu(hn)\n        out = self.fc_1(out) #first Dense\n        out = self.relu(out) #relu\n        out = self.fc(out) #Final Output\n        return out\n    \n# Define model\nnum_epochs = 1000 #1000 epochs\nlearning_rate = 0.001 #0.001 lr\n\ninput_size = 3 #number of features\nhidden_size = 3 #number of features in hidden state\nnum_layers = 10 #number of stacked lstm layers\n\nnum_classes = 2 #number of output classes \n\n\nmodel = LSTM1(num_classes, input_size, hidden_size, num_layers, 3) #our lstm class\nmodel = model.to(device)\nprint(model)","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:49:04.644821Z","iopub.status.busy":"2022-06-19T05:49:04.644482Z","iopub.status.idle":"2022-06-19T05:49:04.696904Z","shell.execute_reply":"2022-06-19T05:49:04.69611Z","shell.execute_reply.started":"2022-06-19T05:49:04.644791Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-3)","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:49:04.698451Z","iopub.status.busy":"2022-06-19T05:49:04.698141Z","iopub.status.idle":"2022-06-19T05:49:04.703502Z","shell.execute_reply":"2022-06-19T05:49:04.702768Z","shell.execute_reply.started":"2022-06-19T05:49:04.698413Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = P_Dataset('../input/datasplit/train_P.csv')","metadata":{"execution":{"iopub.execute_input":"2022-06-19T05:49:04.705026Z","iopub.status.busy":"2022-06-19T05:49:04.704606Z","iopub.status.idle":"2022-06-19T06:13:10.479917Z","shell.execute_reply":"2022-06-19T06:13:10.478321Z","shell.execute_reply.started":"2022-06-19T05:49:04.704986Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_all = dataset.__len__()\nnum_train = int(0.8*num_all)\nnum_val = int(num_all-num_train)\ntrain_set, val_set = torch.utils.data.random_split(dataset, [num_train,num_val])","metadata":{"execution":{"iopub.execute_input":"2022-06-19T06:15:33.644003Z","iopub.status.busy":"2022-06-19T06:15:33.643478Z","iopub.status.idle":"2022-06-19T06:15:34.56022Z","shell.execute_reply":"2022-06-19T06:15:34.559073Z","shell.execute_reply.started":"2022-06-19T06:15:33.643965Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import DataLoader\nbatch_size = 10\n\n# Create data loaders.\ntrain_loader = DataLoader(train_set, batch_size=batch_size)\nval_loader = DataLoader(val_set, batch_size=batch_size)\n\nfor X, y in val_loader:\n    print(f\"Shape of X [N, C, H, W]: {X.shape}\")\n    print(f\"Shape of y: {y.shape} {y.dtype}\")\n    break","metadata":{"execution":{"iopub.execute_input":"2022-06-19T06:15:38.165363Z","iopub.status.busy":"2022-06-19T06:15:38.164935Z","iopub.status.idle":"2022-06-19T06:15:38.176165Z","shell.execute_reply":"2022-06-19T06:15:38.175336Z","shell.execute_reply.started":"2022-06-19T06:15:38.165331Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"next(iter(train_loader))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(train_loader, model, criterion, optimizer, epoch):\n    metric_monitor = MetricMonitor()\n    model.train()\n    stream = tqdm(train_loader)\n    for i, (images, target) in enumerate(stream, start=1):\n        images = images.to(device, non_blocking=True)\n        target = target.to(device, non_blocking=True).long()\n        output = model(images)\n        loss = criterion(output, target)\n        accuracy = (torch.argmax(output,1)==target).sum()/len(images)\n        metric_monitor.update(\"Loss\", loss.item())\n        metric_monitor.update(\"Accuracy\", accuracy)\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        stream.set_description(\n            \"Epoch: {epoch}. Train.      {metric_monitor}\".format(epoch=epoch, metric_monitor=metric_monitor)\n        )\n\ndef validate(val_loader, model, criterion, epoch):\n    metric_monitor = MetricMonitor()\n    model.eval()\n    stream = tqdm(val_loader)\n    with torch.no_grad():\n        for i, (images, target) in enumerate(stream, start=1):\n            images = images.to(device, non_blocking=True)\n            target = target.to(device, non_blocking=True).long()\n            output = model(images)\n            loss = criterion(output, target)\n            accuracy = (torch.argmax(output,1)==target).sum()/len(images)\n\n            metric_monitor.update(\"Loss\", loss.item())\n            metric_monitor.update(\"Accuracy\", accuracy)\n            stream.set_description(\n                \"Epoch: {epoch}. Validation. {metric_monitor}\".format(epoch=epoch, metric_monitor=metric_monitor)\n            )\n\n","metadata":{"execution":{"iopub.execute_input":"2022-06-19T06:15:40.795457Z","iopub.status.busy":"2022-06-19T06:15:40.794459Z","iopub.status.idle":"2022-06-19T06:15:40.812211Z","shell.execute_reply":"2022-06-19T06:15:40.811243Z","shell.execute_reply.started":"2022-06-19T06:15:40.795393Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 50\nfor epoch in range(1, epochs + 1):\n    train(train_loader, model, criterion, optimizer, epoch)\n    validate(val_loader, model, criterion, epoch)","metadata":{"execution":{"iopub.execute_input":"2022-06-19T06:15:43.889003Z","iopub.status.busy":"2022-06-19T06:15:43.887923Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}