{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-19T20:09:47.663190Z","iopub.execute_input":"2023-09-19T20:09:47.663911Z","iopub.status.idle":"2023-09-19T20:09:48.097919Z","shell.execute_reply.started":"2023-09-19T20:09:47.663870Z","shell.execute_reply":"2023-09-19T20:09:48.096545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install py7zr\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:09:48.102129Z","iopub.execute_input":"2023-09-19T20:09:48.103709Z","iopub.status.idle":"2023-09-19T20:09:57.226831Z","shell.execute_reply.started":"2023-09-19T20:09:48.103633Z","shell.execute_reply":"2023-09-19T20:09:57.225867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport os\n\nimport itertools\nfrom py7zr import unpack_7zarchive\nimport shutil\n\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D,MaxPool2D,Dense,Flatten,Dropout,Input, AveragePooling2D, Activation,Conv2D, MaxPooling2D, BatchNormalization,Concatenate\nfrom tensorflow.keras.callbacks import EarlyStopping, TensorBoard\nfrom tensorflow.keras import regularizers, optimizers\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:09:57.228287Z","iopub.execute_input":"2023-09-19T20:09:57.228584Z","iopub.status.idle":"2023-09-19T20:10:37.522036Z","shell.execute_reply.started":"2023-09-19T20:09:57.228556Z","shell.execute_reply":"2023-09-19T20:10:37.521060Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.register_unpack_format('7zip',['.7z'],unpack_7zarchive)\nshutil.unpack_archive('../input/cifar-10/train.7z', '/kaggle/temp/')","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:10:37.523224Z","iopub.execute_input":"2023-09-19T20:10:37.523716Z","iopub.status.idle":"2023-09-19T20:11:39.036291Z","shell.execute_reply.started":"2023-09-19T20:10:37.523688Z","shell.execute_reply":"2023-09-19T20:11:39.035373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels = pd.read_csv(\"../input/cifar-10/trainLabels.csv\", header=\"infer\")\n\nclasses = train_labels['label'].unique()\nprint(classes)","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:39.038849Z","iopub.execute_input":"2023-09-19T20:11:39.039142Z","iopub.status.idle":"2023-09-19T20:11:39.077494Z","shell.execute_reply.started":"2023-09-19T20:11:39.039116Z","shell.execute_reply":"2023-09-19T20:11:39.076670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\ndef ensure_directory_exists(directory_path):\n    \"\"\"Ensures the given directory exists. If not, creates it.\"\"\"\n    if not os.path.exists(directory_path):\n        os.mkdir(directory_path)\n\ndef move_files_based_on_probability(source, dest1, dest2, threshold=0.8):\n    \"\"\"Moves files from source to either dest1 or dest2 based on a random probability.\"\"\"\n    p = np.random.random()\n    if p <= threshold:\n        os.replace(source, dest1)\n    else:\n        os.replace(source, dest2)\n\n# Define paths\nbase_path = \"/kaggle/temp\"\ntrain_path = os.path.join(base_path, \"train\")\nvalid_path = os.path.join(base_path, \"valid\")\ntest_path = os.path.join(base_path, \"test\")\n\n# Ensure validation directory exists\nensure_directory_exists(valid_path)\n\n# Ensure train and valid subdirectories for each class exist\nfor class_name in classes:\n    ensure_directory_exists(os.path.join(train_path, class_name))\n    ensure_directory_exists(os.path.join(valid_path, class_name))\n\n# Iterate over train labels and move images accordingly\nfor index, row in train_labels.iterrows():\n    image_id = str(row[\"id\"]) + \".png\"\n    source_image_path = os.path.join(train_path, image_id)\n\n    train_target_path = os.path.join(train_path, row[\"label\"], image_id)\n    valid_target_path = os.path.join(valid_path, row[\"label\"], image_id)\n\n    move_files_based_on_probability(source_image_path, train_target_path, valid_target_path)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:39.078626Z","iopub.execute_input":"2023-09-19T20:11:39.078939Z","iopub.status.idle":"2023-09-19T20:11:46.556285Z","shell.execute_reply.started":"2023-09-19T20:11:39.078912Z","shell.execute_reply":"2023-09-19T20:11:46.555355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport tensorflow as tf\n\ndef setup_memory_growth_for_gpus():\n    \"\"\"Sets memory growth for available GPUs.\"\"\"\n    available_gpus = tf.config.experimental.list_physical_devices('GPU')\n    if not available_gpus:\n        return\n\n    for gpu in available_gpus:\n        try:\n            tf.config.experimental.set_memory_growth(gpu, True)\n        except RuntimeError as error:\n            print(\"Error encountered:\", error)\n            break\n\n# Initialize GPU settings\nsetup_memory_growth_for_gpus()\n\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:46.557588Z","iopub.execute_input":"2023-09-19T20:11:46.557938Z","iopub.status.idle":"2023-09-19T20:11:46.580689Z","shell.execute_reply.started":"2023-09-19T20:11:46.557908Z","shell.execute_reply":"2023-09-19T20:11:46.579875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create a MirroredStrategy for two GPUs\nstrategy = tf.distribute.MirroredStrategy(devices=['/GPU:0', '/GPU:1'])\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:46.581841Z","iopub.execute_input":"2023-09-19T20:11:46.582163Z","iopub.status.idle":"2023-09-19T20:11:50.330936Z","shell.execute_reply.started":"2023-09-19T20:11:46.582136Z","shell.execute_reply":"2023-09-19T20:11:50.329848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    model = Sequential()\n\n    model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)))\n    model.add(BatchNormalization())\n\n    model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))\n    model.add(BatchNormalization())\n    model.add(MaxPool2D((2, 2)))\n    model.add(Dropout(0.2))\n\n    model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))\n    model.add(BatchNormalization())\n\n    model.add(Conv2D(64, (3, 3), activation='relu',padding='same'))\n    model.add(BatchNormalization())\n    model.add(MaxPool2D((2, 2)))\n    model.add(Dropout(0.3))\n\n    model.add(Conv2D(128, (3, 3), activation='relu',  padding='same'))\n    model.add(BatchNormalization())\n\n    model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))\n    model.add(BatchNormalization())\n    model.add(MaxPool2D((2, 2)))\n    model.add(Dropout(0.4))\n\n    model.add(Flatten())\n    model.add(Dense(128, activation='relu'))\n    model.add(BatchNormalization())\n    model.add(Dropout(0.5))\n    model.add(Dense(10, activation='softmax'))","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:50.332142Z","iopub.execute_input":"2023-09-19T20:11:50.332437Z","iopub.status.idle":"2023-09-19T20:11:50.747470Z","shell.execute_reply.started":"2023-09-19T20:11:50.332410Z","shell.execute_reply":"2023-09-19T20:11:50.746558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.optimizers import Adam\n\n# Define model compilation parameters\nloss_function = 'categorical_crossentropy'\noptimizer_choice = Adam()\nmetric_list = ['accuracy']\n\n# Compile the model\nmodel.compile(loss=loss_function, optimizer=optimizer_choice, metrics=metric_list)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:50.748594Z","iopub.execute_input":"2023-09-19T20:11:50.748897Z","iopub.status.idle":"2023-09-19T20:11:50.768287Z","shell.execute_reply.started":"2023-09-19T20:11:50.748871Z","shell.execute_reply":"2023-09-19T20:11:50.767456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Data Augementation\ntrain_datagen = ImageDataGenerator(rotation_range=10,horizontal_flip=True,width_shift_range=0.1,height_shift_range=0.1)\n\nvalid_datagen = ImageDataGenerator()\n\ntrain_generator = train_datagen.flow_from_directory(directory='/kaggle/temp/train/', shuffle=True, target_size=(32,32),batch_size=128)\n\nvalid_generator = valid_datagen.flow_from_directory(directory='/kaggle/temp/valid/', shuffle=True, target_size=(32,32),batch_size=128)","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:50.769307Z","iopub.execute_input":"2023-09-19T20:11:50.769676Z","iopub.status.idle":"2023-09-19T20:11:52.649506Z","shell.execute_reply.started":"2023-09-19T20:11:50.769623Z","shell.execute_reply":"2023-09-19T20:11:52.648494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Data Augmentation\ntrain_datagen = ImageDataGenerator(rotation_range=10, horizontal_flip=True, width_shift_range=0.1, height_shift_range=0.1)\nvalid_datagen = ImageDataGenerator()\n\ntrain_generator = train_datagen.flow_from_directory(directory='/kaggle/temp/train/', shuffle=True, target_size=(32,32), batch_size=128)\nvalid_generator = valid_datagen.flow_from_directory(directory='/kaggle/temp/valid/', shuffle=True, target_size=(32,32), batch_size=128)\n\n# Model definition (as an example)\nmodel = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),\n    MaxPooling2D(2, 2),\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dense(10, activation='softmax')  # Assuming 10 classes as an example\n])\n\n# Compile the model\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n\n# Train the model\nhistory = model.fit(train_generator, epochs=10, validation_data=valid_generator, verbose=1)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:11:52.650918Z","iopub.execute_input":"2023-09-19T20:11:52.651246Z","iopub.status.idle":"2023-09-19T20:18:36.930721Z","shell.execute_reply.started":"2023-09-19T20:11:52.651217Z","shell.execute_reply":"2023-09-19T20:18:36.929531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('Model.h5')\n","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:18:36.932236Z","iopub.execute_input":"2023-09-19T20:18:36.932569Z","iopub.status.idle":"2023-09-19T20:18:36.967547Z","shell.execute_reply.started":"2023-09-19T20:18:36.932539Z","shell.execute_reply":"2023-09-19T20:18:36.966679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.unpack_archive('/kaggle/input/cifar-10/test.7z','/kaggle/temp/test')\nshutil.unregister_unpack_format('7zip')","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:18:36.970741Z","iopub.execute_input":"2023-09-19T20:18:36.971056Z","iopub.status.idle":"2023-09-19T20:40:20.904019Z","shell.execute_reply.started":"2023-09-19T20:18:36.971027Z","shell.execute_reply":"2023-09-19T20:40:20.902878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\n\ntest_gen = test_datagen.flow_from_directory(directory='/kaggle/temp/test',target_size=(32,32),batch_size=64,class_mode=None,shuffle=False)\n\ntest_gen.reset()\npredictions_vecs = model.predict(test_gen)\npredictions_final = np.argmax(predictions_vecs, axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:40:20.905260Z","iopub.execute_input":"2023-09-19T20:40:20.905646Z","iopub.status.idle":"2023-09-19T20:42:29.761434Z","shell.execute_reply.started":"2023-09-19T20:40:20.905618Z","shell.execute_reply":"2023-09-19T20:42:29.759927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes = {value:key for (key,value) in train_generator.class_indices.items()}\nprint(classes)\n\npredicted_classes=np.empty(shape=300000,dtype=np.dtype('U20'))\n\nind=0\nfor i in predictions_final.tolist():\n    predicted_classes[ind]=classes[i]\n    ind=ind+1\n    \nfilenames_wo_ext = []\nfor fname in test_gen.filenames:\n    filenames_wo_ext.append(int(fname.split(sep=\"/\")[1].split(sep=\".\")[0])-1)\n\npredicted_classes_final = np.empty(shape=300000,dtype=np.dtype('U20'))\npredicted_classes_final[filenames_wo_ext]=predicted_classes","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:42:29.763170Z","iopub.execute_input":"2023-09-19T20:42:29.763522Z","iopub.status.idle":"2023-09-19T20:42:30.381368Z","shell.execute_reply.started":"2023-09-19T20:42:29.763493Z","shell.execute_reply":"2023-09-19T20:42:30.379925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv('../input/cifar-10/sampleSubmission.csv',header='infer')\nsubmission.info()\nsubmission['label'] = predicted_classes_final\nsubmission.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2023-09-19T20:42:30.382908Z","iopub.execute_input":"2023-09-19T20:42:30.383241Z","iopub.status.idle":"2023-09-19T20:42:31.027388Z","shell.execute_reply.started":"2023-09-19T20:42:30.383213Z","shell.execute_reply":"2023-09-19T20:42:31.025976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}