{"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 pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline\nimport tensorflow as tf\nimport keras","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/digit-recognizer/train.csv')\ntest = pd.read_csv('../input/digit-recognizer/test.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# General Info About Data","metadata":{}},{"cell_type":"code","source":"len(train.columns)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['label'].unique()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The train data is comprised of images with 784 pixels and a 'target' column, which has 10 possible values (hand-written digits), each ranging from 0 to 9.","metadata":{}},{"cell_type":"code","source":"train.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Displaying Examples of Images","metadata":{}},{"cell_type":"code","source":"# reshape the first row of \"train\" into a 28 x 28 photo, excluding the \"label\" column\nnum1 = np.array(train.loc[0][1:]).reshape(28,28)\nprint(num1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# display the image in a heatmap\nsns.heatmap(data=num1,cmap=\"gray\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# display the next image in the train set using the same process as above\nnum2 = np.asarray(train.loc[1][1:]).reshape(28,28)\nsns.heatmap(num2,cmap=\"gray\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nptrain = np.array(train)\nplt.figure(figsize=(3,4))\nfor j in range(10):\n    for i in range(len(nptrain)):\n        if nptrain[i][0] == j:\n            plt.subplot(3,4,j+1)\n            plt.imshow(nptrain[i][1:].reshape(28,28), interpolation='nearest')\n            plt.title(j)\n            break\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Examining Distributions of Categories in Train Data","metadata":{}},{"cell_type":"code","source":"# create a countplot of the amount of times each number, or label, appears in the data\nsns.countplot(x=train[\"label\"],data=train,palette=\"magma\")\nplt.title(\"Distribution of Numbers\")\nplt.xlabel(\"Image Number\")\nplt.ylabel(\"Count\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Augmentation","metadata":{}},{"cell_type":"code","source":"# Load data\ny = train[\"label\"]\nx = train.drop(labels = [\"label\"], axis = 1) \n\n# Reshape data\nx = x.values.reshape(-1, 28, 28, 1)\ntest = test.values.reshape(-1, 28, 28, 1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# Prepare training/validation sets\nx_training, x_validation, y_training, y_validation = train_test_split(x,\n                                                                      y,\n                                                                      test_size=0.2,\n                                                                      shuffle=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_training.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\n# Data augmentation\ndata_generator = ImageDataGenerator(rescale=1./255,\n                                    rotation_range=10,\n                                    zoom_range=0.5, \n                                    width_shift_range=0.1,\n                                    height_shift_range=0.1)\ndata_generator.fit(x_training)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"it = data_generator.flow(x_training)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_training.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.utils import to_categorical\ny_training = to_categorical(y_training)\ny_validation = to_categorical(y_validation)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\nfrom keras.models import Sequential, Input, Model\nfrom keras.layers import Dense, Dropout, Flatten\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.layers.advanced_activations import LeakyReLU","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\nepochs = 20\nnum_classes = 10","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(32, kernel_size=(3,3),activation='linear', input_shape=(28,28,1),padding = 'same'))\nmodel.add(LeakyReLU(alpha=0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D((2,2),padding='same'))\nmodel.add(Conv2D(64, (3,3),activation='linear',padding = 'same'))\nmodel.add(LeakyReLU(alpha=0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2),padding='same'))\nmodel.add(Conv2D(128, (3,3),activation='linear',padding = 'same'))\nmodel.add(LeakyReLU(alpha=0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2),padding='same'))\nmodel.add(Conv2D(128, (3,3),activation='linear',padding = 'same'))\nmodel.add(LeakyReLU(alpha=0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2),padding='same'))\nmodel.add(Conv2D(128, (3,3),activation='linear',padding = 'same'))\nmodel.add(LeakyReLU(alpha=0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2),padding='same'))\nmodel.add(Conv2D(128, (3,3),activation='linear',padding = 'same'))\nmodel.add(LeakyReLU(alpha=0.2))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2),padding='same'))\nmodel.add(Flatten())\nmodel.add(Dense(128,activation='linear'))\nmodel.add(LeakyReLU(alpha=0.2))\nmodel.add(Dense(num_classes,activation='softmax'))\nmodel.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adam(), metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#from keras.callbacks import EarlyStopping\n#es = EarlyStopping(monitor='loss', mode='min', verbose=1, patience=8, min_delta=0.0001) calbacks = [es]\nfit_model = model.fit(x_training,y_training,batch_size=batch_size, epochs=epochs,verbose=1,validation_data=(x_validation,y_validation))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results = model.predict(test)\nresults = np.argmax(results,axis = 1)\nresults = pd.Series(results,name=\"Label\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),results],axis = 1)\nsubmission.to_csv(\"cnn_baseline.csv\",index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}