{"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 pandas as pd\nimport numpy as np\nimport os\nimport h5py\nimport matplotlib.pyplot as plt\nimport librosa.display\nimport librosa\n\nfrom glob import glob\nfrom matplotlib import rcParams\nfrom sklearn.model_selection import train_test_split\n%matplotlib inline\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nimport torchaudio\n\nfrom tqdm import tqdm, notebook\nfrom random import randint\n\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\n\ntrainDataPath = \"../input/g2net-detecting-continuous-gravitational-waves/train/\"\ntrainLabels = pd.read_csv(\"../input/g2net-detecting-continuous-gravitational-waves/train_labels.csv\")\n\n# L1 - data from the LIGO Livingston interferometer\n# H1 - data from the LIGO Hanford interferometer\n# frequency Hz - the range frequencies measured by the detectors - shape (360,)\n\n    # SFTs - Short-time Fourier Transforms (SFTs) - shape (360, n)\n    # timestamps - the timestamps that the STFs correspond to - shape (n,)\n    \n# thanks ANANT GUPTA\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !pip install timm\ntrainLabels.target.describe()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idx  = 11\n\nsample  = trainDataPath + trainLabels.id[idx] + '.hdf5'\nsample = h5py.File(sample, 'r')\nstored_data = sample[trainLabels.id[idx]]\n\nL1 = stored_data['L1']\nL1_SFTs = L1['SFTs']\nL1_timestamps = L1['timestamps_GPS']\n\nH1 = stored_data['H1']\nH1_SFTs = H1['SFTs']\nH1_timestamps = H1['timestamps_GPS']\n\nfrequenzy_Hz = stored_data['frequency_Hz']\n\n# print(np.array(L1_SFTs).shape)\nL1_mag, L1_phase = librosa.magphase(np.array(L1_SFTs)*1e22)\nL1_mel = librosa.feature.melspectrogram(S=L1_mag, sr=frequenzy_Hz[idx], n_mels=128) #sr=frequenzy_Hz[idx]\nL1_log = librosa.power_to_db(L1_mel)\n\n# print(np.array(H1_SFTs).shape)\nH1_mag, H1_phase = librosa.magphase(np.array(H1_SFTs)*1e22)\nH1_mel = librosa.feature.melspectrogram(S=H1_mag, sr=frequenzy_Hz[idx], n_mels=128)\nH1_log = librosa.power_to_db(H1_mel)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# rcParams['axes.titlecolor'] = 'w'\n# rcParams['axes.titlesize'] = 14\n# rcParams['axes.titleweight'] = 'bold'\n\n# plt.figure(figsize=(18,5))\n# plt.subplot(1,2,1)\n# L1_img = librosa.display.specshow(L1_mel)\n# # L1_img = librosa.display.specshow(L1_log)\n# plt.title(\"L1 Short-time Fourier Transforms\")\n# plt.colorbar()\n\n# plt.subplot(1,2,2)\n# H1_img = librosa.display.specshow(H1_mel)\n# # H1_img = librosa.display.specshow(H1_log)\n# plt.title(\"H1 Short-time Fourier Transforms\")\n# plt.colorbar()\n\n# plt.tight_layout()\n# plt.axis(\"on\")\n# plt.show()","metadata":{"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# dtreal = np.array(L1_SFTs).real * 1e22\n# n = 360\n# dtreal = np.reshape(dtreal[:,:4320], (360,360,12))\n# # dtreal = np.mean(dtreal, axis=2)\n\n\n# plt.figure(figsize=(20, 18))\n\n# for i in range(12):\n#     plt.subplot(4,3,i+1)\n#     plt.imshow(dtreal[:,:,i])\n    \n# plt.tight_layout()\n# plt.show()","metadata":{"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# a = L1_SFTs[:,:4096]*1e22\n# a = a.real**2 + a.imag**2\n\n# a = np.array(a)\n# a = np.mean(a.reshape(360, 256, 16), axis=2)\n# print(a.shape)\n\n# a = np.mean(np.array(L1_SFTs).real*1e22, axis=1)\n\n# plt.figure(figsize=(18,8))\n# plt.plot(a)\n# plt.show()\n\n# timestamps = np.array(L1_timestamps)\n# intervals = timestamps[1:] - timestamps[0:-1]\n\n# plt.figure(figsize=(18,8))\n# plt.plot(intervals)\n# plt.show()","metadata":{"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CGWDataset(Dataset):\n    def __init__(self, filenames, labels=None, mode=\"train\"):\n        \n        self.filenames = filenames\n        self.labels = labels\n        self.mode = mode        \n        self.length = len(self.filenames)\n        \n    def __getitem__(self, i):\n        # print(self.filenames[i])\n        fileName = self.filenames[i]\n        \n        data = np.empty((2, 360, 256), dtype=np.float32)\n        \n        try:\n            with h5py.File(fileName, 'r') as hdf_data:\n\n                stored_data = hdf_data[fileName.split('/')[-1][:-5]]\n\n                L1 = stored_data['L1']\n                L1_SFTs = L1['SFTs']\n                L1_timestamps = L1['timestamps_GPS']\n                H1 = stored_data['H1']\n                H1_SFTs = H1['SFTs']\n                H1_timestamps = H1['timestamps_GPS']\n                frequenzy_Hz = stored_data['frequency_Hz']\n\n                l1 = L1_SFTs[:,:4096]*1e22\n                l1 = l1.real**2 + l1.imag**2\n                l1 /= np.mean(l1)\n                l1 = np.mean(l1.reshape(360, 256, 16), axis=2)\n\n                h1 = H1_SFTs[:,:4096]*1e22\n                h1 = h1.real**2 + h1.imag**2\n                h1 /= np.mean(h1)\n                h1 = np.mean(h1.reshape(360, 256, 16), axis=2)\n\n                data[0] = l1\n                data[1] = h1  \n        \n        except:\n            print(fileName)\n            \n#             print(i)\n#             L1_mag, L1_phase = librosa.magphase(np.array(L1_STFs)[:,:4096]*1e22)\n#             L1_mel = librosa.feature.melspectrogram(S=L1_mag,sr=frequenzy_Hz[idx])\n#             H1_mag, H1_phase = librosa.magphase(np.array(H1_STFs)[:,:4096]*1e22)\n#             H1_mel = librosa.feature.melspectrogram(S=H1_mag,sr=frequenzy_Hz[idx])\n#             data = np.empty((2, L1_mel.shape[0], L1_mel.shape[1]))\n#             data[0] = L1_mel\n#             data[1] = H1_mel\n#             data = np.einsum('ijk->jki', data)\n\n        if self.mode == \"train\":\n            data = torch.from_numpy(data).float() \n            label = np.array(self.labels[i], dtype=np.float32)\n            return data, label\n        else:\n            data = torch.from_numpy(data).float() \n            return data\n        \n    \n    def __len__(self):\n        return self.length","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path = \"../input/g2net-detecting-continuous-gravitational-waves/\"\n\ndt = pd.read_csv(path + 'train_labels.csv')\n\nbrokenID = ['50f09e37e', '62b0dd011', 'b7666b451']\n\ndt = dt[dt.id.isin(brokenID) == False]\n\nfileNames = [path + \"train/\" + data + \".hdf5\" for data in dt.id]\n\nfileTargets = [data for data in dt.target]\n\ntrain_x, valid_x, train_y, valid_y = train_test_split(fileNames, fileTargets, test_size=0.3, \n                                                      random_state=42)\n\n\ntrainDataset = CGWDataset(train_x, train_y)\nvalidDataset = CGWDataset(valid_x, valid_y)\n\nbatch_size = 8\nnum_workers = 2\n\ntrainLoader = DataLoader(trainDataset,  \n                         batch_size=batch_size,\n                         num_workers=num_workers,\n                         shuffle=True, drop_last=True)\n\nvalidLoader = DataLoader(validDataset,  \n                         batch_size=batch_size,\n                         num_workers=num_workers,\n                         shuffle=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class SimpleConvNet(nn.Module):\n    \n    def __init__(self):\n        super(SimpleConvNet, self).__init__()\n        # Build Convolution Layer Section for our ConvNet\n        #1st Block\n        self.conv2D_1 = nn.Conv2d(2, 64, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_1 = nn.BatchNorm2d(64)\n        self.conv2D_2 = nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_2 = nn.BatchNorm2d(64)\n        self.conv2D_3 = nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_3 = nn.BatchNorm2d(64)\n        #2nd Block\n        self.conv2D_4 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_4 = nn.BatchNorm2d(128)\n        self.conv2D_5 = nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_5 = nn.BatchNorm2d(128)\n        self.conv2D_6 = nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_6 = nn.BatchNorm2d(128)\n        #3rd Block\n        self.conv2D_7 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_7 = nn.BatchNorm2d(256)\n        self.conv2D_8 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)\n        self.batchNorm_8 = nn.BatchNorm2d(256)\n        \n        # next we are going to build the Fully Connected Layer or Dense Layer\n        self.FC_1  = nn.Linear(in_features=256*1440, out_features=512)\n        self.FC_BN_1 = nn.BatchNorm1d(num_features=512)\n        self.FC_2 = nn.Linear(in_features=512, out_features=1)\n        \n        #define dropout rate\n        self.dropout_rate = 0.25\n    \n    def forward(self, x):\n        # apply all the conv layers we have just created before\n        # 1st Block\n        x = self.batchNorm_1(self.conv2D_1(x))\n        x = F.leaky_relu(x)\n        x = self.batchNorm_2(self.conv2D_2(x))\n        x = F.leaky_relu(x)\n        x = self.batchNorm_3(self.conv2D_3(x))\n        x = F.leaky_relu(x)\n        x = F.max_pool2d(x, kernel_size=2)     \n        x = F.dropout(x, self.dropout_rate)\n        # 2nd Block\n        x = self.batchNorm_4(self.conv2D_4(x))\n        x = F.leaky_relu(x)\n        x = self.batchNorm_5(self.conv2D_5(x))\n        x = F.leaky_relu(x)\n        x = self.batchNorm_6(self.conv2D_6(x))\n        x = F.leaky_relu(x)\n        x = F.max_pool2d(x, kernel_size=2)     \n        x = F.dropout(x, self.dropout_rate)\n        # 3rd Block\n        x = self.batchNorm_7(self.conv2D_7(x))\n        x = F.leaky_relu(x)\n        x = self.batchNorm_8(self.conv2D_8(x))\n        x = F.leaky_relu(x)\n        x = F.max_pool2d(x, kernel_size=2)     \n        x = F.dropout(x, self.dropout_rate)\n        #print(x.size())\n        x = x.view(-1, 256*1440)\n        #Fully Connected Block\n        x = F.leaky_relu(self.FC_BN_1(self.FC_1(x)))\n        x = F.dropout(x, self.dropout_rate)\n        x = self.FC_2(x)\n        return x","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if torch.cuda.is_available:\n    device = torch.device(\"cuda\")\nelse:\n    device = \"cpu\"\n    \nmodel = SimpleConvNet()\nmodel.to(device)\nprint(\"model created\")\n# print(model)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = optim.Adam(model.parameters(), lr=0.01)\n\nscheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.1)\n\nloss_func = nn.BCEWithLogitsLoss()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 3 238 328\n# idx = 238\n# images, targets = next(iter(trainLoader))\n# images, targets = trainDataset[idx]\n# images, targets = images.to(device), targets.to(device)\n# targets = targets.unsqueeze(1)\n# outputs = model(images)\n\n# loss = loss_func(outputs, targets)\n# print(loss)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# training \nepochs = 500\nbest_loss = 1\nbest_model = []\n\nfor epoch in range(epochs):\n        \n    print(\"Epoch {} :\".format(epoch))\n\n    training_loss = 0.0\n    validation_loss = 0.0\n    model.train(True)\n    for i, (inputs, targets) in enumerate(notebook.tqdm(trainLoader)):\n        inputs, targets = inputs.to(device), targets.to(device).unsqueeze(1)\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        outputs = outputs.sigmoid()\n        loss = loss_func(outputs, targets)\n        loss.backward()\n        optimizer.step() \n        training_loss += loss.data.item() * inputs.size(0)    \n    training_loss /= len(trainLoader.dataset)\n    scheduler.step()  \n    \n    n_correct = 0\n    n_examples = 0\n    \n    model.train(False)\n    with torch.no_grad():\n        for i, (inputs, targets) in enumerate(notebook.tqdm(validLoader)):\n            inputs, targets = inputs.to(device), targets.to(device).unsqueeze(1)\n            outputs = model(inputs)\n            outputs = outputs.sigmoid()\n            loss = loss_func(outputs, targets)\n            validation_loss += loss.data.item() * inputs.size(0)\n    \n    validation_loss /= len(validLoader.dataset)\n    \n    if validation_loss < best_loss:\n        best_model = model\n        best_loss = validation_loss\n\n    print(\"Avg Train Loss : {:.3f}, \".format(training_loss), end='')\n    print(\"Avg Val Loss : {:.3f}, \".format(validation_loss), end='')\n    print(\"=================================================\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Testing The Model\n====================================================================================","metadata":{}},{"cell_type":"code","source":"dt_test = pd.read_csv(\"../input/g2net-detecting-continuous-gravitational-waves/sample_submission.csv\")\n\ntestFilenames = [path+ \"test/\" + data + \".hdf5\" for data in dt_test.id]\n\ntestDataset = CGWDataset(testFilenames, mode='TEST')\n\n\ntestLoader = DataLoader(testDataset, \n                        batch_size=8, \n                        num_workers=2, \n                        shuffle=False)\n\n# model = best_model\nmodel.eval()\npreds = []\nprint(\"Model Testing : \")\nwith torch.no_grad():\n    for inputs in notebook.tqdm(testLoader):\n        inputs = inputs.to(device)\n        outputs = model(inputs)\n        preds += outputs.sigmoid().cpu().squeeze(1).numpy().tolist()\nprint(\"> DONE\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# out = best_model(inputs)\n\n# out.sigmoid()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"outfile = 'submission.csv'\ndt_test['target'] = preds\n\ndt_test.to_csv(outfile, index=False)\n\nprint('Finished creating subsmission file')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Work in Progress","metadata":{}},{"cell_type":"code","source":"# from random import random\n# df_submission = pd.read_csv(\"../input/g2net-detecting-continuous-gravitational-waves/sample_submission.csv\")\n# res = [random() for _ in range(0, df_submission.shape[0])]\n# df_submission.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# fname = \"../input/g2net-detecting-continuous-gravitational-waves/train/50f09e37e.hdf5\"\n# ../input/g2net-detecting-continuous-gravitational-waves/train/62b0dd011.hdf5\n# ../input/g2net-detecting-continuous-gravitational-waves/train/b7666b451.hdf5\n# data = h5py.File(fname, 'r')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}