{"cells":[{"metadata":{"trusted":false},"cell_type":"code","source":"import pandas as pd\nfrom tensorflow.keras import layers\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom sklearn.model_selection import train_test_split\n#from tensorflow.keras.Im\nimport random\nfrom tensorflow.keras.layers import Activation\nfrom tensorflow.keras.utils import get_custom_objects","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"class Mish(Activation):\n    '''\n    Mish Activation Function.\n    .. math::\n        mish(x) = x * tanh(softplus(x)) = x * tanh(ln(1 + e^{x}))\n    Shape:\n        - Input: Arbitrary. Use the keyword argument `input_shape`\n        (tuple of integers, does not include the samples axis)\n        when using this layer as the first layer in a model.\n        - Output: Same shape as the input.\n    Examples:\n        >>> X = Activation('Mish', name=\"conv1_act\")(X_input)\n    '''\n\n    def __init__(self, activation, **kwargs):\n        super(Mish, self).__init__(activation, **kwargs)\n        self.__name__ = 'Mish'\n\n\ndef mish(inputs):\n    return inputs * tf.math.tanh(tf.math.softplus(inputs))\n\nget_custom_objects().update({'Mish': Mish(mish)})\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#-----------------  DATA READING  -------------------------","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"trainData = pd.read_csv('digit-recognizer/train.csv')\ntestData = pd.read_csv('digit-recognizer/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"trainArray = trainData.to_numpy()[:,1:]\ntestArray = testData.to_numpy()\nlabels = trainData.to_numpy()[:,0]\nprint(\"shapes :\", trainArray.shape , testArray.shape , labels.shape)\nprint(\"         train       test\")\nprint(\"images   {}          {}\".format(trainArray.shape[0],testArray.shape[0]))\n#print(\"labels   {}          {}\".format(trainLabels.shape[0],testLabels.shape[0]))","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":false},"cell_type":"code","source":"plt.figure(figsize=(100, 100))\nc=0\nfor i in range(0,10):\n    #for j in range(0,10):\n    plt.subplot(10, 1, c+1)\n    #print(i+j)\n    plt.title(labels[i])\n    plt.imshow(np.reshape(trainArray[i],(28,28)))\n    plt.axis('off')\n    c+=1\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#-------------------Generator for xtrain  -------------------------\ntrainDatagen = tf.keras.preprocessing.image.ImageDataGenerator(width_shift_range=0.0,\n                                                               height_shift_range=0.0,\n                                                               brightness_range=None,\n                                                               shear_range=0.0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"train_norm = np.expand_dims(trainArray.astype('float32'),axis=-1)\ntrain_norm = train_norm.reshape((42000,28,28))\nxtrain , xtest , ytrain , ytest = train_test_split(train_norm , trainLabels ,test_size=0.33, random_state=42)  ","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"x_train = np.expand_dims(xtrain,axis=-1)\nx_train.shape , xtest.shape , ytrain.shape , ytest.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#===========================================================================================","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#------------------  Model Buidling -----------------------------","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"def build():\n    input_layer = layers.Input(shape = (28,28,1))\n    x = layers.Conv2D(48,(3) , activation = 'Mish',padding='same')(input_layer)\n    x = layers.BatchNormalization()(x)\n    x = layers.Conv2D(32,(3) , activation = 'Mish',padding='same')(x)\n    x = layers.BatchNormalization()(x)\n    x = layers.Conv2D(16,(3) , activation = 'Mish',padding='same')(x)\n    x = layers.BatchNormalization()(x)\n    \n    #x = layers.MaxPool2D(2)(x)\n    \n    x = layers.Flatten()(x)\n    #x = layers.LSTM(64, activation = 'relu' )(x)\n\n    x = layers.Dense(64, activation = 'relu' )(x)\n    x = layers.Dropout(0.3)(x)\n    x = layers.Dense(64, activation = 'relu' )(x)\n    x = layers.Dropout(0.3)(x)\n    x = layers.Dense(10,activation='softmax' )(x)\n    \n    return tf.keras.models.Model(inputs = input_layer , outputs = x )","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"model = build()\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"model.compile(optimizer='adam',loss =tf.keras.losses.SparseCategoricalCrossentropy(),metrics=['accuracy'])\nhistory = model.fit_generator(trainDatagen.flow(x_train , ytrain ,batch_size=64),\n                              validation_data=(xtest,ytest),epochs=5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"test_norm = (testData.to_numpy().astype('float32')).reshape((28000,28,28))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"test_norm = np.expand_dims(test_norm,axis=-1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"i = random.choice(range(test_norm.shape[0]))\npreds = model.predict(np.expand_dims(test_norm[i],axis=0))\nprint(preds)\npos = np.argmax(preds)\nconf = preds[0,pos]*100\nplt.title((pos ,conf))\nplt.axis(\"OFF\")\nplt.imshow(test_norm[i][:,:,0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#---------------------------- Model Testing and Saving --------------------------","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"preds = model.predict(test_norm)\npreds_labels = np.argmax(preds,axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"data = []\nfor (i,label) in enumerate(preds_labels):\n    data.append([i+1,label])\nsub = pd.DataFrame(data,columns=['ImageId', 'Label'])\nsub.to_csv(\"submission.csv\",index=False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}