{"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":"code","source":"import os\nimport random\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom sklearn.preprocessing import LabelEncoder\nfrom PIL import Image\nos.environ[\"OPENCV_IO_MAX_IMAGE_PIXELS\"] = pow(2,40).__str__()\nimport cv2\nimport matplotlib.pyplot as plt\nimport joblib\nfrom sklearn.model_selection import KFold\nfrom PIL import Image, ImageEnhance\nImage.MAX_IMAGE_PIXELS = 5_000_000_000","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-02T06:23:50.038082Z","iopub.execute_input":"2023-11-02T06:23:50.03867Z","iopub.status.idle":"2023-11-02T06:23:50.182814Z","shell.execute_reply.started":"2023-11-02T06:23:50.038633Z","shell.execute_reply":"2023-11-02T06:23:50.181283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_path = \"/kaggle/input/UBC-OCEAN/train_images\"\ntest_images_path = \"/kaggle/input/UBC-OCEAN/test_images\"\ntrain_thumbnails_path = \"/kaggle/input/UBC-OCEAN/train_thumbnails\"\ntest_thumbnails_path = \"/kaggle/input/UBC-OCEAN/test_thumbnails\"","metadata":{"execution":{"iopub.status.busy":"2023-11-02T05:59:18.841702Z","iopub.execute_input":"2023-11-02T05:59:18.843778Z","iopub.status.idle":"2023-11-02T05:59:18.849311Z","shell.execute_reply.started":"2023-11-02T05:59:18.843731Z","shell.execute_reply":"2023-11-02T05:59:18.84816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# data processing","metadata":{}},{"cell_type":"code","source":"# train\ntrain_df = pd.read_csv(\"/kaggle/input/UBC-OCEAN/train.csv\")\n# test\ntest_df = pd.read_csv(\"/kaggle/input/UBC-OCEAN/test.csv\")\n\n#\nsample_submission = pd.read_csv(\"/kaggle/input/UBC-OCEAN/sample_submission.csv\")\n\nprint(\"Train dataframe\", train_df.shape)\nprint(\"Test dataframe\", test_df.shape)\ntrain_df.sample(5)","metadata":{"execution":{"iopub.status.busy":"2023-11-02T05:59:18.850439Z","iopub.execute_input":"2023-11-02T05:59:18.850714Z","iopub.status.idle":"2023-11-02T05:59:18.919268Z","shell.execute_reply.started":"2023-11-02T05:59:18.850692Z","shell.execute_reply":"2023-11-02T05:59:18.918011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"le = LabelEncoder()\ntrain_df[\"label\"] = train_df[[\"label\"]].apply(le.fit_transform)\ntrain_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-11-02T05:59:18.922889Z","iopub.execute_input":"2023-11-02T05:59:18.923737Z","iopub.status.idle":"2023-11-02T05:59:18.948548Z","shell.execute_reply.started":"2023-11-02T05:59:18.923693Z","shell.execute_reply":"2023-11-02T05:59:18.947583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_and_preprocess_images(directory, target_size=(256, 256)):\n    image_paths = [os.path.join(directory, filename) for filename in os.listdir(directory) if filename.endswith('.png')]\n    images = []\n    for path in image_paths:\n        img = cv2.imread(path)\n        #img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n        img = cv2.resize(img, target_size)\n        images.append(img)\n    return np.array(images)\nfeature_matrix = load_and_preprocess_images(train_thumbnails_path)","metadata":{"execution":{"iopub.status.busy":"2023-11-02T05:59:18.949826Z","iopub.execute_input":"2023-11-02T05:59:18.951306Z","iopub.status.idle":"2023-11-02T06:00:49.842035Z","shell.execute_reply.started":"2023-11-02T05:59:18.951227Z","shell.execute_reply":"2023-11-02T06:00:49.840342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Image.fromarray(feature_matrix[0])","metadata":{"execution":{"iopub.status.busy":"2023-11-02T06:00:49.843833Z","iopub.execute_input":"2023-11-02T06:00:49.84421Z","iopub.status.idle":"2023-11-02T06:00:49.917933Z","shell.execute_reply.started":"2023-11-02T06:00:49.844178Z","shell.execute_reply":"2023-11-02T06:00:49.916295Z"}}},{"cell_type":"code","source":"np.shape(feature_matrix[0])","metadata":{"execution":{"iopub.status.busy":"2023-11-02T06:00:49.919859Z","iopub.execute_input":"2023-11-02T06:00:49.920226Z","iopub.status.idle":"2023-11-02T06:00:49.930282Z","shell.execute_reply.started":"2023-11-02T06:00:49.920198Z","shell.execute_reply":"2023-11-02T06:00:49.928813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_thumnails_image_ids = [int(filename.split(\"_\")[0]) for filename in os.listdir(train_thumbnails_path) if filename.endswith('.png')]\ntrain_thumbnails_df = train_df[train_df.image_id.isin(train_thumnails_image_ids)]","metadata":{"execution":{"iopub.status.busy":"2023-11-02T06:00:49.932193Z","iopub.execute_input":"2023-11-02T06:00:49.932646Z","iopub.status.idle":"2023-11-02T06:00:49.95297Z","shell.execute_reply.started":"2023-11-02T06:00:49.932613Z","shell.execute_reply":"2023-11-02T06:00:49.951721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# model","metadata":{}},{"cell_type":"code","source":"class RnnModel(tf.keras.Model):\n  def __init__(self, *, dropout_rate=0.2):\n    super().__init__()\n    self.Conv2D_1 = tf.keras.layers.Conv2D(2,(4,4), activation='relu')\n    self.Pooling2D_1 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2),strides=(2, 2), padding='valid')\n    self.Conv2D_2 = tf.keras.layers.Conv2D(1,(4,4), activation='relu')\n    self.Pooling2D_2 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2),strides=(2, 2), padding='valid')\n    self.Conv2D_3 = tf.keras.layers.Conv2D(1,(4,4), activation='relu')\n    self.Pooling2D_3 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2),strides=(2, 2), padding='valid')\n    self.Conv2D_4 = tf.keras.layers.Conv2D(1,(4,4), activation='relu')\n    self.Pooling2D_4 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2),strides=(2, 2), padding='valid')\n    self.Dropout = tf.keras.layers.Dropout(dropout_rate)\n    self.fn1 =  tf.keras.layers.Dense(1000, activation='relu')\n    self.fn2 =  tf.keras.layers.Dense(500, activation='relu') \n    self.out =  tf.keras.layers.Dense(5) \n  def call(self, x):\n    x = self.Conv2D_1(x)\n    x = self.Pooling2D_1(x)   \n    x = self.Conv2D_2(x)\n    x = self.Pooling2D_2(x)\n    x = self.Conv2D_3(x)\n    x = self.Pooling2D_3(x)\n    x = self.Conv2D_4(x)\n    x = self.Pooling2D_4(x)\n    x = self.Dropout(x)\n    x = tf.keras.layers.Flatten()(x)\n    x = self.Dropout(x)\n    x = self.fn1(x)\n    x = self.Dropout(x)\n    x = self.fn2(x)\n    x = self.out(x)\n    return tf.keras.layers.Softmax()(x)","metadata":{"execution":{"iopub.status.busy":"2023-11-02T06:47:05.479723Z","iopub.execute_input":"2023-11-02T06:47:05.480192Z","iopub.status.idle":"2023-11-02T06:47:05.495489Z","shell.execute_reply.started":"2023-11-02T06:47:05.480156Z","shell.execute_reply":"2023-11-02T06:47:05.493819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learning_rate = 0.001\nepsilon = 0.0000001\nmodels = []\nN_Folds = 4\ntrain_dt = feature_matrix.astype(np.float32)\ntarget = train_thumbnails_df[\"label\"].values\nkf = KFold(n_splits=N_Folds, shuffle=True, random_state=100)\nfor fold, (train_idx, valid_idx) in enumerate(kf.split(train_dt, target)): \n    print(f\"######### traning {fold}_model ################\")\n    loss = tf.keras.losses.SparseCategoricalCrossentropy()\n    metric = tf.keras.metrics.SparseCategoricalAccuracy\n    optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate, epsilon=epsilon)\n    callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)\n    model_my = RnnModel(dropout_rate=0.10)\n    model_my.compile(optimizer=optimizer, loss=loss, metrics=[\"SparseCategoricalAccuracy\"])\n    X_train, X_valid = train_dt[train_idx,:], train_dt[valid_idx,:]\n    y_train, y_valid = target[train_idx], target[valid_idx]\n    model_my.fit(x=X_train, y=y_train,validation_data=(X_valid, y_valid),\n                 steps_per_epoch = 10,epochs=20,\n                 callbacks=[callback])\n    models.append(model_my)","metadata":{"execution":{"iopub.status.busy":"2023-11-02T06:51:35.904742Z","iopub.execute_input":"2023-11-02T06:51:35.905196Z","iopub.status.idle":"2023-11-02T06:54:56.70559Z","shell.execute_reply.started":"2023-11-02T06:51:35.905166Z","shell.execute_reply":"2023-11-02T06:54:56.703404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"joblib.dump(models,\"models.pkl\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"test_feature_matrix = load_and_preprocess_images(test_thumbnails_path)\ntest_predictions = 0\nfor i in range(N_Folds):\n    test_predictions += models[i].predict(test_feature_matrix.astype(np.float32))\ntest_predictions = np.argmax(test_predictions/N_Folds,axis=1)\ntest_df = pd.read_csv(\"/kaggle/input/UBC-OCEAN/test.csv\")\ntest_df[\"label\"] = le.inverse_transform(test_predictions)\ntest_df.drop([\"image_height\", \"image_width\"], axis=1).to_csv(\"submission.csv\", index=False)\ntest_df","metadata":{"execution":{"iopub.status.busy":"2023-11-02T06:36:23.729699Z","iopub.execute_input":"2023-11-02T06:36:23.730228Z","iopub.status.idle":"2023-11-02T06:36:24.270377Z","shell.execute_reply.started":"2023-11-02T06:36:23.730187Z","shell.execute_reply":"2023-11-02T06:36:24.268829Z"}}}]}