{"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":30587,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-21T23:04:40.659266Z","iopub.execute_input":"2023-11-21T23:04:40.659520Z","iopub.status.idle":"2023-11-21T23:04:56.952776Z","shell.execute_reply.started":"2023-11-21T23:04:40.659493Z","shell.execute_reply":"2023-11-21T23:04:56.951742Z"},"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-21T23:04:56.954503Z","iopub.execute_input":"2023-11-21T23:04:56.954994Z","iopub.status.idle":"2023-11-21T23:05:05.234847Z","shell.execute_reply.started":"2023-11-21T23:04:56.954965Z","shell.execute_reply":"2023-11-21T23:05:05.233839Z"},"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\nEPOCHS = 20\nBATCH_SIZE = 16 * strategy.num_replicas_in_sync\nprint(\"done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-21T23:05:05.235964Z","iopub.execute_input":"2023-11-21T23:05:05.236219Z","iopub.status.idle":"2023-11-21T23:05:05.241177Z","shell.execute_reply.started":"2023-11-21T23:05:05.236193Z","shell.execute_reply":"2023-11-21T23:05:05.240445Z"},"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-21T23:05:05.242940Z","iopub.execute_input":"2023-11-21T23:05:05.243205Z","iopub.status.idle":"2023-11-21T23:05:05.255246Z","shell.execute_reply.started":"2023-11-21T23:05:05.243178Z","shell.execute_reply":"2023-11-21T23:05:05.254547Z"},"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-21T23:05:05.256037Z","iopub.execute_input":"2023-11-21T23:05:05.256258Z","iopub.status.idle":"2023-11-21T23:05:06.144923Z","shell.execute_reply.started":"2023-11-21T23:05:05.256236Z","shell.execute_reply":"2023-11-21T23:05:06.143952Z"},"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-21T23:05:06.145960Z","iopub.execute_input":"2023-11-21T23:05:06.146230Z","iopub.status.idle":"2023-11-21T23:05:06.343250Z","shell.execute_reply.started":"2023-11-21T23:05:06.146202Z","shell.execute_reply":"2023-11-21T23:05:06.342313Z"},"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])\nprint(\"step done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-21T23:05:06.344323Z","iopub.execute_input":"2023-11-21T23:05:06.344626Z","iopub.status.idle":"2023-11-21T23:05:06.418293Z","shell.execute_reply.started":"2023-11-21T23:05:06.344596Z","shell.execute_reply":"2023-11-21T23:05:06.417447Z"},"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))","metadata":{"execution":{"iopub.status.busy":"2023-11-21T23:05:06.419300Z","iopub.execute_input":"2023-11-21T23:05:06.419594Z","iopub.status.idle":"2023-11-21T23:05:06.456782Z","shell.execute_reply.started":"2023-11-21T23:05:06.419565Z","shell.execute_reply":"2023-11-21T23:05:06.455974Z"},"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)\ntrain_paths, valid_paths, train_labels, valid_labels=train_test_split(train_paths,train_labels,test_size=0.2,random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-11-21T23:05:06.457642Z","iopub.execute_input":"2023-11-21T23:05:06.457897Z","iopub.status.idle":"2023-11-21T23:05:06.537236Z","shell.execute_reply.started":"2023-11-21T23:05:06.457870Z","shell.execute_reply":"2023-11-21T23:05:06.536449Z"},"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-21T23:05:06.539318Z","iopub.execute_input":"2023-11-21T23:05:06.539583Z","iopub.status.idle":"2023-11-21T23:05:06.545130Z","shell.execute_reply.started":"2023-11-21T23:05:06.539557Z","shell.execute_reply":"2023-11-21T23:05:06.544442Z"},"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-21T23:05:06.545899Z","iopub.execute_input":"2023-11-21T23:05:06.546123Z","iopub.status.idle":"2023-11-21T23:05:06.728340Z","shell.execute_reply.started":"2023-11-21T23:05:06.546099Z","shell.execute_reply":"2023-11-21T23:05:06.727446Z"},"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\n    \nprint(\"done\")","metadata":{"execution":{"iopub.status.busy":"2023-11-21T23:05:06.729344Z","iopub.execute_input":"2023-11-21T23:05:06.729609Z","iopub.status.idle":"2023-11-21T23:05:06.735593Z","shell.execute_reply.started":"2023-11-21T23:05:06.729583Z","shell.execute_reply":"2023-11-21T23:05:06.734817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.applications.resnet50 import ResNet50","metadata":{"execution":{"iopub.status.busy":"2023-11-21T23:05:06.736555Z","iopub.execute_input":"2023-11-21T23:05:06.736802Z","iopub.status.idle":"2023-11-21T23:05:06.768454Z","shell.execute_reply.started":"2023-11-21T23:05:06.736776Z","shell.execute_reply":"2023-11-21T23:05:06.767727Z"},"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-21T23:05:06.769392Z","iopub.execute_input":"2023-11-21T23:05:06.769641Z","iopub.status.idle":"2023-11-21T23:05:28.116010Z","shell.execute_reply.started":"2023-11-21T23:05:06.769616Z","shell.execute_reply":"2023-11-21T23:05:28.115061Z"},"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-21T23:05:28.117319Z","iopub.execute_input":"2023-11-21T23:05:28.117602Z","iopub.status.idle":"2023-11-22T00:32:22.623224Z","shell.execute_reply.started":"2023-11-21T23:05:28.117575Z","shell.execute_reply":"2023-11-22T00:32:22.621934Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('model.h5')","metadata":{"execution":{"iopub.status.busy":"2023-11-22T00:32:22.624093Z","iopub.status.idle":"2023-11-22T00:32:22.624475Z","shell.execute_reply.started":"2023-11-22T00:32:22.624284Z","shell.execute_reply":"2023-11-22T00:32:22.624301Z"},"trusted":true},"execution_count":null,"outputs":[]}]}