{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":154841691,"sourceType":"kernelVersion"},{"sourceId":161656277,"sourceType":"kernelVersion"}],"dockerImageVersionId":30627,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\n\nimport pandas as pd\nimport numpy as np\nimport pickle\nimport datetime\n\n\n\n\nfrom keras.utils import to_categorical, set_random_seed\n\nimport tensorflow as tf\nimport keras_core as keras\n\nfrom keras_core import ops\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","ExecuteTime":{"end_time":"2023-12-15T16:45:47.898289400Z","start_time":"2023-12-15T16:45:47.845490900Z"},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.649178Z","iopub.execute_input":"2024-02-04T13:28:31.649646Z","iopub.status.idle":"2024-02-04T13:28:31.655118Z","shell.execute_reply.started":"2024-02-04T13:28:31.649606Z","shell.execute_reply":"2024-02-04T13:28:31.654222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Reproducibility","metadata":{}},{"cell_type":"markdown","source":"# configuration","metadata":{}},{"cell_type":"code","source":"def set_reproducibility(seed=42):\n    np.random.seed(seed)\n    set_random_seed(seed)","metadata":{"ExecuteTime":{"end_time":"2023-12-15T16:45:47.924309400Z","start_time":"2023-12-15T16:45:47.856251300Z"},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.657383Z","iopub.execute_input":"2024-02-04T13:28:31.657771Z","iopub.status.idle":"2024-02-04T13:28:31.668609Z","shell.execute_reply.started":"2024-02-04T13:28:31.657737Z","shell.execute_reply":"2024-02-04T13:28:31.667737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"    \nSEED = 42\n\n#PATH\n#local    \n#ds_src = \"/mnt/f/kaggle/input/UBC-OCEAN/\"\n#dst_path = \"output/\"\n\n#kaggle\nds_src = \"/kaggle/input/UBC-OCEAN/\"\ndst_path = \"\"\n\n    \n# Training\ntrain_csv_path =        f\"{ds_src}train.csv\"\ntrain_thumbnail_paths = f\"{ds_src}train_thumbnails\"\ntrain_dir =             f\"{ds_src}train_images\"\nbatch_size = 4\nepochs = 50\n    \n# Test\ntest_csv_path =        f\"{ds_src}test.csv\"\ntest_thumbnail_paths = f\"{ds_src}test_thumbnails\"\ntest_dir =             f\"{ds_src}test_images\"\n    \n# Experiment\nexperiment_name = \"experiment_1\"\nexp_id = \"id1\"\nactivation_function = keras.activations.softmax\nloss_func = keras.losses.categorical_crossentropy\nmomentum = 0.9\nlr = 0.001\nimage_size = 400\n\ndate_str = datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\nlog_dir = f\"./logdir/{date_str}{experiment_name}_{str(exp_id)}\"\n\n# dictionnary \nid_to_name_dst = f\"{dst_path}id_to_name.pkl\"\n# model\nmodel_name = \"thumbnail-weighted_basic\"\nmodel_path = f\"{dst_path}{model_name}.weights.h5\"\n\n#kaggle\nid_to_name_dst = \"/kaggle/input/01-02-1-training/id_to_name.pkl\"\nmodel_path =     \"/kaggle/input/01-02-1-training/thumbnail-weighted_basic.weights.h5\"\n","metadata":{"ExecuteTime":{"end_time":"2023-12-15T16:45:47.926816600Z","start_time":"2023-12-15T16:45:47.875275Z"},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.669754Z","iopub.execute_input":"2024-02-04T13:28:31.670093Z","iopub.status.idle":"2024-02-04T13:28:31.684442Z","shell.execute_reply.started":"2024-02-04T13:28:31.670061Z","shell.execute_reply":"2024-02-04T13:28:31.683526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nset_reproducibility(SEED)","metadata":{"ExecuteTime":{"end_time":"2023-12-15T16:45:47.949340800Z","start_time":"2023-12-15T16:45:47.890781800Z"},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.685807Z","iopub.execute_input":"2024-02-04T13:28:31.686213Z","iopub.status.idle":"2024-02-04T13:28:31.695802Z","shell.execute_reply.started":"2024-02-04T13:28:31.68618Z","shell.execute_reply":"2024-02-04T13:28:31.695034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# loading train data","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv(train_csv_path)\ntrain.head()","metadata":{"ExecuteTime":{"end_time":"2023-12-15T16:45:47.982284500Z","start_time":"2023-12-15T16:45:47.976285700Z"},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.698313Z","iopub.execute_input":"2024-02-04T13:28:31.698576Z","iopub.status.idle":"2024-02-04T13:28:31.715126Z","shell.execute_reply.started":"2024-02-04T13:28:31.698553Z","shell.execute_reply":"2024-02-04T13:28:31.714269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# dataset pre processing\n","metadata":{}},{"cell_type":"code","source":"def read_image(path):\n    file = tf.io.read_file(path)\n    image = tf.io.decode_png(file, 3)\n    image = tf.image.resize(image, (image_size, image_size))\n    image = tf.image.per_image_standardization(image)\n    return image","metadata":{"ExecuteTime":{"end_time":"2023-12-15T16:45:47.986556800Z","start_time":"2023-12-15T16:45:47.981284800Z"},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.716123Z","iopub.execute_input":"2024-02-04T13:28:31.716384Z","iopub.status.idle":"2024-02-04T13:28:31.721471Z","shell.execute_reply.started":"2024-02-04T13:28:31.71636Z","shell.execute_reply":"2024-02-04T13:28:31.720557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# build the model\n","metadata":{}},{"cell_type":"code","source":"def create_model():\n    input_layer = keras.layers.Input(shape=(image_size, image_size, 3))\n\n    #input_tensor = keras.layers.RandomFlip(\"horizontal\")(input_tensor)\n    #augmented_input = keras.layers.RandomRotation(0.15)(augmented_input)\n    \n       \n    last_tensor = keras.layers.Conv2D(64, (7, 7), strides=(2, 2), padding='same',\n                                      activation=keras.activations.relu)(input_layer)\n\n    last_tensor = keras.layers.MaxPooling2D()(last_tensor)\n\n    for _ in range(3):\n        hidden_tensor_1 = keras.layers.Conv2D(64, (3, 3), padding='same',\n                                              activation=keras.activations.relu)(last_tensor)\n        hidden_tensor_1 = keras.layers.Conv2D(64, (3, 3), padding='same',\n                                              activation=keras.activations.relu)(hidden_tensor_1)\n        last_tensor = keras.layers.Add()([last_tensor, hidden_tensor_1])\n\n    for i in range(4):\n        hidden_tensor_1 = keras.layers.Conv2D(128, (3, 3), padding='same',\n                                              strides=((2, 2) if i == 0 else (1, 1)),\n                                              activation=keras.activations.relu)(last_tensor)\n        hidden_tensor_1 = keras.layers.Conv2D(128, (3, 3), padding='same',\n                                              activation=keras.activations.relu)(hidden_tensor_1)\n\n        if i == 0:\n            last_tensor = keras.layers.MaxPooling2D()(last_tensor)\n            last_tensor = keras.layers.Dense(128, activation=keras.activations.linear)(last_tensor)\n\n        last_tensor = keras.layers.Add()([last_tensor, hidden_tensor_1])\n\n    for i in range(6):\n        hidden_tensor_1 = keras.layers.Conv2D(256, (3, 3), padding='same',\n                                              strides=((2, 2) if i == 0 else (1, 1)),\n                                              activation=keras.activations.relu)(last_tensor)\n        hidden_tensor_1 = keras.layers.Conv2D(256, (3, 3), padding='same',\n                                              activation=keras.activations.relu)(hidden_tensor_1)\n\n        if i == 0:\n            last_tensor = keras.layers.MaxPooling2D()(last_tensor)\n            last_tensor = keras.layers.Dense(256, activation=keras.activations.linear)(last_tensor)\n\n        last_tensor = keras.layers.Add()([last_tensor, hidden_tensor_1])\n\n    for i in range(3):\n        hidden_tensor_1 = keras.layers.Conv2D(512, (3, 3), padding='valid' if i == 0 else \"same\",\n                                              strides=((2, 2) if i == 0 else (1, 1)),\n                                              activation=keras.activations.relu)(last_tensor)\n\n        hidden_tensor_1 = keras.layers.Conv2D(512, (3, 3), padding='same',\n                                              activation=keras.activations.relu)(hidden_tensor_1)\n\n        if i == 0:\n            last_tensor = keras.layers.MaxPooling2D()(last_tensor)\n            last_tensor = keras.layers.Dense(512, activation=keras.activations.linear)(last_tensor)\n\n        last_tensor = keras.layers.Add()([last_tensor, hidden_tensor_1])\n    \n    flattened_input_tensor = keras.layers.Flatten()(last_tensor)\n    output_tensor = keras.layers.Dense(5, activation=keras.activations.softmax)(flattened_input_tensor)\n    \n    model = keras.models.Model(inputs=[input_layer], outputs=[output_tensor])\n    \n    model.compile(\n        loss=loss_func,\n        optimizer= 'adam',\n        metrics=['accuracy'],\n        )\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-02-04T13:28:31.722604Z","iopub.execute_input":"2024-02-04T13:28:31.722867Z","iopub.status.idle":"2024-02-04T13:28:31.740693Z","shell.execute_reply.started":"2024-02-04T13:28:31.722844Z","shell.execute_reply":"2024-02-04T13:28:31.739741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = create_model()","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2023-12-15T16:45:58.400705200Z","start_time":"2023-12-15T16:45:47.986556800Z"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.741659Z","iopub.execute_input":"2024-02-04T13:28:31.741907Z","iopub.status.idle":"2024-02-04T13:28:31.984697Z","shell.execute_reply.started":"2024-02-04T13:28:31.741877Z","shell.execute_reply":"2024-02-04T13:28:31.983863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# inference\n","metadata":{}},{"cell_type":"markdown","source":"### loading model","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv(test_csv_path)\ndf[\"image_path\"] = df[\"image_id\"].apply(lambda x: f\"{test_thumbnail_paths}/{x}_thumbnail.png\")\n# Load the model weights\nmodel.load_weights(model_path)\n    \n    # Load the id to name dictionary\nwith open(id_to_name_dst, \"rb\") as f:\n    id_to_name = pickle.load(f)","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2023-12-15T16:45:58.734161500Z","start_time":"2023-12-15T16:45:58.404215700Z"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-02-04T13:28:31.985938Z","iopub.execute_input":"2024-02-04T13:28:31.986231Z","iopub.status.idle":"2024-02-04T13:28:33.30266Z","shell.execute_reply.started":"2024-02-04T13:28:31.986207Z","shell.execute_reply":"2024-02-04T13:28:33.301694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### building prediction dataframe","metadata":{"execution":{"iopub.status.busy":"2023-12-11T11:49:05.61252Z","iopub.execute_input":"2023-12-11T11:49:05.613373Z","iopub.status.idle":"2023-12-11T11:49:05.64239Z","shell.execute_reply.started":"2023-12-11T11:49:05.613325Z","shell.execute_reply":"2023-12-11T11:49:05.641292Z"}}},{"cell_type":"code","source":"predicted_labels = []\n\nfor index, row in df.iterrows():\n    # Get the image path\n    image_path = row[\"image_path\"]\n    \n    # Get the image\n    image = read_image(image_path)[None, ...]\n    \n    # Predict the label\n    logits = model.predict(image)[0]\n    pred = logits.argmax(axis=0)\n    print(pred)\n    #.tolist()[0]\n    \n    # Map the pred to the name\n    label = id_to_name[pred]\n    \n    predicted_labels.append(label)\n\n# Add the predicted labels to the csv\ndf[\"label\"] = predicted_labels","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2023-12-15T16:45:59.420512800Z","start_time":"2023-12-15T16:45:58.734161500Z"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-02-04T13:28:33.303767Z","iopub.execute_input":"2024-02-04T13:28:33.304059Z","iopub.status.idle":"2024-02-04T13:28:37.224243Z","shell.execute_reply.started":"2024-02-04T13:28:33.304032Z","shell.execute_reply":"2024-02-04T13:28:37.223269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### submission","metadata":{}},{"cell_type":"code","source":"submission_df = df[[\"image_id\", \"label\"]]\nsubmission_df.to_csv(\"submission.csv\", index=False)","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2023-12-15T16:45:59.42451Z","start_time":"2023-12-15T16:45:59.420512800Z"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-02-04T13:28:37.225359Z","iopub.execute_input":"2024-02-04T13:28:37.225623Z","iopub.status.idle":"2024-02-04T13:28:37.239854Z","shell.execute_reply.started":"2024-02-04T13:28:37.225599Z","shell.execute_reply":"2024-02-04T13:28:37.238878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2023-12-15T16:45:59.477727200Z","start_time":"2023-12-15T16:45:59.425793900Z"},"jupyter":{"outputs_hidden":false}},"execution_count":null,"outputs":[]}]}