{"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":"markdown","source":"# import libraries","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport pandas as pd\nimport numpy as np\nfrom tensorflow import keras\nfrom tensorflow.keras import layers, callbacks\nfrom sklearn.model_selection import train_test_split","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# loading the data\nthe data is loaded from the input folder using pandas' `read_csv`.\n`train_test_split` from sklearn is then used to split the data into train and validation sets, and later transformed into numpy arrays to easily reshape.\nas the pixels come in grayscale with values varying from 0 to 255, we normalize the data with a simple division, so the model can understand the data easily.","metadata":{}},{"cell_type":"code","source":"mnist = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(mnist.drop('label', axis = 1), mnist.label, test_size=7000)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X_train.to_numpy().reshape((X_train.shape[0], 28, 28, 1))/255\nX_test = X_test.to_numpy().reshape((X_test.shape[0], 28, 28, 1))/255","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# model description\nthe model uses the following layers:\n* 2 convolutional blocks (with two `Conv2D` followed by a `MaxPooling2D` and a `Dropout` layer)\n* flatten layer\n* classifier block (two `Dense` layers with *relu* activaiton followed by a `Dense` layer with *softmax* activation for categorical classification","metadata":{}},{"cell_type":"code","source":"model = keras.Sequential([\n    layers.Conv2D(filters=32, kernel_size=3, strides=(1, 1), padding='same', activation='relu', input_shape = (28, 28, 1)),\n    layers.Conv2D(filters=32, kernel_size=3, strides=(1, 1), padding='same', activation='relu'),\n    layers.MaxPooling2D(pool_size=(2, 2)),\n    layers.Dropout(0.25),\n    layers.Conv2D(filters=64, kernel_size=3, strides=(1, 1), padding='same', activation='relu', input_shape = (28, 28, 1)),\n    layers.Conv2D(filters=64, kernel_size=3, strides=(1, 1), padding='same', activation='relu'),\n    layers.MaxPooling2D(pool_size=(2, 2)),\n    layers.Dropout(0.25),\n    layers.Flatten(),\n    layers.Dense(256,activation='relu'),\n    layers.Dense(32,activation='relu'),\n    layers.Dense(10,activation='sigmoid')\n])\n\nmodel.compile(optimizer='adam',\n              loss='sparse_categorical_crossentropy',\n              metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    X_train, y_train,\n    batch_size=256,\n    validation_data=(X_test, y_test),\n    epochs=20,\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# output","metadata":{}},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)\nhistory_df.loc[1:, ['loss', 'val_loss']].plot();\nprint(\"Minimum validation loss: {}\".format(history_df['val_loss'].min()))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mnist_test = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")\nmnist_test = mnist_test.to_numpy().reshape((mnist_test.shape[0], 28, 28, 1))/255","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction = model.predict(mnist_test)\n\nlabels = [np.argmax(x) for x in prediction]\nImageId = [x+1 for x in range(len(prediction))]\n\nsubmission = pd.DataFrame({'ImageId': ImageId,\n                          'Label' : labels}, index = None)\nsubmission.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}