{"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":"# <a href='https://github.com/YuanGongND/ast'>AST: Audio Spectrogram Transformer</a>\n\n**This don't need to resize your input. Also I don't know what the hyper-parameters in the model exactly mean So most likely I made a huge mistake somewhere in the hyperparameters but I have made a quick implementation of the model for the community. Here you go.** ","metadata":{}},{"cell_type":"markdown","source":"# Importing Libraries","metadata":{"papermill":{"duration":0.018345,"end_time":"2021-07-01T14:31:32.640858","exception":false,"start_time":"2021-07-01T14:31:32.622513","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!git clone https://github.com/YuanGongND/ast.git --quiet\n!pip install llvmlite --quiet\n!pip install wget --quiet\n!pip install zipp --quiet\n!pip install wandb --upgrade --quiet\n!pip install nnAudio --quiet\n!pip install pytorch_lightning --quiet","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:40:31.748416Z","iopub.execute_input":"2021-07-11T14:40:31.748805Z","iopub.status.idle":"2021-07-11T14:41:07.852275Z","shell.execute_reply.started":"2021-07-11T14:40:31.748750Z","shell.execute_reply":"2021-07-11T14:41:07.851164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install timm==0.4.5","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:07.859364Z","iopub.execute_input":"2021-07-11T14:41:07.859971Z","iopub.status.idle":"2021-07-11T14:41:13.393444Z","shell.execute_reply.started":"2021-07-11T14:41:07.859920Z","shell.execute_reply":"2021-07-11T14:41:13.392471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.append('./ast/src')","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:13.395424Z","iopub.execute_input":"2021-07-11T14:41:13.395802Z","iopub.status.idle":"2021-07-11T14:41:13.402192Z","shell.execute_reply.started":"2021-07-11T14:41:13.395761Z","shell.execute_reply":"2021-07-11T14:41:13.401205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport glob\nimport wandb\nimport shutil\n\nfrom PIL import Image\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport timm\nimport torch\nfrom models import ASTModel\nimport pytorch_lightning as pl\nfrom torch.utils.data import Dataset, DataLoader\n\nfrom nnAudio.Spectrogram import CQT1992v2\n\nfrom tqdm.notebook import tqdm\n\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\nfrom sklearn import preprocessing\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.model_selection import train_test_split\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:13.403628Z","iopub.execute_input":"2021-07-11T14:41:13.404090Z","iopub.status.idle":"2021-07-11T14:41:15.419799Z","shell.execute_reply.started":"2021-07-11T14:41:13.404050Z","shell.execute_reply":"2021-07-11T14:41:15.418878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%cd ./ast/\n\nbase_model = ASTModel(label_dim=1,\n                     fstride=5, tstride=5, \\\n                     input_fdim=69, input_tdim=193, \\\n                     imagenet_pretrain=True, audioset_pretrain=False, \\\n                     model_size='base384')","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:15.421190Z","iopub.execute_input":"2021-07-11T14:41:15.421523Z","iopub.status.idle":"2021-07-11T14:41:17.008341Z","shell.execute_reply.started":"2021-07-11T14:41:15.421488Z","shell.execute_reply":"2021-07-11T14:41:17.007391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Loading","metadata":{}},{"cell_type":"code","source":"%cd /kaggle/working\n\ntrain = pd.read_csv('../input/g2net-gravitational-wave-detection/training_labels.csv')\ntest = pd.read_csv('../input/g2net-gravitational-wave-detection/sample_submission.csv')\n\ndef get_train_file_path(image_id):\n    return \"../input/g2net-gravitational-wave-detection/train/{}/{}/{}/{}.npy\".format(\n        image_id[0], image_id[1], image_id[2], image_id)\n\ndef get_test_file_path(image_id):\n    return \"../input/g2net-gravitational-wave-detection/test/{}/{}/{}/{}.npy\".format(\n        image_id[0], image_id[1], image_id[2], image_id)\n\ntrain['file_path'] = train['id'].apply(get_train_file_path)\ntest['file_path'] = test['id'].apply(get_test_file_path)\n\ndisplay(train.head(2))\ndisplay(test.head(2))","metadata":{"papermill":{"duration":1.251215,"end_time":"2021-07-01T14:31:34.678928","exception":false,"start_time":"2021-07-01T14:31:33.427713","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-11T14:41:17.009718Z","iopub.execute_input":"2021-07-11T14:41:17.010258Z","iopub.status.idle":"2021-07-11T14:41:18.009764Z","shell.execute_reply.started":"2021-07-11T14:41:17.010214Z","shell.execute_reply":"2021-07-11T14:41:18.008770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CFG","metadata":{"papermill":{"duration":0.028932,"end_time":"2021-07-01T14:31:37.928007","exception":false,"start_time":"2021-07-01T14:31:37.899075","status":"completed"},"tags":[]}},{"cell_type":"code","source":"wandb.login()","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:18.011160Z","iopub.execute_input":"2021-07-11T14:41:18.011522Z","iopub.status.idle":"2021-07-11T14:41:18.920848Z","shell.execute_reply.started":"2021-07-11T14:41:18.011483Z","shell.execute_reply":"2021-07-11T14:41:18.919868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ====================================================\n# CFG\n# ====================================================\nclass Config:\n    debug = False\n    num_workers = 4\n    epochs = 3\n    lr = 1e-4\n    weight_decay = 1e-6\n    batch_size = 32\n    seed = 1234\n    target_size = 1\n    n_folds = 5\n    target_col = 'target'\n    LOSS = torch.nn.BCEWithLogitsLoss()\n    epochs = 10\n    dev_run = False\n\nif Config.debug:\n    train = train.sample(n=50000, random_state=Config.seed).reset_index(drop=True)\n    Config.epochs = 1\n    Config.dev_run = True\n    \n\npl.seed_everything(Config.seed)","metadata":{"papermill":{"duration":0.181532,"end_time":"2021-07-01T14:31:38.138409","exception":false,"start_time":"2021-07-01T14:31:37.956877","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-11T14:41:18.923595Z","iopub.execute_input":"2021-07-11T14:41:18.923948Z","iopub.status.idle":"2021-07-11T14:41:18.935140Z","shell.execute_reply.started":"2021-07-11T14:41:18.923913Z","shell.execute_reply":"2021-07-11T14:41:18.933956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Simple train valid split","metadata":{"papermill":{"duration":0.02877,"end_time":"2021-07-01T14:31:41.680818","exception":false,"start_time":"2021-07-01T14:31:41.652048","status":"completed"},"tags":[]}},{"cell_type":"code","source":"train, valid = train_test_split(train, test_size=0.3, stratify=train['target'])","metadata":{"papermill":{"duration":0.060375,"end_time":"2021-07-01T14:31:41.769944","exception":false,"start_time":"2021-07-01T14:31:41.709569","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-11T14:41:18.937261Z","iopub.execute_input":"2021-07-11T14:41:18.937627Z","iopub.status.idle":"2021-07-11T14:41:19.479829Z","shell.execute_reply.started":"2021-07-11T14:41:18.937591Z","shell.execute_reply":"2021-07-11T14:41:19.478939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset","metadata":{"papermill":{"duration":0.028894,"end_time":"2021-07-01T14:31:41.827575","exception":false,"start_time":"2021-07-01T14:31:41.798681","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# ====================================================\n# Dataset\n# ====================================================\nclass TrainDataset(Dataset):\n    def __init__(self, df, transform=None):\n        self.df = df\n        self.file_names = df['file_path'].values\n        self.labels = df[Config.target_col].values\n        self.wave_transform = CQT1992v2(sr=2048, fmin=20, fmax=1024, hop_length=64)\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def apply_qtransform(self, waves, transform):\n        waves = np.hstack(waves)\n        waves = waves / np.max(waves)\n        waves = torch.from_numpy(waves).float()\n        image = transform(waves)\n        return image\n\n    def __getitem__(self, idx):\n        file_path = self.file_names[idx]\n        waves = np.load(file_path)\n        image = self.apply_qtransform(waves, self.wave_transform)\n        if self.transform:\n            image = image.squeeze().numpy()\n            image = self.transform(image=image)['image']\n        label = torch.tensor(self.labels[idx]).float()\n        return image[0], label","metadata":{"papermill":{"duration":0.040385,"end_time":"2021-07-01T14:31:41.897587","exception":false,"start_time":"2021-07-01T14:31:41.857202","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-11T14:41:19.481988Z","iopub.execute_input":"2021-07-11T14:41:19.482251Z","iopub.status.idle":"2021-07-11T14:41:19.492552Z","shell.execute_reply.started":"2021-07-11T14:41:19.482225Z","shell.execute_reply":"2021-07-11T14:41:19.491732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transforms","metadata":{}},{"cell_type":"code","source":"# ====================================================\n# Transforms\n# ====================================================\ndef get_transforms(*, data):\n    \n    if data == 'train':\n        return A.Compose([\n            ToTensorV2(),\n        ])\n\n    elif data == 'valid':\n        return A.Compose([\n            ToTensorV2(),\n        ])","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:19.493841Z","iopub.execute_input":"2021-07-11T14:41:19.494418Z","iopub.status.idle":"2021-07-11T14:41:19.501738Z","shell.execute_reply.started":"2021-07-11T14:41:19.494377Z","shell.execute_reply":"2021-07-11T14:41:19.500927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = TrainDataset(train, transform=get_transforms(data='train'))\n\ntrain_dl = DataLoader(train_dataset, \n                      batch_size=Config.batch_size,\n                      num_workers=Config.num_workers,\n                      shuffle=True,\n                      pin_memory=True)\n\nvalid_dataset = TrainDataset(valid, transform=get_transforms(data='valid'))\n\nvalid_dl = DataLoader(valid_dataset,\n                     batch_size=Config.batch_size,\n                     num_workers=Config.num_workers,\n                     pin_memory=True)","metadata":{"papermill":{"duration":1.037231,"end_time":"2021-07-01T14:31:42.96351","exception":false,"start_time":"2021-07-01T14:31:41.926279","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-11T14:41:19.503062Z","iopub.execute_input":"2021-07-11T14:41:19.503438Z","iopub.status.idle":"2021-07-11T14:41:19.549030Z","shell.execute_reply.started":"2021-07-11T14:41:19.503399Z","shell.execute_reply":"2021-07-11T14:41:19.548203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample = None\nfor i in train_dl:\n    print(i[0].shape, i[1])\n    sample = i[0]\n    break","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:19.551506Z","iopub.execute_input":"2021-07-11T14:41:19.551793Z","iopub.status.idle":"2021-07-11T14:41:23.044889Z","shell.execute_reply.started":"2021-07-11T14:41:19.551770Z","shell.execute_reply":"2021-07-11T14:41:23.043936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# MODEL","metadata":{"papermill":{"duration":0.03649,"end_time":"2021-07-01T14:31:43.035743","exception":false,"start_time":"2021-07-01T14:31:42.999253","status":"completed"},"tags":[]}},{"cell_type":"code","source":"class Classifier(pl.LightningModule):\n    \n    def __init__(self):\n        super(Classifier, self).__init__()\n        self.model = base_model\n        \n    def forward(self, x):\n        output = self.model(x)\n        return output\n    \n    def training_step(self, batch, batch_no):\n        images, labels = batch\n        outputs = self(images)\n        loss = Config.LOSS(outputs.view(-1), labels)\n        return loss\n    \n    def validation_step(self, batch, batch_no):\n        images, labels = batch\n        outputs = self(images)\n        loss = Config.LOSS(outputs.view(-1), labels)\n        return loss\n    \n    def configure_optimizers(self):\n        optimizer = torch.optim.Adam(self.parameters(), lr=Config.lr, \n                                     weight_decay=Config.weight_decay)\n        return optimizer","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:23.049261Z","iopub.execute_input":"2021-07-11T14:41:23.051346Z","iopub.status.idle":"2021-07-11T14:41:23.062468Z","shell.execute_reply.started":"2021-07-11T14:41:23.051302Z","shell.execute_reply":"2021-07-11T14:41:23.061415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Classifier()","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:23.077014Z","iopub.execute_input":"2021-07-11T14:41:23.078794Z","iopub.status.idle":"2021-07-11T14:41:23.088841Z","shell.execute_reply.started":"2021-07-11T14:41:23.078754Z","shell.execute_reply":"2021-07-11T14:41:23.084104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"wandb_logger = pl.loggers.WandbLogger(project='G2Net')\n\ntrainer = pl.Trainer(gpus=1, max_epochs=Config.epochs, fast_dev_run=Config.dev_run, logger=wandb_logger)","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:23.090178Z","iopub.execute_input":"2021-07-11T14:41:23.090520Z","iopub.status.idle":"2021-07-11T14:41:23.113589Z","shell.execute_reply.started":"2021-07-11T14:41:23.090484Z","shell.execute_reply":"2021-07-11T14:41:23.111979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainer.fit(model, train_dl, valid_dl)","metadata":{"execution":{"iopub.status.busy":"2021-07-11T14:41:23.118018Z","iopub.execute_input":"2021-07-11T14:41:23.118718Z","iopub.status.idle":"2021-07-11T14:44:27.262116Z","shell.execute_reply.started":"2021-07-11T14:41:23.118680Z","shell.execute_reply":"2021-07-11T14:44:27.261133Z"},"trusted":true},"execution_count":null,"outputs":[]}]}