{"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":"g2net wave binary classification  \n- g2net wave\n- bandpass filter\n- rescale ([-1,1]) \n- CWT scalogram \n- EfficientNet (CNN-based) image recognizer\n\nreference\nhttps://www.kaggle.com/c/g2net-gravitational-wave-detection/discussion/261721","metadata":{}},{"cell_type":"code","source":"# cwt\n!pip install git+https://github.com//Kevin-McIsaac/cmorlet-tensorflow@Performance --no-deps > /dev/null","metadata":{"execution":{"iopub.status.busy":"2021-08-12T04:11:53.918505Z","iopub.execute_input":"2021-08-12T04:11:53.918942Z","iopub.status.idle":"2021-08-12T04:12:00.834454Z","shell.execute_reply.started":"2021-08-12T04:11:53.918861Z","shell.execute_reply":"2021-08-12T04:12:00.833044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# data\nfrom tensorflow.keras.utils import Sequence\nfrom random import shuffle\nfrom CWT.cwt import ComplexMorletCWT\nfrom scipy import signal\nimport numpy as np\nimport math\n\n# bandpass filter\nfs = 2048\nlower_freq = 20\nupper_freq = 500\nwavelet_width = 1\nbHP, aHP = signal.butter(8, (lower_freq, upper_freq), btype='bandpass', fs=fs)\ndef bandpass_filter(wav):  # Apply a 20Hz high pass filter to three channels, a larger spike around 20hz\n    return signal.filtfilt(bHP, aHP, wav)\n\nclass Dataset(Sequence):\n    def __init__(self, df, is_train=True):\n        self.id = df[\"id\"].values\n        self.y = df[\"target\"].values\n        self.file = df[\"file\"].values\n        self.batch_size = 32\n        self.is_train = is_train\n        self.shuffle = True\n        \n    def __len__(self):\n        batch_cnt = math.ceil(len(self.id) / self.batch_size) # all batch times\n        return int(batch_cnt*0.4)\n        \n    def __getitem__(self, i):\n        batch_file = self.file[i * self.batch_size:(i + 1) * self.batch_size]\n        if self.y is not None:\n            y = self.y[i * self.batch_size: (i + 1) * self.batch_size]\n\n        x = np.array([self.feature(k) for k in batch_file])\n        x = np.stack(x)\n        if self.is_train:\n            return x, y\n        else:\n            return x\n\n    def feature(self, file):  # for one sample\n        wav = np.load(file)\n        wav = bandpass_filter(wav)\n        wav = np.array([wav[i]/wav[i].max() for i in range(3)]) # rescale by max\n        return wav\n\n    def on_epoch_end(self):\n        if self.shuffle and self.is_train:\n            tmp = list(zip(self.file, self.y))\n            shuffle(tmp)\n            self.file, self.y = list(zip(*tmp))","metadata":{"execution":{"iopub.status.busy":"2021-08-12T04:12:00.837817Z","iopub.execute_input":"2021-08-12T04:12:00.838238Z","iopub.status.idle":"2021-08-12T04:12:07.088580Z","shell.execute_reply.started":"2021-08-12T04:12:00.838191Z","shell.execute_reply":"2021-08-12T04:12:07.087518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model\nfrom tensorflow.keras.layers import InputLayer, GlobalAveragePooling2D, Dense, Permute, Input, Dropout\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.applications import EfficientNetB4\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.metrics import MeanSquaredError, AUC\n\ninput_wav = Input(shape=(3, 4096))\n# cwt\nx = ComplexMorletCWT(n_scales = 64, stride=64, output='magnitude', data_format='channels_first',\n                     fs=fs,lower_freq=lower_freq,upper_freq=upper_freq,wavelet_width=wavelet_width)(input_wav)\nx = Permute(dims=(2,3,1))(x) # -> [:, time, n_scales, channels]\ncnn = EfficientNetB4(include_top=False, weights='imagenet')\nx = cnn(x)\nx = GlobalAveragePooling2D()(x)\nx = Dense(32*2, activation='relu')(x)\nx = Dropout(0.2)(x)\nx = Dense(32, activation='relu')(x)\nx = Dropout(0.2)(x)\nx = Dense(1, activation='sigmoid')(x)\n\nmodel = Model(inputs=[input_wav], outputs=x)\n\nmodel.compile(optimizer=\"sgd\",\n              #optimizer=Adam(learning_rate=1e-4),\n              loss='binary_crossentropy',\n              metrics=[AUC(),\"binary_accuracy\"])\nmodel.summary()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-08-12T04:12:07.090819Z","iopub.execute_input":"2021-08-12T04:12:07.091328Z","iopub.status.idle":"2021-08-12T04:12:20.718056Z","shell.execute_reply.started":"2021-08-12T04:12:07.091270Z","shell.execute_reply":"2021-08-12T04:12:20.716994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\ndd = \"../input/g2net-gravitational-wave-detection\"\ntrain = pd.read_csv('{}/training_labels.csv'.format(dd))\ndef get_train_file(img_id):\n    return \"{}/train/{}/{}/{}/{}.npy\".format(dd, img_id[0], img_id[1], img_id[2], img_id)\ntrain['file'] = train['id'].apply(get_train_file)\n\ntr_d, val_d = train_test_split(train,test_size=0.1,random_state=32,stratify=train[\"target\"])\ntr_d = Dataset(tr_d)\nval_d = Dataset(val_d)\n\ntrain_h = model.fit(\n    tr_d,\n    epochs = 30,\n    validation_data = val_d\n)","metadata":{"execution":{"iopub.status.busy":"2021-08-12T04:12:20.721537Z","iopub.execute_input":"2021-08-12T04:12:20.721883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}