{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpu1vmV38","dataSources":[{"sourceId":19991,"databundleVersionId":1117522,"sourceType":"competition"}],"dockerImageVersionId":30579,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"\nimport math, re, os\n\n\nimport numpy as np\nimport pandas as pd\nfrom matplotlib import pyplot as plt\nfrom kaggle_datasets import KaggleDatasets\nimport tensorflow as tf\nimport tensorflow.keras.layers as L\nfrom sklearn import metrics\nfrom sklearn.model_selection import train_test_split\nprint(\"done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:46:54.634074Z","iopub.execute_input":"2023-11-22T00:46:54.634287Z","iopub.status.idle":"2023-11-22T00:47:12.315293Z","shell.execute_reply.started":"2023-11-22T00:46:54.634263Z","shell.execute_reply":"2023-11-22T00:47:12.314242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntry:\n    # TPU detection. No parameters necessary if TPU_NAME environment variable is\n    # set: this is always the case on Kaggle.\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n    print('Running on TPU ', tpu.master())\nexcept ValueError:\n    tpu = None\n\nif tpu:\n    tf.config.experimental_connect_to_cluster(tpu)\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    strategy = tf.distribute.experimental.TPUStrategy(tpu)\nelse:\n    # Default distribution strategy in Tensorflow. Works on CPU and single GPU.\n\n    \n    strategy = tf.distribute.get_strategy()\n\nprint(\"REPLICAS: \", strategy.num_replicas_in_sync)\nprint(\"done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:12.316896Z","iopub.execute_input":"2023-11-22T00:47:12.317446Z","iopub.status.idle":"2023-11-22T00:47:21.336167Z","shell.execute_reply.started":"2023-11-22T00:47:12.317412Z","shell.execute_reply":"2023-11-22T00:47:21.335203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# For tf.dataset\nAUTO = tf.data.experimental.AUTOTUNE\n\n# Data access\nGCS_DS_PATH = KaggleDatasets().get_gcs_path()\n\n# Configuration\nBATCH_SIZE = 16 * strategy.num_replicas_in_sync\nprint(BATCH_SIZE)\nEPOCHS = 468\nprint(\"done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:21.337326Z","iopub.execute_input":"2023-11-22T00:47:21.337581Z","iopub.status.idle":"2023-11-22T00:47:21.342822Z","shell.execute_reply.started":"2023-11-22T00:47:21.337553Z","shell.execute_reply":"2023-11-22T00:47:21.342044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def append_path(pre):\n    return np.vectorize(lambda file: os.path.join(GCS_DS_PATH,pre,file))","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:21.344610Z","iopub.execute_input":"2023-11-22T00:47:21.344899Z","iopub.status.idle":"2023-11-22T00:47:21.358093Z","shell.execute_reply.started":"2023-11-22T00:47:21.344871Z","shell.execute_reply":"2023-11-22T00:47:21.357086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('/kaggle/input/alaska2-image-steganalysis/sample_submission.csv')\ntrain_filenames=np.array(os.listdir('/kaggle/input/alaska2-image-steganalysis/Cover/'))","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:21.359124Z","iopub.execute_input":"2023-11-22T00:47:21.359379Z","iopub.status.idle":"2023-11-22T00:47:23.359543Z","shell.execute_reply.started":"2023-11-22T00:47:21.359354Z","shell.execute_reply":"2023-11-22T00:47:23.358356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.random.seed(0)\npositives = train_filenames.copy()\nnegatives = train_filenames.copy()\n\nnp.random.shuffle(positives)\nnp.random.shuffle(negatives)\n\njmipod=append_path('JMiPOD')(positives[:10000])\njuniward=append_path('JUNIWARD')(positives[10000:])\nuerd=append_path('UERD')(positives[20000:30000])\n\npos_paths=np.concatenate([jmipod, juniward,uerd])","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:23.360691Z","iopub.execute_input":"2023-11-22T00:47:23.360968Z","iopub.status.idle":"2023-11-22T00:47:23.551672Z","shell.execute_reply.started":"2023-11-22T00:47:23.360940Z","shell.execute_reply":"2023-11-22T00:47:23.550507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.random.seed(0)\npositives = train_filenames.copy()\nnegatives = train_filenames.copy()\n\nnp.random.shuffle(positives)\nnp.random.shuffle(negatives)\n\njmipod=append_path('JMiPOD')(positives[:10000])\njuniward=append_path('JUNIWARD')(positives[10000:])\nuerd=append_path('UERD')(positives[20000:30000])\n\npos_paths=np.concatenate([jmipod, juniward,uerd])","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:23.552716Z","iopub.execute_input":"2023-11-22T00:47:23.553001Z","iopub.status.idle":"2023-11-22T00:47:23.739633Z","shell.execute_reply.started":"2023-11-22T00:47:23.552965Z","shell.execute_reply":"2023-11-22T00:47:23.738400Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_paths=append_path('Test')(sub.Id.values)\nneg_paths =append_path('Cover')(negatives[:30000])","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:23.740815Z","iopub.execute_input":"2023-11-22T00:47:23.741112Z","iopub.status.idle":"2023-11-22T00:47:23.809387Z","shell.execute_reply.started":"2023-11-22T00:47:23.741081Z","shell.execute_reply":"2023-11-22T00:47:23.808149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_paths=np.concatenate([pos_paths,neg_paths])\ntrain_labels= np.array([1] * len(pos_paths)+[0] * len(neg_paths))\nprint(\"train_labels done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:23.810495Z","iopub.execute_input":"2023-11-22T00:47:23.810821Z","iopub.status.idle":"2023-11-22T00:47:23.845813Z","shell.execute_reply.started":"2023-11-22T00:47:23.810788Z","shell.execute_reply":"2023-11-22T00:47:23.844863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_paths, valid_paths, train_labels, valid_labels=train_test_split(train_paths,train_labels,test_size=0.2,random_state=42)\nprint(\"done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:23.848139Z","iopub.execute_input":"2023-11-22T00:47:23.848417Z","iopub.status.idle":"2023-11-22T00:47:23.888719Z","shell.execute_reply.started":"2023-11-22T00:47:23.848389Z","shell.execute_reply":"2023-11-22T00:47:23.887778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def decode_image(filename, label=None, image_size=(512,512)):\n    bits=tf.io.read_file(filename)\n    image=tf.image.decode_jpeg(bits,channels=3)\n    image=tf.cast(image,tf.float32) / 255.0 #image to tf.float32 data type\n    image=tf.image.resize(image,image_size)\n    \n    if label is None:\n        return image\n    else:\n        return image,label\n\ndef data_augment(image,label=None):\n    image=tf.image.random_flip_left_right(image)\n    image=tf.image.random_flip_up_down(image)\n    \n    if label is None:\n        return image\n    else:\n        return image,label","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:23.889781Z","iopub.execute_input":"2023-11-22T00:47:23.890046Z","iopub.status.idle":"2023-11-22T00:47:23.895777Z","shell.execute_reply.started":"2023-11-22T00:47:23.890019Z","shell.execute_reply":"2023-11-22T00:47:23.894881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = (tf.data.Dataset\n                 .from_tensor_slices((train_paths,train_labels))\n                 .map(decode_image, num_parallel_calls=AUTO)\n                 .cache()\n                 .repeat()\n                 .shuffle(1024)\n                 .batch(BATCH_SIZE)\n                 .prefetch(AUTO)\n                )\nvalid_dataset= (tf.data.Dataset\n                .from_tensor_slices((valid_paths,valid_labels))\n                .map(decode_image, num_parallel_calls=AUTO)\n                .batch(BATCH_SIZE)\n                .prefetch(AUTO)\n               )\ntest_dataset= (tf.data.Dataset\n               .from_tensor_slices(test_paths)\n               .map(decode_image, num_parallel_calls=AUTO)\n               .batch(BATCH_SIZE)\n              )","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:23.896741Z","iopub.execute_input":"2023-11-22T00:47:23.896985Z","iopub.status.idle":"2023-11-22T00:47:24.079835Z","shell.execute_reply.started":"2023-11-22T00:47:23.896961Z","shell.execute_reply":"2023-11-22T00:47:24.078616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_lrfn(lr_start=0.0001,lr_max=0.000075,\n              lr_min=0.000001, lr_rampup_epochs=20,\n              lr_sustain_epochs=0,lr_exp_decay=0.8):\n    lr_max = lr_max * strategy.num_replicas_in_sync\n    \n    def lrfn(epoch):\n        if epoch < lr_rampup_epochs:\n            lr = (lr_max- lr_start)/lr_rampup * epoch + lr_start\n        elif epoch < lr_rampup_epochs + lr_sustain_epochs:\n            lr = lr_max\n        else:\n            lr = (lr_max - lr_min) * lr_exp_decay ** (epoch - lr_rampup_epochs - lr_sustain_epochs) + lr_min\n        return lr\n        \n    return lrfn","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:24.081247Z","iopub.execute_input":"2023-11-22T00:47:24.081629Z","iopub.status.idle":"2023-11-22T00:47:24.087728Z","shell.execute_reply.started":"2023-11-22T00:47:24.081576Z","shell.execute_reply":"2023-11-22T00:47:24.086712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.applications.resnet50 import ResNet50\nprint(\"imported resnet\")","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:24.088901Z","iopub.execute_input":"2023-11-22T00:47:24.089188Z","iopub.status.idle":"2023-11-22T00:47:24.100999Z","shell.execute_reply.started":"2023-11-22T00:47:24.089159Z","shell.execute_reply":"2023-11-22T00:47:24.100080Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    model = tf.keras.Sequential([\n        ResNet50(\n        input_shape=(512,512,3),\n        weights='imagenet',\n        include_top=False),\n        L.GlobalAveragePooling2D(),\n        L.Dense(1, activation='sigmoid')\n    ])\n    \n    model.compile(\n    optimizer='adam',\n    loss='binary_crossentropy', \n    metrics=['accuracy']\n    )\n    model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:24.102006Z","iopub.execute_input":"2023-11-22T00:47:24.102262Z","iopub.status.idle":"2023-11-22T00:47:45.880454Z","shell.execute_reply.started":"2023-11-22T00:47:24.102234Z","shell.execute_reply":"2023-11-22T00:47:45.879431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEPS_PER_EPOCH=train_labels.shape[0] // BATCH_SIZE\n\nhistory= model.fit(\ntrain_dataset,\nepochs=EPOCHS,\nsteps_per_epoch=STEPS_PER_EPOCH,\nvalidation_data=valid_dataset)","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:47:45.881593Z","iopub.execute_input":"2023-11-22T00:47:45.881885Z","iopub.status.idle":"2023-11-22T01:46:16.606466Z","shell.execute_reply.started":"2023-11-22T00:47:45.881854Z","shell.execute_reply":"2023-11-22T01:46:16.605217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}}]}