{"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 csv\nimport pandas as pd\nimport numpy as np\nimport random\nimport tensorflow as tf\nfrom tensorflow.keras.optimizers import RMSprop\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-11-12T17:19:29.970335Z","iopub.execute_input":"2021-11-12T17:19:29.970742Z","iopub.status.idle":"2021-11-12T17:19:34.807677Z","shell.execute_reply.started":"2021-11-12T17:19:29.970635Z","shell.execute_reply":"2021-11-12T17:19:34.806936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_data(filename):\n    with open(filename) as training_file:\n        \n        lines = training_file.readlines()[1:]\n        random.shuffle(lines)\n        \n        labelslist = []\n        imageslist = []\n        \n        for line in lines:\n            \n            row = line.split(\",\")\n            \n            labelslist.append(row[0])\n            \n            image = np.array(row[1:]).astype(np.float32)\n            imageslist.append( np.array_split(image, 28) )\n        \n        split_point = int(len(lines) * 0.9)\n        \n        train_labelslist = labelslist[:split_point]\n        val_labelslist = labelslist[split_point:]\n        \n        train_imageslist = imageslist[:split_point]\n        val_imageslist = imageslist[split_point:]\n        \n        train_labels = np.array(train_labelslist).astype(np.float32)\n        val_labels = np.array(val_labelslist).astype(np.float32)\n        \n        train_images = np.array(train_imageslist, dtype=object)\n        val_images = np.array(val_imageslist, dtype=object)\n        \n    return train_labels, train_images, val_labels, val_images\n\ntraining_labels, training_images, validation_labels, validation_images = get_data('../input/digit-recognizer/train.csv')\n\ntraining_images = np.expand_dims(training_images, axis=3)\nvalidation_images = np.expand_dims(validation_images, axis=3)\n\nprint(training_labels.shape)\nprint(training_images.shape)\nprint(validation_labels.shape)\nprint(validation_images.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:19:34.809408Z","iopub.execute_input":"2021-11-12T17:19:34.809664Z","iopub.status.idle":"2021-11-12T17:20:06.977132Z","shell.execute_reply.started":"2021-11-12T17:19:34.809630Z","shell.execute_reply":"2021-11-12T17:20:06.975549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n                          rescale = 1./255,\n                          rotation_range=60,\n                          width_shift_range=0.1,\n                          height_shift_range=0.1,\n                          shear_range=0.2,\n                          zoom_range=0.2,\n                          fill_mode='nearest')\n\nvalidation_datagen = ImageDataGenerator(rescale = 1./255)\n\ntrain_generator = train_datagen.flow(training_images,\n                                    training_labels,\n                                    batch_size=200)\n\nvalidation_generator = validation_datagen.flow(validation_images,\n                                            validation_labels,\n                                            batch_size=200)","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:20:06.978273Z","iopub.execute_input":"2021-11-12T17:20:06.978686Z","iopub.status.idle":"2021-11-12T17:20:08.507892Z","shell.execute_reply.started":"2021-11-12T17:20:06.978642Z","shell.execute_reply":"2021-11-12T17:20:08.507080Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class myCb(tf.keras.callbacks.Callback):\n    def on_epoch_end(self, epoch, logs={}):\n        if logs.get(\"val_accuracy\") >= 0.992:\n            print(\"Reached 99.2% accuracy so cancelling training!\")\n            self.model.stop_training = True\ncallbacks = myCb()","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:20:08.511137Z","iopub.execute_input":"2021-11-12T17:20:08.511374Z","iopub.status.idle":"2021-11-12T17:20:08.517135Z","shell.execute_reply.started":"2021-11-12T17:20:08.511348Z","shell.execute_reply":"2021-11-12T17:20:08.515649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),\n    tf.keras.layers.MaxPooling2D(2, 2),\n    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dropout(0.4),\n    tf.keras.layers.Dense(256, activation='relu'),\n    tf.keras.layers.Dense(10, activation='softmax')\n])\n\nmodel.compile(loss = 'sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n\nhistory = model.fit(train_generator, epochs=50, steps_per_epoch=189, validation_data = validation_generator, verbose = 1, validation_steps=21, callbacks=[callbacks])","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:20:08.518250Z","iopub.execute_input":"2021-11-12T17:20:08.518903Z","iopub.status.idle":"2021-11-12T17:23:06.563234Z","shell.execute_reply.started":"2021-11-12T17:20:08.518867Z","shell.execute_reply":"2021-11-12T17:23:06.561856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(validation_generator, verbose=1)","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:23:06.564318Z","iopub.status.idle":"2021-11-12T17:23:06.565239Z","shell.execute_reply.started":"2021-11-12T17:23:06.564987Z","shell.execute_reply":"2021-11-12T17:23:06.565013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nacc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs = range(len(acc))\n\nplt.plot(epochs, acc, 'r', label='Training accuracy')\nplt.plot(epochs, val_acc, 'b', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.figure()\n\nplt.plot(epochs, loss, 'r', label='Training Loss')\nplt.plot(epochs, val_loss, 'b', label='Validation Loss')\nplt.title('Training and validation loss')\nplt.legend()\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:23:06.566334Z","iopub.status.idle":"2021-11-12T17:23:06.567132Z","shell.execute_reply.started":"2021-11-12T17:23:06.566869Z","shell.execute_reply":"2021-11-12T17:23:06.566894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prep_test_data(filename):\n    with open(filename) as training_file:\n        \n        lines = training_file.readlines()[1:]\n        \n        imageslist = []\n        \n        for line in lines:\n            row = line.split(\",\")\n            image = np.array(row).astype(np.float32)\n            imageslist.append( np.array_split(image, 28) )\n        \n        test_images = np.array(imageslist, dtype=object)\n        \n    return test_images\n\ntest_images = prep_test_data('../input/digit-recognizer/test.csv')\n\ntest_images = np.expand_dims(test_images, axis=3)\n\nprint(test_images.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:23:06.568301Z","iopub.status.idle":"2021-11-12T17:23:06.569163Z","shell.execute_reply.started":"2021-11-12T17:23:06.568903Z","shell.execute_reply":"2021-11-12T17:23:06.568929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale = 1./255)\n\ntest_generator = test_datagen.flow(test_images, shuffle=False)\n\ntest_preds = model.predict(test_generator)\n\ntest_preds_classes = np.argmax(test_preds,axis = 1) ","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:23:06.570240Z","iopub.status.idle":"2021-11-12T17:23:06.571017Z","shell.execute_reply.started":"2021-11-12T17:23:06.570763Z","shell.execute_reply":"2021-11-12T17:23:06.570790Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({'ImageId': range(1,28001), 'Label': test_preds_classes})\nsubmission.to_csv('submission.csv', index=False)\nprint(\"Your submission was successfully saved!\")","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:23:06.572155Z","iopub.status.idle":"2021-11-12T17:23:06.572983Z","shell.execute_reply.started":"2021-11-12T17:23:06.572729Z","shell.execute_reply":"2021-11-12T17:23:06.572754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2021-11-12T17:23:06.574006Z","iopub.status.idle":"2021-11-12T17:23:06.574865Z","shell.execute_reply.started":"2021-11-12T17:23:06.574616Z","shell.execute_reply":"2021-11-12T17:23:06.574641Z"},"trusted":true},"execution_count":null,"outputs":[]}]}