{"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":"## Soft label setup\n* (0.8822) sci_ensemble_0.88067.csv","metadata":{"id":"1470882a"}},{"cell_type":"code","source":"!ls ../input/","metadata":{"execution":{"iopub.status.busy":"2021-09-23T23:38:01.793490Z","iopub.execute_input":"2021-09-23T23:38:01.794335Z","iopub.status.idle":"2021-09-23T23:38:02.572608Z","shell.execute_reply.started":"2021-09-23T23:38:01.794221Z","shell.execute_reply":"2021-09-23T23:38:02.571663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\n\n# CQT params\n\nFMIN=22 # 20\nFMAX=None\nWINDOW_TYPE='nuttall'\nBINS=64\nHOP_LENGTH = 32\nSCALE=1\nNORM=1\nOCTAVE=12\n\nSMOOTHING=0.00\nST=int(4096 / 16 * 7)\nEN=int(4096 / 16 * 15)\n\nNUM_FOLDS = 5\nFOLDS= [2] #[0, 1, 2, 3, 4] \n\nLR=1e-4 # 1e-4\nIMAGE_SIZE = 512 #\nBATCH_SIZE = 32 # 32\nEFFICIENTNET_SIZE = 5\nWEIGHTS =  \"imagenet\" #\"noisy-student\"#\"imagenet\"\n\nWHITE=True\n#NORMALIZE=True\n\nMIXED=True # mixed precision does not work with tf models\nTFHUB_MODEL=None\n\nHARDEN_THRESHOLD=1\n\nMIXUP_PROB = 0.0\nEPOCHS = 20 # 20\nR_ANGLE = 0 / 180 * np.pi\nS_SHIFT = 0.0\nT_SHIFT = 0.0\nLABEL_POSITIVE_SHIFT = 1.0\n\nSEED = 2021\n\nFILES =[\n    'gs://kds-ab0905d7893b405f7c360f097ff6f3d96eae710fe3b15f7f5d8107d2'\n]\n\n\nPDATASET= ['g2net-sp-av']\n\nDATA_DIR = '../input/g2net-w-prof/'\n\nmeans =[\n      6.4668378434061e-28,\n      -5.409471890079214e-29,\n      6.317817158006005e-29\n]\n\nstds =[\n       2.872638439834922e-22,\n       2.8741879077673996e-22,\n       2.277171546425006e-22\n]","metadata":{"id":"I6hHnIrtyj-2","executionInfo":{"status":"ok","timestamp":1632186585472,"user_tz":-540,"elapsed":354,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:02.575223Z","iopub.execute_input":"2021-09-23T23:38:02.575505Z","iopub.status.idle":"2021-09-23T23:38:02.586987Z","shell.execute_reply.started":"2021-09-23T23:38:02.575474Z","shell.execute_reply":"2021-09-23T23:38:02.586078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install efficientnet tensorflow_addons > /dev/null","metadata":{"id":"47614e53","executionInfo":{"status":"ok","timestamp":1632186592411,"user_tz":-540,"elapsed":3776,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:02.588255Z","iopub.execute_input":"2021-09-23T23:38:02.588668Z","iopub.status.idle":"2021-09-23T23:38:12.999351Z","shell.execute_reply.started":"2021-09-23T23:38:02.588638Z","shell.execute_reply":"2021-09-23T23:38:12.998569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport math\nimport random\nimport re\nimport warnings\nfrom pathlib import Path\nfrom typing import Optional, Tuple\n\nimport efficientnet.tfkeras as efn\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport tensorflow as tf\nimport tensorflow_addons as tfa\nfrom kaggle_datasets import KaggleDatasets\nfrom scipy.signal import get_window\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import roc_auc_score\n\nfrom tensorflow.keras import mixed_precision\nimport tensorflow_hub as hub","metadata":{"id":"5930c28a","executionInfo":{"status":"ok","timestamp":1632186602382,"user_tz":-540,"elapsed":2584,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:13.001681Z","iopub.execute_input":"2021-09-23T23:38:13.001957Z","iopub.status.idle":"2021-09-23T23:38:21.686930Z","shell.execute_reply.started":"2021-09-23T23:38:13.001924Z","shell.execute_reply":"2021-09-23T23:38:21.686073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.__version__","metadata":{"id":"e91524c8","executionInfo":{"status":"ok","timestamp":1632186602384,"user_tz":-540,"elapsed":59,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"4fd6114a-f523-4515-a751-b6541f55f469","execution":{"iopub.status.busy":"2021-09-23T23:38:21.688140Z","iopub.execute_input":"2021-09-23T23:38:21.688363Z","iopub.status.idle":"2021-09-23T23:38:21.697573Z","shell.execute_reply.started":"2021-09-23T23:38:21.688337Z","shell.execute_reply":"2021-09-23T23:38:21.696620Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Config","metadata":{"id":"95d578d6"}},{"cell_type":"code","source":"OUTPUT_DIR='.'\nSAVEDIR = Path(OUTPUT_DIR + \"models\")\nSAVEDIR.mkdir(exist_ok=True)\n\nOOFDIR = Path(OUTPUT_DIR + \"oof\")\nOOFDIR.mkdir(exist_ok=True)","metadata":{"id":"02c18519","executionInfo":{"status":"ok","timestamp":1632186602391,"user_tz":-540,"elapsed":40,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:21.698806Z","iopub.execute_input":"2021-09-23T23:38:21.699140Z","iopub.status.idle":"2021-09-23T23:38:21.711643Z","shell.execute_reply.started":"2021-09-23T23:38:21.699009Z","shell.execute_reply":"2021-09-23T23:38:21.710482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Utilities","metadata":{"id":"c70bc2a1"}},{"cell_type":"code","source":"def set_seed(seed=42):\n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    tf.random.set_seed(seed)\n\n\nset_seed(SEED)","metadata":{"id":"53835b0d","executionInfo":{"status":"ok","timestamp":1632186602397,"user_tz":-540,"elapsed":39,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:21.712917Z","iopub.execute_input":"2021-09-23T23:38:21.713146Z","iopub.status.idle":"2021-09-23T23:38:21.726536Z","shell.execute_reply.started":"2021-09-23T23:38:21.713121Z","shell.execute_reply":"2021-09-23T23:38:21.725490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def auto_select_accelerator():\n    TPU_DETECTED = False\n    try:\n        if MIXED and TFHUB_MODEL is None:\n          tpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n          tf.config.experimental_connect_to_cluster(tpu)\n          tf.tpu.experimental.initialize_tpu_system(tpu)\n          strategy = tf.distribute.experimental.TPUStrategy(tpu)\n          policy = mixed_precision.Policy('mixed_bfloat16')\n          mixed_precision.set_global_policy(policy)\n          tf.config.optimizer.set_jit(True)\n        else:\n          tpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n          tf.config.experimental_connect_to_cluster(tpu)\n          tf.tpu.experimental.initialize_tpu_system(tpu)\n          strategy = tf.distribute.experimental.TPUStrategy(tpu)\n        print(\"Running on TPU:\", tpu.master())\n        TPU_DETECTED = True\n    except ValueError:\n        strategy = tf.distribute.get_strategy()\n    print(f\"Running on {strategy.num_replicas_in_sync} replicas\")\n\n    return strategy, TPU_DETECTED","metadata":{"id":"a73e2541","executionInfo":{"status":"ok","timestamp":1632186602698,"user_tz":-540,"elapsed":338,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:21.728014Z","iopub.execute_input":"2021-09-23T23:38:21.728288Z","iopub.status.idle":"2021-09-23T23:38:21.741769Z","shell.execute_reply.started":"2021-09-23T23:38:21.728258Z","shell.execute_reply":"2021-09-23T23:38:21.740938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"strategy, tpu_detected = auto_select_accelerator()\nAUTO = tf.data.experimental.AUTOTUNE\nREPLICAS = strategy.num_replicas_in_sync","metadata":{"id":"1871c557","executionInfo":{"status":"ok","timestamp":1632186619715,"user_tz":-540,"elapsed":17027,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"2e4a8c51-dc36-43fb-a22a-9ae36500f547","execution":{"iopub.status.busy":"2021-09-23T23:38:21.743152Z","iopub.execute_input":"2021-09-23T23:38:21.743468Z","iopub.status.idle":"2021-09-23T23:38:27.285844Z","shell.execute_reply.started":"2021-09-23T23:38:21.743433Z","shell.execute_reply":"2021-09-23T23:38:27.284868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\nuser_secrets = UserSecretsClient()\nuser_credential = user_secrets.get_gcloud_credential()\nuser_secrets.set_tensorflow_credential(user_credential)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T23:38:27.289620Z","iopub.execute_input":"2021-09-23T23:38:27.289901Z","iopub.status.idle":"2021-09-23T23:38:27.501217Z","shell.execute_reply.started":"2021-09-23T23:38:27.289871Z","shell.execute_reply":"2021-09-23T23:38:27.500283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Loading","metadata":{"id":"57dd2278"}},{"cell_type":"code","source":"gcs_paths = []\nfor file in FILES:\n    gcs_paths.append(file)\n    print(file)\n    \nfold_files = []\n\nfor path in gcs_paths:\n    for foldi in range(NUM_FOLDS):\n        folds = []\n        folds.extend(np.sort(np.array(tf.io.gfile.glob(path + f\"/tr{foldi}_*.tfrecords\")))) # !!!\n        fold_files.append(folds)\n\n        print(f\"train_files fold{foldi}: \", len(folds))","metadata":{"id":"99de507f","executionInfo":{"status":"ok","timestamp":1632186619722,"user_tz":-540,"elapsed":70,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"25a386b2-3f78-43c0-f883-542e392d3b3d","execution":{"iopub.status.busy":"2021-09-23T23:38:27.502412Z","iopub.execute_input":"2021-09-23T23:38:27.502635Z","iopub.status.idle":"2021-09-23T23:38:29.013325Z","shell.execute_reply.started":"2021-09-23T23:38:27.502610Z","shell.execute_reply":"2021-09-23T23:38:29.012144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pseudo\np_gcs_paths = []\nfor dataset in PDATASET:\n    file = KaggleDatasets().get_gcs_path(dataset)\n    p_gcs_paths.append(file)\n    print(dataset, file)\n\npseudo_files = []\n\nfor path in p_gcs_paths:\n  pseudo_files.extend(np.sort(np.array(tf.io.gfile.glob(path + f\"/test*.tfrecords\")))) # !!!\n\nprint(f\"pseudo_files: \", len(pseudo_files))","metadata":{"id":"f5da9d2c","executionInfo":{"status":"ok","timestamp":1632186620194,"user_tz":-540,"elapsed":515,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"5b9748da-4abb-4e7d-bd69-b94b8a10eb97","execution":{"iopub.status.busy":"2021-09-23T23:38:29.014797Z","iopub.execute_input":"2021-09-23T23:38:29.015127Z","iopub.status.idle":"2021-09-23T23:38:29.724441Z","shell.execute_reply.started":"2021-09-23T23:38:29.015084Z","shell.execute_reply":"2021-09-23T23:38:29.723530Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dataset Preparation\n\nHere's the main contribution of this notebook - Tensorflow version of on-the-fly CQT computation. Note that some of the operations used in CQT computation are not supported by TPU, therefore the implementation is not a TF layer but a function that runs on CPU.","metadata":{"id":"6b64040d"}},{"cell_type":"code","source":"def create_cqt_kernels(\n    q: float,\n    fs: float,\n    fmin: float,\n    n_bins: int = 84,\n    bins_per_octave: int = 12,\n    norm: float = 1,\n    window: str = \"hann\",\n    fmax: Optional[float] = None,\n    topbin_check: bool = True\n) -> Tuple[np.ndarray, int, np.ndarray, float]:\n    fft_len = 2 ** _nextpow2(np.ceil(q * fs / fmin))\n    \n    if (fmax is not None) and (n_bins is None):\n        n_bins = np.ceil(bins_per_octave * np.log2(fmax / fmin))\n        freqs = fmin * 2.0 ** (np.r_[0:n_bins] / np.float(bins_per_octave))\n    elif (fmax is None) and (n_bins is not None):\n        freqs = fmin * 2.0 ** (np.r_[0:n_bins] / np.float(bins_per_octave))\n    else:\n        warnings.warn(\"If nmax is given, n_bins will be ignored\", SyntaxWarning)\n        n_bins = np.ceil(bins_per_octave * np.log2(fmax / fmin))\n        freqs = fmin * 2.0 ** (np.r_[0:n_bins] / np.float(bins_per_octave))\n        \n    if np.max(freqs) > fs / 2 and topbin_check:\n        raise ValueError(f\"The top bin {np.max(freqs)} Hz has exceeded the Nyquist frequency, \\\n                           please reduce the `n_bins`\")\n    \n    kernel = np.zeros((int(n_bins), int(fft_len)), dtype=np.complex64)\n    \n    length = np.ceil(q * fs / freqs)\n    for k in range(0, int(n_bins)):\n        freq = freqs[k]\n        l = np.ceil(q * fs / freq)\n        \n        if l % 2 == 1:\n            start = int(np.ceil(fft_len / 2.0 - l / 2.0)) - 1\n        else:\n            start = int(np.ceil(fft_len / 2.0 - l / 2.0))\n\n        sig = get_window(window, int(l), fftbins=True) * np.exp(\n            np.r_[-l // 2:l // 2] * 1j * 2 * np.pi * freq / fs) / l\n        \n        if norm:\n            kernel[k, start:start + int(l)] = sig / np.linalg.norm(sig, norm)\n        else:\n            kernel[k, start:start + int(l)] = sig\n    return kernel, fft_len, length, freqs\n\n\ndef _nextpow2(a: float) -> int:\n    return int(np.ceil(np.log2(a)))\n\n\ndef prepare_cqt_kernel(\n    sr=22050,\n    hop_length=512,\n    fmin=32.70,\n    fmax=None,\n    n_bins=84,\n    bins_per_octave=12,\n    norm=1,\n    filter_scale=1,\n    window=\"hann\"\n):\n    q = float(filter_scale) / (2 ** (1 / bins_per_octave) - 1)\n    print(q)\n    return create_cqt_kernels(q, sr, fmin, n_bins, bins_per_octave, norm, window, fmax)","metadata":{"id":"f909e45a","executionInfo":{"status":"ok","timestamp":1632186620200,"user_tz":-540,"elapsed":35,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:29.726112Z","iopub.execute_input":"2021-09-23T23:38:29.726637Z","iopub.status.idle":"2021-09-23T23:38:29.747311Z","shell.execute_reply.started":"2021-09-23T23:38:29.726587Z","shell.execute_reply":"2021-09-23T23:38:29.746254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ncqt_kernels, KERNEL_WIDTH, lengths, _ = prepare_cqt_kernel(\n    sr=2048,\n    hop_length=HOP_LENGTH,\n    fmin=FMIN,\n    fmax=FMAX,\n    n_bins=BINS,\n    norm=NORM,\n    window=WINDOW_TYPE,\n    bins_per_octave=OCTAVE,\n    filter_scale=SCALE)\nLENGTHS = tf.constant(lengths, dtype=tf.float32)\nCQT_KERNELS_REAL = tf.constant(np.swapaxes(cqt_kernels.real[:, np.newaxis, :], 0, 2))\nCQT_KERNELS_IMAG = tf.constant(np.swapaxes(cqt_kernels.imag[:, np.newaxis, :], 0, 2))\nPADDING = tf.constant([[0, 0],\n                        [KERNEL_WIDTH // 2, KERNEL_WIDTH // 2],\n                        [0, 0]])","metadata":{"id":"0ab66746","executionInfo":{"status":"ok","timestamp":1632186620202,"user_tz":-540,"elapsed":32,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"8079b76c-bde5-4eee-fa9e-cf16c3e0b693","execution":{"iopub.status.busy":"2021-09-23T23:38:29.748594Z","iopub.execute_input":"2021-09-23T23:38:29.749018Z","iopub.status.idle":"2021-09-23T23:38:29.788574Z","shell.execute_reply.started":"2021-09-23T23:38:29.748985Z","shell.execute_reply":"2021-09-23T23:38:29.787900Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_cqt_image(wave, hop_length=16):\n    CQTs = []\n    for i in range(3):\n        x = wave[i][ST:EN]\n        x = tf.expand_dims(tf.expand_dims(x, 0), 2)\n        x = tf.pad(x, PADDING, \"REFLECT\")\n\n        CQT_real = tf.nn.conv1d(x, CQT_KERNELS_REAL, stride=hop_length, padding=\"VALID\")\n        CQT_imag = -tf.nn.conv1d(x, CQT_KERNELS_IMAG, stride=hop_length, padding=\"VALID\")\n        CQT_real *= tf.math.sqrt(LENGTHS)\n        CQT_imag *= tf.math.sqrt(LENGTHS)\n\n        CQT = tf.math.sqrt(tf.pow(CQT_real, 2) + tf.pow(CQT_imag, 2))\n        CQTs.append(CQT[0])\n    return tf.stack(CQTs, axis=2)","metadata":{"id":"da3bc9ed","executionInfo":{"status":"ok","timestamp":1632186620203,"user_tz":-540,"elapsed":21,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:29.789901Z","iopub.execute_input":"2021-09-23T23:38:29.790206Z","iopub.status.idle":"2021-09-23T23:38:29.799833Z","shell.execute_reply.started":"2021-09-23T23:38:29.790175Z","shell.execute_reply":"2021-09-23T23:38:29.798754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_labeled_tfrecord(example):\n    tfrec_format = {\n        \"wave\": tf.io.FixedLenFeature([], tf.string),\n        \"wave_id\": tf.io.FixedLenFeature([], tf.string),\n        \"target\": tf.io.FixedLenFeature([], tf.int64)\n    }\n    example = tf.io.parse_single_example(example, tfrec_format)\n    return prepare_image(example[\"wave\"], IMAGE_SIZE), tf.reshape(tf.cast(example[\"target\"], tf.float32), [1])\n\n\ndef read_unlabeled_tfrecord(example, return_image_id):\n    tfrec_format = {\n        \"wave\": tf.io.FixedLenFeature([], tf.string),\n        \"wave_id\": tf.io.FixedLenFeature([], tf.string)\n    }\n    example = tf.io.parse_single_example(example, tfrec_format)\n    return prepare_image(example[\"wave\"], IMAGE_SIZE), example[\"wave_id\"] if return_image_id else 0\n\n\ndef count_data_items(filenames): \n    # The number of data items is written in the name of the .tfrec files, i.e. flowers00-230.tfrec = 230 data items\n    try:\n        n = [int(re.compile(r\"-([0-9]*)\\.\").search(filename).group(1)) for filename in filenames]\n    except:\n        n = [22600] * len(filenames)\n    #n = [int(re.compile(r\"-([0-9]*).rfrecords\").search(filename).group(1)) for filename in filenames]\n    return np.sum(n)\n\ndef mixup(image, label, probability=0.5, aug_batch=64 * 8):\n    imgs = []\n    labs = []\n    for j in range(aug_batch):\n        p = tf.cast(tf.random.uniform([], 0, 1) <= probability, tf.float32)\n        k = tf.cast(tf.random.uniform([], 0, aug_batch), tf.int32)\n        a = tf.random.uniform([], 0, 1) * p\n\n        img1 = image[j]\n        img2 = image[k]\n        imgs.append((1 - a) * img1 + a * img2)\n        lab1 = label[j]\n        lab2 = label[k]\n        labs.append((1 - a) * lab1 + a * lab2)\n    image2 = tf.reshape(tf.stack(imgs), (aug_batch, IMAGE_SIZE, IMAGE_SIZE, 3))\n    label2 = tf.reshape(tf.stack(labs), (aug_batch,))\n    return image2, label2\n\n\ndef time_shift(img, shift=T_SHIFT):\n    if shift > 0:\n        T = IMAGE_SIZE\n        P = tf.random.uniform([],0,1)\n        SHIFT = tf.cast(T * P, tf.int32)\n        return tf.concat([img[-SHIFT:], img[:-SHIFT]], axis=0)\n    return img\n\n\ndef rotate(img, angle=R_ANGLE):\n    if angle > 0:\n        P = tf.random.uniform([],0,1)\n        A = tf.cast(angle * P, tf.float32)\n        return tfa.image.rotate(img, A)\n    return img\n\n\ndef spector_shift(img, shift=S_SHIFT):\n    if shift > 0:\n        T = IMAGE_SIZE\n        P = tf.random.uniform([],0,1)\n        SHIFT = tf.cast(T * P, tf.int32)\n        return tf.concat([img[:, -SHIFT:], img[:, :-SHIFT]], axis=1)\n    return img\n\ndef img_aug_f(img):\n#    img = time_shift(img)\n#    img = spector_shift(img)\n    #img = tf.image.random_flip_left_right(img) \n#    img = tf.image.random_brightness(img, 0.2)\n#    img = AUGMENTATIONS_TRAIN(image=img)['image']\n    # img = rotate(img)\n    #print(img.shape)\n    img = swap_img(img)\n    return img\n\n\ndef swap_img(img):\n   p = tf.random.uniform([],0,1)\n   if p < 0.2:\n     img = tf.stack([img[:,:,1], img[:,:,0], img[:,:,2]],axis=2)\n     return  img\n   else:\n     return img\n\n\ndef imgs_aug_f(imgs, batch_size):\n    _imgs = []\n    DIM = IMAGE_SIZE\n    for j in range(batch_size):\n        _imgs.append(img_aug_f(imgs[j]))\n\n    return tf.reshape(tf.stack(_imgs),(batch_size,DIM,DIM,3))\n\n\ndef label_positive_shift(labels):\n    return labels * LABEL_POSITIVE_SHIFT\n\n\ndef aug_f(imgs, labels, batch_size):\n    #imgs, label = mixup(imgs, labels, MIXUP_PROB, batch_size)\n    imgs = imgs_aug_f(imgs, batch_size) \n    return imgs, labels\n\n# used for whitening\nwindow = tf.cast(np.load(DATA_DIR+'window.npy'), tf.float64)\narv_w = tf.cast(np.load(DATA_DIR+'avr_w.npy'), tf.complex64)\n\ndef whiten(c):\n  #print (c.shape)\n  c2 = tf.concat([tf.reverse(-c, axis=[1])[:,4096-2049:-1] + 2 *c[:,:1], c, tf.reverse(-c, axis=[1])[:,1:2049] + 2*c[:,-2:-1]],axis=1)\n  #print (c2.shape)\n  c3 = tf.math.real(tf.signal.ifft(tf.signal.fft(tf.cast(1e20*c2*window, tf.complex64))/arv_w))[:,2048:-2048]\n  #print (c3.shape)\n  return c3\n\n\ndef prepare_image(wave, dim=256):\n    wave = tf.reshape(tf.io.decode_raw(wave, tf.float64), (3, 4096))\n    #wave = tf.cast(wave, tf.float32)\n    if WHITE:\n      wave = whiten(wave)\n    # normalized_waves = []\n    # for i in range(3):\n    #     normalized_wave = wave[i] - means[i]\n    #     normalized_wave = normalized_wave / stds[i]\n\n    #     normalized_waves.append(normalized_wave)\n    # wave = tf.stack(normalized_waves)\n    wave = tf.cast(wave, tf.float32)\n    image = create_cqt_image(wave, HOP_LENGTH)\n    #image = tf.keras.layers.Normalization()(image)\n    image = tf.image.resize(image, size=(dim, dim))\n    return tf.reshape(image, (dim, dim, 3))\n\n\ndef get_dataset(files, batch_size=16, repeat=False, shuffle=False, aug=True, labeled=True, return_image_ids=True):\n    ds = tf.data.TFRecordDataset(files, num_parallel_reads=AUTO, compression_type=\"GZIP\")\n    ds = ds.cache()\n\n    if repeat:\n        ds = ds.repeat()\n\n    if shuffle:\n        ds = ds.shuffle(1024 * 2)\n        opt = tf.data.Options()\n        opt.experimental_deterministic = False\n        ds = ds.with_options(opt)\n\n    if labeled:\n        ds = ds.map(read_labeled_tfrecord, num_parallel_calls=AUTO)\n    else:\n        ds = ds.map(lambda example: read_unlabeled_tfrecord(example, return_image_ids), num_parallel_calls=AUTO)\n\n    ds = ds.batch(batch_size * REPLICAS)\n    if aug:\n        ds = ds.map(lambda x, y: aug_f(x, y, batch_size * REPLICAS), num_parallel_calls=AUTO)\n    ds = ds.prefetch(AUTO)\n    return ds","metadata":{"id":"2a575fd0","executionInfo":{"status":"ok","timestamp":1632186620492,"user_tz":-540,"elapsed":308,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:29.801097Z","iopub.execute_input":"2021-09-23T23:38:29.801581Z","iopub.status.idle":"2021-09-23T23:38:29.885935Z","shell.execute_reply.started":"2021-09-23T23:38:29.801539Z","shell.execute_reply":"2021-09-23T23:38:29.884906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Pseudo DataSet","metadata":{}},{"cell_type":"code","source":"def logit(x):\n  return -tf.math.log(1./x - 1.)\n\ndef read_softlabeled_tfrecord(example):\n    tfrec_format = {\n        \"wave\": tf.io.FixedLenFeature([], tf.string),\n        \"wave_id\": tf.io.FixedLenFeature([], tf.string),\n        \"target\": tf.io.FixedLenFeature([], tf.float32)\n    }\n    example = tf.io.parse_single_example(example, tfrec_format)\n\n    label = tf.cast(example[\"target\"], tf.float32)\n    temperature = 2\n\n    if label > HARDEN_THRESHOLD: # Only harden confident positives\n        label = tf.math.sigmoid(logit(label) * temperature)\n\n    return prepare_image(example[\"wave\"], IMAGE_SIZE), tf.reshape(label, [1])\n\n\ndef get_soft_dataset(files, batch_size=16, repeat=False, shuffle=False, aug=True, labeled=True, return_image_ids=True):\n    ds = tf.data.TFRecordDataset(files, num_parallel_reads=AUTO, compression_type=\"GZIP\")\n    ds = ds.cache()\n\n    if repeat:\n        ds = ds.repeat()\n\n    if shuffle:\n        ds = ds.shuffle(1024 * 10, reshuffle_each_iteration=True)\n        opt = tf.data.Options()\n        opt.experimental_deterministic = False\n        ds = ds.with_options(opt)\n\n    ds = ds.map(read_softlabeled_tfrecord, num_parallel_calls=AUTO)\n    ds = ds.batch(batch_size * REPLICAS)\n    if aug:\n        ds = ds.map(lambda x, y: aug_f(x, y, batch_size * REPLICAS), num_parallel_calls=AUTO)\n    ds = ds.prefetch(AUTO)\n    return ds","metadata":{"execution":{"iopub.status.busy":"2021-09-23T23:38:29.887266Z","iopub.execute_input":"2021-09-23T23:38:29.887620Z","iopub.status.idle":"2021-09-23T23:38:29.900760Z","shell.execute_reply.started":"2021-09-23T23:38:29.887570Z","shell.execute_reply":"2021-09-23T23:38:29.899743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model","metadata":{"id":"a835683f"}},{"cell_type":"code","source":"def build_model(size=256, efficientnet_size=0, weights=\"imagenet\", count=0):\n    inputs = tf.keras.layers.Input(shape=(size, size, 3))\n    \n    if TFHUB_MODEL:\n      load_options = tf.saved_model.LoadOptions(experimental_io_device='/job:localhost')\n      loaded_model = hub.load(TFHUB_MODEL, options=load_options)\n      efn_layer = hub.KerasLayer(loaded_model, trainable=True) \n      x = efn_layer(inputs)\n    else:\n      efn_string= f\"EfficientNetB{efficientnet_size}\"\n      efn_layer = getattr(efn, efn_string)(input_shape=(size, size, 3), weights=weights, include_top=False)\n      x = efn_layer(inputs)\n      x = tf.keras.layers.GlobalAveragePooling2D()(x)\n    x = tf.keras.layers.Dropout(0.1)(x)\n    x = tf.keras.layers.Dense(1, activation=\"sigmoid\")(x)\n    model = tf.keras.Model(inputs=inputs, outputs=x)\n\n    lr_decayed_fn = tf.keras.experimental.CosineDecay(1e-3, count)\n    opt = tfa.optimizers.AdamW(lr_decayed_fn, learning_rate=LR)\n    loss = tf.keras.losses.BinaryCrossentropy(label_smoothing=SMOOTHING)\n    #loss = tfa.losses.SigmoidFocalCrossEntropy()\n\n    model.compile(optimizer=opt, loss=loss, metrics=[\"AUC\"])\n    return model","metadata":{"id":"4a384d21","executionInfo":{"status":"ok","timestamp":1632186620494,"user_tz":-540,"elapsed":19,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:29.902097Z","iopub.execute_input":"2021-09-23T23:38:29.902582Z","iopub.status.idle":"2021-09-23T23:38:29.918796Z","shell.execute_reply.started":"2021-09-23T23:38:29.902551Z","shell.execute_reply":"2021-09-23T23:38:29.918146Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_lr_callback(batch_size=8, replicas=8):\n    lr_start   = 1e-4\n    lr_max     = 0.000015 * replicas * batch_size\n    lr_min     = 1e-7\n    lr_ramp_ep = 3\n    lr_sus_ep  = 0\n    lr_decay   = 0.7\n   \n    def lrfn(epoch):\n        if epoch < lr_ramp_ep:\n            lr = (lr_max - lr_start) / lr_ramp_ep * epoch + lr_start\n            \n        elif epoch < lr_ramp_ep + lr_sus_ep:\n            lr = lr_max\n            \n        else:\n            lr = (lr_max - lr_min) * lr_decay**(epoch - lr_ramp_ep - lr_sus_ep) + lr_min\n            \n        return lr\n\n    lr_callback = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=True)\n    return lr_callback","metadata":{"id":"ec45dfe6","executionInfo":{"status":"ok","timestamp":1632186620496,"user_tz":-540,"elapsed":17,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:29.919834Z","iopub.execute_input":"2021-09-23T23:38:29.920563Z","iopub.status.idle":"2021-09-23T23:38:29.936854Z","shell.execute_reply.started":"2021-09-23T23:38:29.920513Z","shell.execute_reply":"2021-09-23T23:38:29.935687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plot\ndef display_one_flower(image, title, subplot, red=False):\n    plt.subplot(subplot)\n    plt.axis('off')\n    # for i in range(3):\n    #   image[i,:] -= image[i,:].min()\n    #   image[i,:] /= image[i,:].max()\n#    print (image.shape)\n    plt.imshow(image[:,:,0].transpose())\n    plt.title(title, fontsize=16, color='red' if red else 'black')\n    return subplot+1\n\ndef dataset_to_numpy_util(dataset, N):\n    dataset = dataset.unbatch().batch(N)\n    for images, labels in dataset:\n        numpy_images = images.numpy()\n        numpy_labels = labels.numpy()\n        break;  \n    return numpy_images, numpy_labels\n\ndef display_9_images_from_dataset(dataset):\n    subplot=331\n    plt.figure(figsize=(13,13))\n    images, labels = dataset_to_numpy_util(dataset, 9)\n    for i, image in enumerate(images):\n        title = labels[i]\n        subplot = display_one_flower(image, f'{title}', subplot)\n        if i >= 8:\n\n            break;\n              \n    plt.tight_layout()\n    plt.subplots_adjust(wspace=0.1, hspace=0.1)\n    plt.show()  ","metadata":{"id":"z44mU7F9647i","executionInfo":{"status":"ok","timestamp":1632186620499,"user_tz":-540,"elapsed":17,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:38:29.938332Z","iopub.execute_input":"2021-09-23T23:38:29.938834Z","iopub.status.idle":"2021-09-23T23:38:29.950879Z","shell.execute_reply.started":"2021-09-23T23:38:29.938792Z","shell.execute_reply":"2021-09-23T23:38:29.949663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds = get_soft_dataset(pseudo_files[0], labeled=True, return_image_ids=False, repeat=False, shuffle=True, batch_size=BATCH_SIZE * 2, aug=True)\ndisplay_9_images_from_dataset(ds)","metadata":{"id":"hF2EMdm27GrY","executionInfo":{"status":"ok","timestamp":1632186649825,"user_tz":-540,"elapsed":29341,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"e5cf0d27-8543-45f5-b963-bf637d6ae208","execution":{"iopub.status.busy":"2021-09-23T23:38:29.952232Z","iopub.execute_input":"2021-09-23T23:38:29.952512Z","iopub.status.idle":"2021-09-23T23:39:03.826163Z","shell.execute_reply.started":"2021-09-23T23:38:29.952481Z","shell.execute_reply":"2021-09-23T23:39:03.825424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#display_9_images_from_dataset(ds)","metadata":{"id":"NhTrgoxq9dp0","executionInfo":{"status":"ok","timestamp":1632186664801,"user_tz":-540,"elapsed":14994,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"bec24685-6167-453b-dc42-ea263246e9df","execution":{"iopub.status.busy":"2021-09-23T23:39:03.827322Z","iopub.execute_input":"2021-09-23T23:39:03.828213Z","iopub.status.idle":"2021-09-23T23:39:03.832959Z","shell.execute_reply.started":"2021-09-23T23:39:03.828173Z","shell.execute_reply":"2021-09-23T23:39:03.831826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training","metadata":{"id":"7df4c16c"}},{"cell_type":"code","source":"oof_pred = []\noof_target = []\noof_ids = []\n\nfiles_train_all = np.array(fold_files)","metadata":{"id":"0d3c5afe","executionInfo":{"status":"ok","timestamp":1632186664808,"user_tz":-540,"elapsed":43,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"execution":{"iopub.status.busy":"2021-09-23T23:39:03.834866Z","iopub.execute_input":"2021-09-23T23:39:03.835674Z","iopub.status.idle":"2021-09-23T23:39:03.849698Z","shell.execute_reply.started":"2021-09-23T23:39:03.835634Z","shell.execute_reply":"2021-09-23T23:39:03.848873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count_data_items(pseudo_files), count_data_items(files_train_all[0])","metadata":{"execution":{"iopub.status.busy":"2021-09-23T23:39:03.850923Z","iopub.execute_input":"2021-09-23T23:39:03.851817Z","iopub.status.idle":"2021-09-23T23:39:03.868198Z","shell.execute_reply.started":"2021-09-23T23:39:03.851763Z","shell.execute_reply":"2021-09-23T23:39:03.867356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(files_train_all[0]) * 5600","metadata":{"execution":{"iopub.status.busy":"2021-09-23T23:39:03.869797Z","iopub.execute_input":"2021-09-23T23:39:03.870079Z","iopub.status.idle":"2021-09-23T23:39:03.884390Z","shell.execute_reply.started":"2021-09-23T23:39:03.870048Z","shell.execute_reply":"2021-09-23T23:39:03.883500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for fold in FOLDS:\n    all_fold = range(NUM_FOLDS)\n    \n    files_train = list(files_train_all[(np.delete(all_fold, fold))].reshape(-1)) \n    files_valid = files_train_all[fold]\n\n    print(\"=\" * 120)\n    print(f\"Fold {fold}\")\n    print(\"=\" * 120)\n\n    train_image_count = count_data_items(files_train + pseudo_files) # check\n    valid_image_count = count_data_items(files_valid)\n    \n    all_fold = range(NUM_FOLDS)\n    \n    print ('train files:', train_image_count, 'valid files:', valid_image_count)\n\n    tf.keras.backend.clear_session()\n    strategy, tpu_detected = auto_select_accelerator()\n    with strategy.scope():\n        model = build_model(\n            size=IMAGE_SIZE, \n            efficientnet_size=EFFICIENTNET_SIZE,\n            weights=WEIGHTS, \n            count=train_image_count // BATCH_SIZE // REPLICAS // 4)\n    \n    model_ckpt = tf.keras.callbacks.ModelCheckpoint(\n        str(SAVEDIR / f\"fold{fold}.h5\"), monitor=\"val_auc\", verbose=1, save_best_only=True,\n        save_weights_only=True, mode=\"max\", save_freq=\"epoch\"\n    )\n    \n    callbacks = [model_ckpt, get_lr_callback(BATCH_SIZE, REPLICAS)],\n\n    ds_train = get_dataset(files_train, batch_size=BATCH_SIZE, shuffle=True, repeat=True, aug=True)\n    ds_pseudo = get_soft_dataset(pseudo_files, batch_size=BATCH_SIZE, shuffle=True, repeat=True, aug=True)\n\n    w = [(train_image_count - valid_image_count) / train_image_count, valid_image_count / train_image_count ]\n\n    print ('weights=', w)\n    ds_train = tf.data.experimental.sample_from_datasets([ds_train, ds_pseudo], w)\n    \n    history = model.fit(\n        ds_train,\n        epochs=EPOCHS,\n        callbacks=[model_ckpt, get_lr_callback(BATCH_SIZE, REPLICAS)],\n        steps_per_epoch=train_image_count // BATCH_SIZE // REPLICAS // 4,\n        validation_data=get_dataset(files_valid, batch_size=BATCH_SIZE * 4, repeat=False, shuffle=False, aug=False),\n        verbose=1\n    )\n\n    print(\"Loading best model...\")\n    model.load_weights(str(SAVEDIR / f\"fold{fold}.h5\"))\n\n    ds_valid = get_dataset(files_valid, labeled=False, return_image_ids=False, repeat=True, shuffle=False, batch_size=BATCH_SIZE * 2, aug=False)\n    STEPS = valid_image_count / BATCH_SIZE / 2 / REPLICAS\n    \n    pred = model.predict(ds_valid, steps=STEPS, verbose=0)[:valid_image_count].astype(float)\n    print (pred.shape)\n    oof_pred.append(np.mean(pred.reshape((valid_image_count, 1), order=\"F\"), axis=1))\n         \n    ds_valid = get_dataset(files_valid, batch_size=BATCH_SIZE * 2, repeat=False, labeled=True, return_image_ids=True, aug=False, shuffle=False)\n    oof_t = np.array([target.numpy() for _, target in iter(ds_valid.unbatch())])\n    oof_target.append(oof_t)\n\n    ds_valid = get_dataset(files_valid, batch_size=BATCH_SIZE * 2, repeat=False, shuffle=False, aug=False, labeled=False, return_image_ids=True)\n    file_ids = np.array([target.numpy() for _, target in iter(ds_valid.unbatch())])\n    oof_ids.append(file_ids)\n\n    print (pred.shape, oof_t.shape, file_ids.shape)\n\n    plt.figure(figsize=(8, 6))\n    sns.distplot(oof_pred[-1])\n    plt.show()\n\n    plt.figure(figsize=(15, 5))\n    plt.plot(\n        np.arange(len(history.history[\"auc\"])),\n        history.history[\"auc\"],\n        \"-o\",\n        label=\"Train auc\",\n        color=\"#ff7f0e\")\n    plt.plot(\n        np.arange(len(history.history[\"auc\"])),\n        history.history[\"val_auc\"],\n        \"-o\",\n        label=\"Val auc\",\n        color=\"#1f77b4\")\n    \n    x = np.argmax(history.history[\"val_auc\"])\n    y = np.max(history.history[\"val_auc\"])\n\n    xdist = plt.xlim()[1] - plt.xlim()[0]\n    ydist = plt.ylim()[1] - plt.ylim()[0]\n\n    plt.scatter(x, y, s=200, color=\"#1f77b4\")\n    plt.text(x - 0.03 * xdist, y - 0.13 * ydist, f\"max auc\\n{y}\", size=14)\n\n    plt.ylabel(\"auc\", size=14)\n    plt.xlabel(\"Epoch\", size=14)\n    plt.legend(loc=2)\n\n    plt2 = plt.gca().twinx()\n    plt2.plot(\n        np.arange(len(history.history[\"auc\"])),\n        history.history[\"loss\"],\n        \"-o\",\n        label=\"Train Loss\",\n        color=\"#2ca02c\")\n    plt2.plot(\n        np.arange(len(history.history[\"auc\"])),\n        history.history[\"val_loss\"],\n        \"-o\",\n        label=\"Val Loss\",\n        color=\"#d62728\")\n    \n    x = np.argmin(history.history[\"val_loss\"])\n    y = np.min(history.history[\"val_loss\"])\n    \n    ydist = plt.ylim()[1] - plt.ylim()[0]\n\n    plt.scatter(x, y, s=200, color=\"#d62728\")\n    plt.text(x - 0.03 * xdist, y + 0.05 * ydist, \"min loss\", size=14)\n\n    plt.ylabel(\"Loss\", size=14)\n    plt.title(f\"Fold {fold + 1} - Image Size {IMAGE_SIZE}, EfficientNetB{EFFICIENTNET_SIZE}\", size=18)\n\n    plt.legend(loc=3)\n    plt.savefig(OOFDIR / f\"fig{fold}.png\")\n    plt.show()","metadata":{"id":"dae2e038","executionInfo":{"status":"error","timestamp":1632197097109,"user_tz":-540,"elapsed":6616476,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"outputId":"1f470300-fec4-47de-a9e8-3fc0fe543873","execution":{"iopub.status.busy":"2021-09-23T23:39:03.886084Z","iopub.execute_input":"2021-09-23T23:39:03.886435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## OOF","metadata":{"id":"a596d112"}},{"cell_type":"code","source":"oof = np.concatenate(oof_pred)\noof_ids = np.concatenate(oof_ids)\ntrue = np.concatenate(oof_target)\n\nauc = roc_auc_score(y_true=true, y_score=oof)\nprint(f\"AUC: {auc:.5f}\")","metadata":{"id":"c14a8b61","executionInfo":{"status":"aborted","timestamp":1632197097114,"user_tz":-540,"elapsed":6,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame({\n    \"id\": [i.decode(\"UTF-8\") for i in oof_ids],\n    \"y_true\": true.reshape(-1),\n    \"y_pred\": oof.astype(float)\n})\ndf.head()","metadata":{"id":"d9c63a02","executionInfo":{"status":"aborted","timestamp":1632197097115,"user_tz":-540,"elapsed":7,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.to_csv(OOFDIR / f\"oof.csv\", index=False)","metadata":{"id":"382aa5b8","executionInfo":{"status":"aborted","timestamp":1632197097116,"user_tz":-540,"elapsed":8,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(OOFDIR / f\"oof.csv\")\n\nauc = roc_auc_score(y_true=true, y_score=oof)","metadata":{"id":"4695252b","executionInfo":{"status":"aborted","timestamp":1632197097117,"user_tz":-540,"elapsed":9,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"auc","metadata":{"id":"_hPaQKu8usyc","executionInfo":{"status":"aborted","timestamp":1632197097117,"user_tz":-540,"elapsed":8,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"Eg4zwG2N3IsG","executionInfo":{"status":"aborted","timestamp":1632197097118,"user_tz":-540,"elapsed":9,"user":{"displayName":"136 yamashitan","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"17856296841449186565"}}},"execution_count":null,"outputs":[]}]}