{"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 numpy as np\nimport os\nimport pandas as pd","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install py7zr","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from py7zr import unpack_7zarchive\nimport shutil\nshutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path = os.path.join(os.getcwd(), 'temp')\npath","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# extracting images from train and test files\nshutil.unpack_archive('../input/cifar-10/train.7z', path)\nshutil.unpack_archive('../input/cifar-10/test.7z', path)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# creating label folders for train and validation folders\nlabels = pd.read_csv('../input/cifar-10/trainLabels.csv')\nclasses = labels['label'].unique()\n\nparent_train = './temp/train'\nparent_valid = './temp/validation'\nparent_test = './temp/test'\nif not os.path.exists(parent_valid):\n    os.mkdir(parent_valid)\n\nfor clss in classes:\n    path_train = os.path.join(parent_train, clss)\n    if not os.path.exists(path_train):\n        os.mkdir(path_train)\n    \n    path_valid = os.path.join(parent_valid, clss)\n    if not os.path.exists(path_valid):\n        os.mkdir(path_valid)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# moving images from train folder to the proper label folders in the train and valid folders\nfor ind, row in labels.iterrows():\n    iid = str(row['id']) + '.png'\n    source = os.path.join(parent_train, iid)\n    \n    p = np.random.random()\n    if p <= 0.8:\n        target = os.path.join(parent_train, row['label'], iid)\n    else:\n        target = os.path.join(parent_valid, row['label'], iid)\n        \n    os.replace(source, target)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras\nfrom keras.callbacks import ReduceLROnPlateau, EarlyStopping\nfrom keras.preprocessing.image import ImageDataGenerator","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# creating model\nmodel = keras.models.Sequential()\nmodel.add(keras.Input(shape = (32, 32, 3)))\nmodel.add(keras.layers.Conv2D(filters = 32, kernel_size = (3,3)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (30, 30)\n\nmodel.add(keras.layers.Conv2D(filters = 48, kernel_size = (3,3)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (28, 28)\n\nmodel.add(keras.layers.Conv2D(filters = 64, kernel_size = (3,3)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (26, 26)\n\nmodel.add(keras.layers.Conv2D(filters = 80, kernel_size = (5,5)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (22, 22)\n\nmodel.add(keras.layers.Conv2D(filters = 96, kernel_size = (5,5)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (18, 18)\n\nmodel.add(keras.layers.Conv2D(filters = 128, kernel_size = (7,7)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (12, 12)\n\nmodel.add(keras.layers.Conv2D(filters = 144, kernel_size = (7,7)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (6, 6)\n\nmodel.add(keras.layers.Conv2D(filters = 160, kernel_size = (6,6)))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.relu))   # (1, 1)\n\nmodel.add(keras.layers.Flatten())\n\nmodel.add(keras.layers.Dense(64))\n\nmodel.add(keras.layers.Dense(10))\nmodel.add(keras.layers.BatchNormalization())\nmodel.add(keras.layers.Activation(keras.activations.softmax))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=keras.optimizers.Adam(),\n             loss = keras.losses.categorical_crossentropy, \n             metrics = ['accuracy'])\n\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# image data generator\ntraingen = ImageDataGenerator(\n                                rotation_range = 10, \n                                width_shift_range = 0.15, \n                                height_shift_range  = 0.15, \n                                zoom_range=0.2,\n                                rescale=1/255.0, \n                                horizontal_flip=True, \n                                vertical_flip=True,\n                             )\ntrainflow = traingen.flow_from_directory('./temp/train', target_size=(32, 32), batch_size=128)\n\nvalidgen = ImageDataGenerator(rescale = 1/255.0)\nvalidflow = validgen.flow_from_directory('./temp/validation', target_size=(32, 32), batch_size = 80)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# initializing callbacks\ncb1 = ReduceLROnPlateau(monitor = 'valid_acc', factor = 0.2, patience = 3, verbose = 1)\ncb2 = EarlyStopping(monitor = 'valid_acc', patience = 3, verbose = 1, restore_best_weights=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(trainflow, epochs = 300, validation_data=validflow, callbacks = [cb1, cb2], steps_per_epoch = trainflow.n//trainflow.batch_size,\n                    validation_steps = validflow.n//validflow.batch_size, use_multiprocessing=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testgen = ImageDataGenerator(rescale = 1/255.0)\ntestflow = testgen.flow_from_directory('./temp/', classes=['test'],shuffle = False, target_size = (32, 32), batch_size = 128)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred = np.argmax(model.predict(testflow), axis = 1)\npred = list(pred)\nclasses = {value:key for (key, value) in trainflow.class_indices.items()}\npredc = np.empty(300000, 'U16')\nidd = 0\nfor i in pred:\n    predc[idd] = classes[i]\n    idd += 1","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = []\nfor file in testflow.filenames:\n    files.append(int(file.split('/')[1].split('.')[0]) - 1)\nfiles = np.array(files)\n    \nfinal = np.empty(300000, dtype = 'U16')\nfinal[files] = predc","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('../input/cifar-10/sampleSubmission.csv')\nsub['label'] = final\nsub.to_csv('submission.csv', index = False)","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]}]}