{"cells":[{"metadata":{},"cell_type":"markdown","source":"Hello, \n\nI thought to try something new, as in a new library that some lovely people I know put together. You can find more info [here](http://medium.com/dataseries/localized-computation-3e1edad63000).\n\nNow let's have a quick ride:"},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"pip install larq","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nimport larq as lq ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"x_train = (train.iloc[:,1:].values).astype('float32') # all pixel values\ny_train = train.iloc[:,0].values.astype('int32') # only labels i.e targets digits","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"# you can on hot encode or us it as it is, only change the loss to sparse_categorical_crossentropy\nfrom keras.utils.np_utils import to_categorical\ny_train = to_categorical(y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"# don't forget test set\ntest = test.values.astype('float32')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"train_images, test_images, train_labels, test_labels = train_test_split(\n                    x_train, y_train, \n                    test_size=0.33, random_state=42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"print(train_images.shape)\nprint(test_images.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"train_images = train_images.reshape((28140, 28, 28, 1))  \ntest_images = test_images.reshape((13860, 28, 28, 1)) \n\ntest = test.reshape((28000, 28, 28, 1))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"# Normalize pixel values to be between -1 and 1\ntrain_images, test_images = train_images / 127.5 - 1, test_images / 127.5 - 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"kwargs = dict(input_quantizer=\"ste_sign\", kernel_quantizer=\"ste_sign\", kernel_constraint=\"weight_clip\")\n\nmodel = tf.keras.models.Sequential()\n\nmodel.add(lq.layers.QuantConv2D(32, (3, 3), kernel_quantizer=\"ste_sign\", \n                                kernel_constraint=\"weight_clip\", use_bias=False, \n                                input_shape=(28, 28, 1)))\nmodel.add(tf.keras.layers.MaxPooling2D((2, 2)))\nmodel.add(tf.keras.layers.BatchNormalization(scale=False))\n\nmodel.add(lq.layers.QuantConv2D(64, (3, 3), use_bias=False, **kwargs))\nmodel.add(tf.keras.layers.MaxPooling2D((2, 2)))\nmodel.add(tf.keras.layers.BatchNormalization(scale=False))\n\nmodel.add(lq.layers.QuantConv2D(64, (3, 3), use_bias=False, **kwargs))\nmodel.add(tf.keras.layers.BatchNormalization(scale=False))\nmodel.add(tf.keras.layers.Flatten())\n\nmodel.add(lq.layers.QuantDense(64, use_bias=False, **kwargs))\nmodel.add(tf.keras.layers.BatchNormalization(scale=False))\nmodel.add(lq.layers.QuantDense(10, use_bias=False, **kwargs))\nmodel.add(tf.keras.layers.BatchNormalization(scale=False))\nmodel.add(tf.keras.layers.Activation(\"softmax\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"# always nice to have a look at this lovely model\nlq.models.summary(model)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"model.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\nsparse_categorical_crossentropy is the loss function for integer labels\n\nh = model.fit(train_images, train_labels, batch_size=64, epochs=6)\n\ntest_loss, test_acc = model.evaluate(test_images, test_labels)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Epoch 1/6\n28140/28140 [==============================] - 41s 1ms/step - loss: 0.7582 - acc: 0.8733\nEpoch 2/6\n28140/28140 [==============================] - 39s 1ms/step - loss: 0.5240 - acc: 0.9502\nEpoch 3/6\n28140/28140 [==============================] - 40s 1ms/step - loss: 0.4837 - acc: 0.9603\nEpoch 4/6\n28140/28140 [==============================] - 36s 1ms/step - loss: 0.4613 - acc: 0.9644\nEpoch 5/6\n28140/28140 [==============================] - 37s 1ms/step - loss: 0.4494 - acc: 0.9682\nEpoch 6/6\n28140/28140 [==============================] - 36s 1ms/step - loss: 0.4420 - acc: 0.9709\n13860/13860 [==============================] - 5s 343us/step"},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"print(f\"Test accuracy {test_acc * 100:.2f} %\")\nprint(f\"Test loss {test_loss}\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Test accuracy 97.80 %\nTest loss 0.405355900223293"},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"pd.DataFrame(h.history).plot()\n# and as an ending, I'll let you plot the accuracy and loss changes per epoch ;) \n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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":1}