{"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":"markdown","source":"## Waveform Word Count Pytorch Lightning (No ImageFolder)\nhttps://www.kaggle.com/stpeteishii/butterfly-pytorch-lightning-cnn-no-imagefolder","metadata":{"papermill":{"duration":0.005969,"end_time":"2023-06-29T16:43:37.201157","exception":false,"start_time":"2023-06-29T16:43:37.195188","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import os\nimport random\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import random_split\nfrom torch.utils.data import DataLoader, Dataset, Subset\nfrom torch.utils.data import random_split, SubsetRandomSampler\nfrom torchvision import datasets, transforms, models \nfrom torchvision.datasets import ImageFolder\nfrom torchvision.transforms import ToTensor\nfrom torchvision.utils import make_grid\nfrom pytorch_lightning import LightningModule\nfrom pytorch_lightning import Trainer\nimport pytorch_lightning as pl\nimport matplotlib.pyplot as plt\n%matplotlib inline\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\nfrom PIL import Image","metadata":{"papermill":{"duration":17.952574,"end_time":"2023-06-29T16:43:55.158831","exception":false,"start_time":"2023-06-29T16:43:37.206257","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-18T16:38:34.976461Z","iopub.execute_input":"2023-08-18T16:38:34.976880Z","iopub.status.idle":"2023-08-18T16:38:34.990390Z","shell.execute_reply.started":"2023-08-18T16:38:34.976850Z","shell.execute_reply":"2023-08-18T16:38:34.989098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform=transforms.Compose([\n        transforms.RandomRotation(10),      # rotate +/- 10 degrees\n        transforms.RandomHorizontalFlip(),  # reverse 50% of images\n        transforms.Resize(224),             # resize shortest side to 224 pixels\n        transforms.CenterCrop(224),         # crop longest side to 224 pixels at center\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406],\n                             [0.229, 0.224, 0.225])\n])","metadata":{"papermill":{"duration":0.015424,"end_time":"2023-06-29T16:43:55.179538","exception":false,"start_time":"2023-06-29T16:43:55.164114","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-18T16:38:34.992368Z","iopub.execute_input":"2023-08-18T16:38:34.992732Z","iopub.status.idle":"2023-08-18T16:38:35.007125Z","shell.execute_reply.started":"2023-08-18T16:38:34.992701Z","shell.execute_reply":"2023-08-18T16:38:35.006124Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dir0='/kaggle/input/waveform-images-of-bengali-sound/train'\npaths=[]\nidx=[]\nfor dirname, _, filenames in os.walk(dir0):\n    for filename in filenames:\n        idx+=[filename[0:-4]]\n        path=os.path.join(dirname, filename)  \n        paths+=[path]\nprint(len(idx))            ","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:35.009248Z","iopub.execute_input":"2023-08-18T16:38:35.009655Z","iopub.status.idle":"2023-08-18T16:38:35.092155Z","shell.execute_reply.started":"2023-08-18T16:38:35.009624Z","shell.execute_reply":"2023-08-18T16:38:35.091095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data=pd.read_csv('/kaggle/input/bengali-one-two-word-s-mel-spectrogram/train_count.csv')\ndata['count']=data['count'].astype(int)\ndisplay(data['count'].value_counts())","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:35.093487Z","iopub.execute_input":"2023-08-18T16:38:35.094320Z","iopub.status.idle":"2023-08-18T16:38:39.264230Z","shell.execute_reply.started":"2023-08-18T16:38:35.094285Z","shell.execute_reply":"2023-08-18T16:38:39.262976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data2=data[(data['id'].isin(idx)) & (data['count']<15) & (data['count']>2)]\ndisplay(data2['count'].value_counts())","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:39.266983Z","iopub.execute_input":"2023-08-18T16:38:39.267466Z","iopub.status.idle":"2023-08-18T16:38:39.392349Z","shell.execute_reply.started":"2023-08-18T16:38:39.267432Z","shell.execute_reply":"2023-08-18T16:38:39.390944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_names=[]\nfor i in range(3,15):\n    class_names+=[str(i).zfill(2)]\nN=list(range(12))\nnormal_mapping=dict(zip(class_names,N)) \nreverse_mapping=dict(zip(N,class_names))       \ndata2['label']=data2['count'].apply(lambda x: x-3)\ndata2['path']=data2['id'].apply(lambda x: os.path.join(dir0,x+'.png'))\ndisplay(data2)\ndisplay(data2['count'].value_counts())","metadata":{"papermill":{"duration":1.438294,"end_time":"2023-06-29T16:43:56.622966","exception":false,"start_time":"2023-06-29T16:43:55.184672","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-18T16:38:39.393647Z","iopub.execute_input":"2023-08-18T16:38:39.393986Z","iopub.status.idle":"2023-08-18T16:38:39.426544Z","shell.execute_reply.started":"2023-08-18T16:38:39.393959Z","shell.execute_reply":"2023-08-18T16:38:39.425402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_path_label_list(df):\n    path_label_list = []\n    for _, row in df.iterrows():\n        path = row['path']\n        label = row['label']\n        path_label_list.append((path, label))\n    return path_label_list\n\npath_label = create_path_label_list(data2)\nprint(path_label[0:3])","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:39.430164Z","iopub.execute_input":"2023-08-18T16:38:39.430558Z","iopub.status.idle":"2023-08-18T16:38:39.500423Z","shell.execute_reply.started":"2023-08-18T16:38:39.430525Z","shell.execute_reply":"2023-08-18T16:38:39.499129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomDataset(torch.utils.data.Dataset):\n    def __init__(self, path_label, transform=transform):\n        self.path_label = path_label\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.path_label)\n\n    def __getitem__(self, idx):\n        path, label = self.path_label[idx]\n        img = Image.open(path).convert('RGB')\n        img = self.transform(img)\n        #print(img.shape)#torch.Size([3, 224, 224])\n        return img, label\n","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:39.501753Z","iopub.execute_input":"2023-08-18T16:38:39.502084Z","iopub.status.idle":"2023-08-18T16:38:39.510075Z","shell.execute_reply.started":"2023-08-18T16:38:39.502057Z","shell.execute_reply":"2023-08-18T16:38:39.508860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageDataset(pl.LightningDataModule):\n    def __init__(self, path_label, batch_size=16):\n        super().__init__()\n        self.path_label = path_label\n        self.batch_size = batch_size\n        self.transform = transforms.Compose([\n            transforms.ToTensor(),\n            transforms.Resize(224),     \n            transforms.CenterCrop(224),              \n        ])\n\n    def setup(self, stage=None):\n        dataset = CustomDataset(self.path_label, self.transform)\n        dataset_size = len(dataset)\n        train_size = int(0.8 * dataset_size) \n        test_size = dataset_size - train_size\n\n        self.train_dataset = torch.utils.data.Subset(dataset, range(train_size))\n        self.test_dataset = torch.utils.data.Subset(dataset, range(train_size, dataset_size))\n\n    def __len__(self):\n        if self.train_dataset is not None:\n            return len(self.train_dataset)\n        elif self.test_dataset is not None:\n            return len(self.test_dataset)\n        else:\n            return 0\n\n    def __getitem__(self, index):\n        if self.train_dataset is not None:\n            return self.train_dataset[index]\n        elif self.test_dataset is not None:\n            return self.test_dataset[index]\n        else:\n            raise IndexError(\"Index out of range. The dataset is empty.\")\n\n    def train_dataloader(self):\n        return DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)\n\n    def val_dataloader(self):\n        return DataLoader(self.test_dataset, batch_size=self.batch_size)\n\n    def test_dataloader(self):\n        return DataLoader(self.test_dataset, batch_size=self.batch_size)","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:39.511427Z","iopub.execute_input":"2023-08-18T16:38:39.511773Z","iopub.status.idle":"2023-08-18T16:38:39.528601Z","shell.execute_reply.started":"2023-08-18T16:38:39.511745Z","shell.execute_reply":"2023-08-18T16:38:39.527302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DataModule(pl.LightningDataModule):\n    \n    def __init__(self, transform=transform, batch_size=16):\n        super().__init__()\n        self.root_dir = \"/kaggle/input/waveform-images-of-bengali-sound/train\"\n        self.transform = transform\n        self.batch_size = batch_size\n\n    def setup(self, stage=None):\n        n_data = len(dataset)\n        n_train = int(0.8 * n_data)\n        n_test = n_data - n_train\n\n        train_dataset, test_dataset =  random_split(dataset, [n_train, n_test])\n\n        self.train_dataset = DataLoader(train_dataset, batch_size=self.batch_size, shuffle=True)\n        self.test_dataset = DataLoader(test_dataset, batch_size=self.batch_size)\n\n    def train_dataloader(self):\n        return self.train_dataset\n\n    def test_dataloader(self):\n        return self.test_dataset\n","metadata":{"papermill":{"duration":0.02025,"end_time":"2023-06-29T16:43:56.648651","exception":false,"start_time":"2023-06-29T16:43:56.628401","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-18T16:38:39.533769Z","iopub.execute_input":"2023-08-18T16:38:39.534134Z","iopub.status.idle":"2023-08-18T16:38:39.544644Z","shell.execute_reply.started":"2023-08-18T16:38:39.534104Z","shell.execute_reply":"2023-08-18T16:38:39.543456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ConvolutionalNetwork(LightningModule):\n    \n    def __init__(self):\n        super(ConvolutionalNetwork, self).__init__()\n        self.conv1 = nn.Conv2d(3, 6, 3, 1)\n        self.conv2 = nn.Conv2d(6, 16, 3, 1)\n        self.fc1 = nn.Linear(16 * 54 * 54, 120)\n        self.fc2 = nn.Linear(120, 84)\n        self.fc3 = nn.Linear(84, 20)\n        self.fc4 = nn.Linear(20, len(class_names))\n\n    def forward(self, X):\n        X = F.relu(self.conv1(X))\n        X = F.max_pool2d(X, 2, 2)\n        X = F.relu(self.conv2(X))\n        X = F.max_pool2d(X, 2, 2)\n        X = X.view(-1, 16 * 54 * 54)\n        X = F.relu(self.fc1(X))\n        X = F.relu(self.fc2(X))\n        X = F.relu(self.fc3(X))\n        X = self.fc4(X)\n        return F.log_softmax(X, dim=1)\n\n    def configure_optimizers(self):\n        optimizer = torch.optim.Adam(self.parameters(), lr=0.001)\n        return optimizer\n\n    def training_step(self, train_batch, batch_idx):\n        X, y = train_batch\n        y_hat = self(X)\n        loss = F.cross_entropy(y_hat, y)\n        pred = y_hat.argmax(dim=1, keepdim=True)\n        acc = pred.eq(y.view_as(pred)).sum().item() / y.shape[0]\n        self.log(\"train_loss\", loss)\n        self.log(\"train_acc\", acc)\n        return loss\n\n    def validation_step(self, val_batch, batch_idx):\n        X, y = val_batch\n        y_hat = self(X)\n        loss = F.cross_entropy(y_hat, y)\n        pred = y_hat.argmax(dim=1, keepdim=True)\n        acc = pred.eq(y.view_as(pred)).sum().item() / y.shape[0]\n        self.log(\"val_loss\", loss)\n        self.log(\"val_acc\", acc)\n\n    def test_step(self, test_batch, batch_idx):\n        X, y = test_batch\n        y_hat = self(X)\n        loss = F.cross_entropy(y_hat, y)\n        pred = y_hat.argmax(dim=1, keepdim=True)\n        acc = pred.eq(y.view_as(pred)).sum().item() / y.shape[0]\n        self.log(\"test_loss\", loss)\n        self.log(\"test_acc\", acc)","metadata":{"papermill":{"duration":0.028519,"end_time":"2023-06-29T16:43:56.683059","exception":false,"start_time":"2023-06-29T16:43:56.65454","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-18T16:38:39.546165Z","iopub.execute_input":"2023-08-18T16:38:39.546535Z","iopub.status.idle":"2023-08-18T16:38:39.566639Z","shell.execute_reply.started":"2023-08-18T16:38:39.546493Z","shell.execute_reply":"2023-08-18T16:38:39.565389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if __name__ == '__main__':\n    dataset = ImageDataset(path_label)\n    dataset.setup() \n    train_dataloader = dataset.train_dataloader()\n    test_dataloader = dataset.test_dataloader()\n    datamodule = DataModule()\n    datamodule.setup()\n    model = ConvolutionalNetwork()\n    trainer = pl.Trainer(max_epochs=40)\n    trainer.fit(model, datamodule)","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:39.568512Z","iopub.execute_input":"2023-08-18T16:38:39.568933Z","iopub.status.idle":"2023-08-18T16:38:39.634245Z","shell.execute_reply.started":"2023-08-18T16:38:39.568899Z","shell.execute_reply":"2023-08-18T16:38:39.633319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"    datamodule.setup(stage='test')\n    test_loader = datamodule.test_dataloader()\n    trainer.test(dataloaders=test_loader)","metadata":{"execution":{"iopub.status.busy":"2023-08-18T16:38:57.875562Z","iopub.execute_input":"2023-08-18T16:38:57.875902Z","iopub.status.idle":"2023-08-18T16:38:59.224923Z","shell.execute_reply.started":"2023-08-18T16:38:57.875873Z","shell.execute_reply":"2023-08-18T16:38:59.224045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for images, labels in datamodule.train_dataloader():\n    break\nim=make_grid(images,nrow=16)\n\nplt.figure(figsize=(12,12))\nplt.imshow(np.transpose(im.numpy(),(1,2,0)))\n\ninv_normalize=transforms.Normalize(mean=[-0.485/0.229,-0.456/0.224,-0.406/0.225],\n                                   std=[1/0.229,1/0.224,1/0.225])\nim=inv_normalize(im)\n\nplt.figure(figsize=(12,12))\nplt.imshow(np.transpose(im.numpy(),(1,2,0)))","metadata":{"papermill":{"duration":2.613578,"end_time":"2023-06-29T17:33:32.819897","exception":false,"start_time":"2023-06-29T17:33:30.206319","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-18T16:38:59.226305Z","iopub.execute_input":"2023-08-18T16:38:59.227360Z","iopub.status.idle":"2023-08-18T16:39:00.131036Z","shell.execute_reply.started":"2023-08-18T16:38:59.227302Z","shell.execute_reply":"2023-08-18T16:39:00.129744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cpu\")   #\"cuda:0\"\n\nmodel.eval()\ny_true=[]\ny_pred=[]\nwith torch.no_grad():\n    for test_data in datamodule.test_dataloader():\n        test_images, test_labels = test_data[0].to(device), test_data[1].to(device)\n        pred = model(test_images).argmax(dim=1)\n        for i in range(len(pred)):\n            y_true.append(test_labels[i].item())\n            y_pred.append(pred[i].item())\n\nprint(classification_report(y_true,y_pred,target_names=class_names,digits=4))","metadata":{"papermill":{"duration":38.724861,"end_time":"2023-06-29T17:34:11.559067","exception":false,"start_time":"2023-06-29T17:33:32.834206","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-18T16:39:00.132862Z","iopub.execute_input":"2023-08-18T16:39:00.133219Z","iopub.status.idle":"2023-08-18T16:39:01.323378Z","shell.execute_reply.started":"2023-08-18T16:39:00.133189Z","shell.execute_reply":"2023-08-18T16:39:01.322032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"According to the results of this study, it seems possible to infer the number of words contained in a waveform.","metadata":{}},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.014673,"end_time":"2023-06-29T17:34:11.58994","exception":false,"start_time":"2023-06-29T17:34:11.575267","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.015525,"end_time":"2023-06-29T17:34:11.683357","exception":false,"start_time":"2023-06-29T17:34:11.667832","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}