{"cells":[{"metadata":{},"cell_type":"markdown","source":"This is my first competetion. I want to make my model simple."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":1,"outputs":[{"output_type":"stream","text":"['sample_submission.csv', 'test.csv', 'train.csv']\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Let's borrow some code from Kaggle Learn to prepare the data"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom tensorflow.python import keras\nfrom tensorflow.python.keras.models import Sequential\nfrom tensorflow.python.keras.layers import Dense, Flatten, Conv2D, Dropout\n\nimg_rows, img_cols = 28, 28\nnum_classes = 10\n\ndef data_prep(raw):\n    out_y = keras.utils.to_categorical(raw.label, num_classes)\n\n    num_images = raw.shape[0]\n    x_as_array = raw.values[:,1:]\n    x_shaped_array = x_as_array.reshape(num_images, img_rows, img_cols, 1)\n\n    out_x = x_shaped_array / 255\n    return out_x, out_y\n\ntrain_file = \"../input/train.csv\"\nraw_data = pd.read_csv(train_file)\n\nx, y = data_prep(raw_data)\n\n","execution_count":2,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"> Look at the first (or other) image"},{"metadata":{"trusted":true},"cell_type":"code","source":"from PIL import Image\nfrom matplotlib.pyplot import imshow\n\ndef generate_image(raw):\n    showing = np.zeros((img_rows, img_cols))\n    for r in range(0, len(raw)):\n        for c in range(0, len(raw[r])):\n            showing[r][c] = raw[r][c][0]\n    return Image.fromarray(showing)\n\nimg = generate_image(x[0])\nimshow(img)\n","execution_count":3,"outputs":[{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"<matplotlib.image.AxesImage at 0x7f560581a828>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"Looks good. Let's create a CNN model."},{"metadata":{"trusted":true},"cell_type":"code","source":"digit_model = Sequential([\n    Conv2D(filters=32, kernel_size=(5,5), activation=\"relu\", input_shape=(img_rows, img_rows, 1)),\n    Conv2D(filters=32, kernel_size=(5,5), activation=\"relu\"),\n    Conv2D(filters=32, kernel_size=(5,5), activation=\"relu\", strides=2),\n    Dropout(0.25),\n    Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n    Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\"),\n    Conv2D(filters=64, kernel_size=(3,3), activation=\"relu\", strides=2),\n    Dropout(0.25),\n    Flatten(),\n    Dense(256, activation=\"relu\"),\n    Dropout(0.5),\n    Dense(num_classes, activation=\"softmax\")\n])","execution_count":4,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nColocations handled automatically by placer.\nWARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/keras/layers/core.py:143: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\nInstructions for updating:\nPlease use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Compile it!"},{"metadata":{"trusted":true},"cell_type":"code","source":"digit_model.compile(loss=keras.losses.categorical_crossentropy,\n              optimizer='adam',\n              metrics=['accuracy'])","execution_count":5,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Let's fit!"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split\n\nvalidation_split = 0.1\nepochs = 50\nbatch_size = 512\n\n#Prepare for some basic data augmentation\ntrain_x, val_x, train_y, val_y = train_test_split(x, y, test_size=validation_split, stratify=y)\n\ndata_generator_with_aug = ImageDataGenerator(width_shift_range=0.1,\n                                             height_shift_range=0.1,\n                                             zoom_range = 0.1,\n                                             rotation_range=10,\n                                             validation_split=validation_split)\n\ndata_generator_no_aug = ImageDataGenerator(validation_split=validation_split)\n\ntrain_generator = data_generator_with_aug.flow(\n    train_x, train_y,\n    batch_size=batch_size,\n    subset='training')\n\nvalidation_generator = data_generator_no_aug.flow(\n    val_x, val_y,\n    subset='validation') \n\ntraining_history = digit_model.fit_generator(train_generator,\n                                             steps_per_epoch=len(train_x) / batch_size,\n                                             validation_data=validation_generator,\n                                             epochs=epochs)\n\n# No Augmentation \n# training_history = digit_model.fit(x, y,\n#           batch_size=batch_size,\n#           epochs=epochs,\n#           validation_split = validation_split)","execution_count":6,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nUse tf.cast instead.\nEpoch 1/50\n14/14 [==============================] - 0s 16ms/step - loss: 0.5128 - acc: 0.8238\n67/67 [==============================] - 7s 106ms/step - loss: 1.6220 - acc: 0.4327 - val_loss: 0.5128 - val_acc: 0.8238\nEpoch 2/50\n14/14 [==============================] - 0s 6ms/step - loss: 0.1778 - acc: 0.9476\n67/67 [==============================] - 6s 92ms/step - loss: 0.7145 - acc: 0.7738 - val_loss: 0.1778 - val_acc: 0.9476\nEpoch 3/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.1342 - acc: 0.9524\n67/67 [==============================] - 6s 93ms/step - loss: 0.4153 - acc: 0.8751 - val_loss: 0.1342 - val_acc: 0.9524\nEpoch 4/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.1378 - acc: 0.9500\n67/67 [==============================] - 6s 93ms/step - loss: 0.3081 - acc: 0.9115 - val_loss: 0.1378 - val_acc: 0.9500\nEpoch 5/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0903 - acc: 0.9619\n67/67 [==============================] - 6s 93ms/step - loss: 0.2510 - acc: 0.9275 - val_loss: 0.0903 - val_acc: 0.9619\nEpoch 6/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0639 - acc: 0.9714\n67/67 [==============================] - 6s 93ms/step - loss: 0.2073 - acc: 0.9421 - val_loss: 0.0639 - val_acc: 0.9714\nEpoch 7/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0385 - acc: 0.9905\n67/67 [==============================] - 6s 94ms/step - loss: 0.1852 - acc: 0.9481 - val_loss: 0.0385 - val_acc: 0.9905\nEpoch 8/50\n14/14 [==============================] - 0s 6ms/step - loss: 0.0460 - acc: 0.9857\n67/67 [==============================] - 7s 98ms/step - loss: 0.1609 - acc: 0.9560 - val_loss: 0.0460 - val_acc: 0.9857\nEpoch 9/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0380 - acc: 0.9905\n67/67 [==============================] - 7s 109ms/step - loss: 0.1522 - acc: 0.9581 - val_loss: 0.0380 - val_acc: 0.9905\nEpoch 10/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0387 - acc: 0.9857\n67/67 [==============================] - 7s 103ms/step - loss: 0.1403 - acc: 0.9609 - val_loss: 0.0387 - val_acc: 0.9857\nEpoch 11/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0254 - acc: 0.9881\n67/67 [==============================] - 7s 97ms/step - loss: 0.1229 - acc: 0.9653 - val_loss: 0.0254 - val_acc: 0.9881\nEpoch 12/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0315 - acc: 0.9881\n67/67 [==============================] - 6s 93ms/step - loss: 0.1114 - acc: 0.9679 - val_loss: 0.0315 - val_acc: 0.9881\nEpoch 13/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0232 - acc: 0.9929\n67/67 [==============================] - 7s 103ms/step - loss: 0.1086 - acc: 0.9698 - val_loss: 0.0232 - val_acc: 0.9929\nEpoch 14/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0160 - acc: 0.9929\n67/67 [==============================] - 8s 113ms/step - loss: 0.0987 - acc: 0.9714 - val_loss: 0.0160 - val_acc: 0.9929\nEpoch 15/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0218 - acc: 0.9952\n67/67 [==============================] - 6s 93ms/step - loss: 0.0966 - acc: 0.9731 - val_loss: 0.0218 - val_acc: 0.9952\nEpoch 16/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0138 - acc: 0.9952\n67/67 [==============================] - 6s 93ms/step - loss: 0.0944 - acc: 0.9735 - val_loss: 0.0138 - val_acc: 0.9952\nEpoch 17/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0101 - acc: 0.9952\n67/67 [==============================] - 6s 93ms/step - loss: 0.0897 - acc: 0.9754 - val_loss: 0.0101 - val_acc: 0.9952\nEpoch 18/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0081 - acc: 0.9976\n67/67 [==============================] - 6s 94ms/step - loss: 0.0880 - acc: 0.9752 - val_loss: 0.0081 - val_acc: 0.9976\nEpoch 19/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0108 - acc: 0.9976\n67/67 [==============================] - 6s 94ms/step - loss: 0.0821 - acc: 0.9775 - val_loss: 0.0108 - val_acc: 0.9976\nEpoch 20/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0252 - acc: 0.9881\n67/67 [==============================] - 6s 95ms/step - loss: 0.0805 - acc: 0.9785 - val_loss: 0.0252 - val_acc: 0.9881\nEpoch 21/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0204 - acc: 0.9905\n67/67 [==============================] - 7s 109ms/step - loss: 0.0734 - acc: 0.9799 - val_loss: 0.0204 - val_acc: 0.9905\nEpoch 22/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0493 - acc: 0.9857\n67/67 [==============================] - 6s 97ms/step - loss: 0.0767 - acc: 0.9788 - val_loss: 0.0493 - val_acc: 0.9857\nEpoch 23/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0182 - acc: 0.9929\n67/67 [==============================] - 6s 94ms/step - loss: 0.0731 - acc: 0.9798 - val_loss: 0.0182 - val_acc: 0.9929\nEpoch 24/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0114 - acc: 0.9976\n67/67 [==============================] - 6s 92ms/step - loss: 0.0662 - acc: 0.9811 - val_loss: 0.0114 - val_acc: 0.9976\nEpoch 25/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0416 - acc: 0.9881\n67/67 [==============================] - 6s 94ms/step - loss: 0.0705 - acc: 0.9804 - val_loss: 0.0416 - val_acc: 0.9881\nEpoch 26/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0087 - acc: 0.9976\n67/67 [==============================] - 6s 92ms/step - loss: 0.0670 - acc: 0.9821 - val_loss: 0.0087 - val_acc: 0.9976\nEpoch 27/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0149 - acc: 0.9952\n67/67 [==============================] - 6s 93ms/step - loss: 0.0630 - acc: 0.9819 - val_loss: 0.0149 - val_acc: 0.9952\nEpoch 28/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0140 - acc: 0.9952\n67/67 [==============================] - 6s 93ms/step - loss: 0.0617 - acc: 0.9835 - val_loss: 0.0140 - val_acc: 0.9952\nEpoch 29/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0111 - acc: 0.9976\n67/67 [==============================] - 6s 94ms/step - loss: 0.0562 - acc: 0.9852 - val_loss: 0.0111 - val_acc: 0.9976\nEpoch 30/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0463 - acc: 0.9833\n67/67 [==============================] - 6s 93ms/step - loss: 0.0612 - acc: 0.9833 - val_loss: 0.0463 - val_acc: 0.9833\nEpoch 31/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0391 - acc: 0.9881\n67/67 [==============================] - 6s 93ms/step - loss: 0.0562 - acc: 0.9847 - val_loss: 0.0391 - val_acc: 0.9881\nEpoch 32/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0203 - acc: 0.9952\n67/67 [==============================] - 6s 93ms/step - loss: 0.0630 - acc: 0.9829 - val_loss: 0.0203 - val_acc: 0.9952\nEpoch 33/50\n14/14 [==============================] - 0s 6ms/step - loss: 0.0199 - acc: 0.9929\n67/67 [==============================] - 7s 100ms/step - loss: 0.0549 - acc: 0.9854 - val_loss: 0.0199 - val_acc: 0.9929\nEpoch 34/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0179 - acc: 0.9952\n67/67 [==============================] - 7s 108ms/step - loss: 0.0551 - acc: 0.9846 - val_loss: 0.0179 - val_acc: 0.9952\nEpoch 35/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0296 - acc: 0.9881\n67/67 [==============================] - 6s 94ms/step - loss: 0.0542 - acc: 0.9856 - val_loss: 0.0296 - val_acc: 0.9881\nEpoch 36/50\n14/14 [==============================] - 0s 6ms/step - loss: 0.0418 - acc: 0.9881\n67/67 [==============================] - 6s 94ms/step - loss: 0.0527 - acc: 0.9856 - val_loss: 0.0418 - val_acc: 0.9881\nEpoch 37/50\n14/14 [==============================] - 0s 4ms/step - loss: 0.0320 - acc: 0.9881\n67/67 [==============================] - 6s 93ms/step - loss: 0.0526 - acc: 0.9857 - val_loss: 0.0320 - val_acc: 0.9881\nEpoch 38/50\n","name":"stdout"},{"output_type":"stream","text":"14/14 [==============================] - 0s 3ms/step - loss: 0.0223 - acc: 0.9857\n67/67 [==============================] - 6s 94ms/step - loss: 0.0508 - acc: 0.9852 - val_loss: 0.0223 - val_acc: 0.9857\nEpoch 39/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0142 - acc: 0.9952\n67/67 [==============================] - 6s 94ms/step - loss: 0.0512 - acc: 0.9858 - val_loss: 0.0142 - val_acc: 0.9952\nEpoch 40/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0130 - acc: 0.9952\n67/67 [==============================] - 6s 94ms/step - loss: 0.0484 - acc: 0.9872 - val_loss: 0.0130 - val_acc: 0.9952\nEpoch 41/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0098 - acc: 0.9976\n67/67 [==============================] - 6s 94ms/step - loss: 0.0486 - acc: 0.9867 - val_loss: 0.0098 - val_acc: 0.9976\nEpoch 42/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0561 - acc: 0.9833\n67/67 [==============================] - 6s 94ms/step - loss: 0.0478 - acc: 0.9873 - val_loss: 0.0561 - val_acc: 0.9833\nEpoch 43/50\n14/14 [==============================] - 0s 6ms/step - loss: 0.0205 - acc: 0.9929\n67/67 [==============================] - 6s 94ms/step - loss: 0.0473 - acc: 0.9859 - val_loss: 0.0205 - val_acc: 0.9929\nEpoch 44/50\n14/14 [==============================] - 0s 6ms/step - loss: 0.0189 - acc: 0.9952\n67/67 [==============================] - 6s 93ms/step - loss: 0.0444 - acc: 0.9875 - val_loss: 0.0189 - val_acc: 0.9952\nEpoch 45/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0309 - acc: 0.9905\n67/67 [==============================] - 6s 92ms/step - loss: 0.0477 - acc: 0.9864 - val_loss: 0.0309 - val_acc: 0.9905\nEpoch 46/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0229 - acc: 0.9881\n67/67 [==============================] - 7s 107ms/step - loss: 0.0438 - acc: 0.9879 - val_loss: 0.0229 - val_acc: 0.9881\nEpoch 47/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0203 - acc: 0.9976\n67/67 [==============================] - 7s 101ms/step - loss: 0.0428 - acc: 0.9876 - val_loss: 0.0203 - val_acc: 0.9976\nEpoch 48/50\n14/14 [==============================] - 0s 5ms/step - loss: 0.0176 - acc: 0.9929\n67/67 [==============================] - 6s 92ms/step - loss: 0.0461 - acc: 0.9873 - val_loss: 0.0176 - val_acc: 0.9929\nEpoch 49/50\n14/14 [==============================] - 0s 6ms/step - loss: 0.0134 - acc: 0.9929\n67/67 [==============================] - 6s 93ms/step - loss: 0.0465 - acc: 0.9875 - val_loss: 0.0134 - val_acc: 0.9929\nEpoch 50/50\n14/14 [==============================] - 0s 3ms/step - loss: 0.0096 - acc: 0.9976\n67/67 [==============================] - 6s 93ms/step - loss: 0.0417 - acc: 0.9885 - val_loss: 0.0096 - val_acc: 0.9976\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Let see how it does with graphs."},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# summarize history for accuracy\nplt.plot(training_history.history['acc'])\nplt.plot(training_history.history['val_acc'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train', 'test'], loc='upper left')\nplt.show()\n# summarize history for loss\nplt.plot(training_history.history['loss'])\nplt.plot(training_history.history['val_loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'test'], loc='upper left')\nplt.show()","execution_count":7,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XmcXGWd7/HPr6uqq3rvpLuzr0AIuywhgOgQxSWAA7ghKI56HaMzzoxzx2GAcWF0rvfieK86jiCgMuCoIIIoapRNNoc1QXayEbJ0QpJOJ5303l1dv/vHc7pT6XR3upOurqTr+3696lVV55yq85ykur7neZ5Tz2PujoiICEBRvgsgIiKHDoWCiIj0USiIiEgfhYKIiPRRKIiISB+FgoiI9FEoiAyTmd1iZv9rmNuuM7N3HOz7iIw1hYKIiPRRKIiISB+FgowrUbPNFWb2gpm1mtkPzWyymf3OzJrN7AEzm5C1/YVm9rKZNZnZw2Z2bNa6U8zs2eh1PwNS/fb1HjN7Lnrt42Z20gGW+VNmtsbMdpjZPWY2LVpuZvYtM9tmZrvN7EUzOyFad76ZvRKVbZOZ/eMB/YOJ9KNQkPHo/cA7gaOBPwd+B/wzUEf4zP8dgJkdDdwG/H20binwazMrNrNi4JfAfwETgZ9H70v02lOAm4FPAzXAjcA9ZpYcSUHN7O3A/wEuAaYC64Hbo9XvAv4sOo6qaJvGaN0PgU+7ewVwAvCHkexXZDAKBRmP/sPdt7r7JuAx4Cl3/5O7dwB3A6dE230I+K273+/u3cD/BUqANwNnAgng2+7e7e53As9k7WMJcKO7P+XuPe5+K9AZvW4kPgLc7O7PunsncDVwlpnNAbqBCuAYwNz9VXd/I3pdN3CcmVW6+053f3aE+xUZkEJBxqOtWY/bB3heHj2eRjgzB8DdM8BGYHq0bpPvPWLk+qzHs4HPR01HTWbWBMyMXjcS/cvQQqgNTHf3PwDfBa4DtpnZTWZWGW36fuB8YL2ZPWJmZ41wvyIDUihIIdtM+HIHQhs+4Yt9E/AGMD1a1mtW1uONwNfcvTrrVurutx1kGcoIzVGbANz9O+5+GnAcoRnpimj5M+5+ETCJ0Mx1xwj3KzIghYIUsjuAC8zsXDNLAJ8nNAE9DjwBpIG/M7OEmb0PWJj12u8DnzGzM6IO4TIzu8DMKkZYhtuAT5jZyVF/xP8mNHetM7PTo/dPAK1AB5CJ+jw+YmZVUbPXbiBzEP8OIn0UClKw3H0lcDnwH8B2Qqf0n7t7l7t3Ae8DPg7sIPQ//CLrtcuATxGad3YCa6JtR1qGB4AvAXcRaidHApdGqysJ4bOT0MTUCHwjWvdRYJ2Z7QY+Q+ibEDlopkl2RESkl2oKIiLSR6EgIiJ9FAoiItJHoSAiIn3i+S7ASNXW1vqcOXPyXQwRkcPK8uXLt7t73f62O+xCYc6cOSxbtizfxRAROayY2fr9b6XmIxERyaJQEBGRPgoFERHpc9j1KQyku7ub+vp6Ojo68l2UnEulUsyYMYNEIpHvoojIODQuQqG+vp6KigrmzJnD3oNaji/uTmNjI/X19cydOzffxRGRcWhcNB91dHRQU1MzrgMBwMyoqakpiBqRiOTHuAgFYNwHQq9COU4RyY9xEwr709Hdw5ZdHaR7NOy8iMhgchYKZnazmW0zs5eG2GaRmT1nZi+b2SO5KgtAZ7qHbc0ddPeM/lDhTU1NXH/99SN+3fnnn09TU9Ool0dE5EDlsqZwC7B4sJVmVg1cD1zo7scDH8xhWSiKml0yOZg/YrBQSKfTQ75u6dKlVFdXj3p5REQOVM6uPnL3R81szhCbfBj4hbtviLbflquyAMSKQij0ZEY/FK666ipee+01Tj75ZBKJBKlUigkTJrBixQpWrVrFxRdfzMaNG+no6OBzn/scS5YsAfYM2dHS0sJ5553HW97yFh5//HGmT5/Or371K0pKSka9rCIiQ8nnJalHAwkzexioAP7d3X800IZmtgRYAjBr1qyBNunzlV+/zCubd++zPONOe1cPyUSMeNHIOmuPm1bJNX9+/KDrr732Wl566SWee+45Hn74YS644AJeeumlvstGb775ZiZOnEh7ezunn34673//+6mpqdnrPVavXs1tt93G97//fS655BLuuusuLr/88hGVU0TkYOUzFOLAacC5QAnwhJk96e6r+m/o7jcBNwEsWLDggE71+67acQdyewXPwoUL9/odwXe+8x3uvvtuADZu3Mjq1av3CYW5c+dy8sknA3Daaaexbt26nJZRRGQg+QyFeqDR3VuBVjN7FHgTsE8ojMRgZ/SZjPPS5l1MqUoxqSJ1MLvYr7Kysr7HDz/8MA888ABPPPEEpaWlLFq0aMDfGSSTyb7HsViM9vb2nJZRRGQg+bwk9VfAW8wsbmalwBnAq7namRkYRiYHV6RWVFTQ3Nw84Lpdu3YxYcIESktLWbFiBU8++eToF0BEZJTkrKZgZrcBi4BaM6sHrgESAO5+g7u/ama/B14AMsAP3H3Qy1dHoTwUFUFPDq4+qqmp4eyzz+aEE06gpKSEyZMn961bvHgxN9xwA8ceeyzz58/nzDPPHPX9i4iMFvMcfEnm0oIFC7z/JDuvvvoqxx577H5fu+KN3ZQl48ycWJqr4o2J4R6viEgvM1vu7gv2t13B/KIZoKjIcnJJqojIeFFQoRAzy8mP10RExouCCgXVFEREhlZQoRBqCvkuhYjIoaugQqGoKDfDXIiIjBcFFQqxIvUpiIgMpaBCoSjqaB7tYDjQobMBvv3tb9PW1jaq5REROVAFFQq9I6VmRrkJSaEgIuNFPsc+GnO9cyr0uI/qgWcPnf3Od76TSZMmcccdd9DZ2cl73/tevvKVr9Da2soll1xCfX09PT09fOlLX2Lr1q1s3ryZt73tbdTW1vLQQw+NYqlEREZu/IXC766CLS8OuKoyk+GI7gzx4lgYDGm4ppwI51076OrsobPvu+8+7rzzTp5++mncnQsvvJBHH32UhoYGpk2bxm9/+1sgjIlUVVXFN7/5TR566CFqa2tHdJgiIrlQUM1HYzHl/X333cd9993HKaecwqmnnsqKFStYvXo1J554Ivfffz9XXnkljz32GFVVVWNQGhGRkRl/NYUhzug7u9Ks3dbCnJoyKksSOdm9u3P11Vfz6U9/ep91zz77LEuXLuWLX/wi5557Ll/+8pdzUgYRkQNVUDWFWFafwmjKHjr73e9+NzfffDMtLS0AbNq0iW3btrF582ZKS0u5/PLLueKKK3j22Wf3ea2ISL6Nv5rCEIpydPVR9tDZ5513Hh/+8Ic566yzACgvL+fHP/4xa9as4YorrqCoqIhEIsH3vvc9AJYsWcLixYuZNm2aOppFJO8KaujssZx9LZc0dLaIjFTeh842s5vNbJuZDTlxjpmdbmZpM/tArsqyZ1+9s68dXkEoIjJWctmncAuweKgNzCwGfB24L4flyN5fNPvaWOxNROTwk7NQcPdHgR372exvgbuAbaOwv2FtFys6vGsKh1tzn4gcXvJ29ZGZTQfeC3xvGNsuMbNlZrasoaFhn/WpVIrGxsZhfWEW2eE7p4K709jYSCp1+PaHiMihLZ9XH30buNLdM7afXxe7+03ATRA6mvuvnzFjBvX19QwUGP01NHcC0N6QPIAi518qlWLGjBn5LoaIjFP5DIUFwO1RINQC55tZ2t1/OdI3SiQSzJ07d1jbfuOWZ9jW3MFv/vbkke5GRGTcy1souHvft7iZ3QL85kACYaQqUnHWNqRzvRsRkcNSzkLBzG4DFgG1ZlYPXAMkANz9hlztd3/Kk3GaOxQKIiIDyVkouPtlI9j247kqR3/lqTjNnQoFEZGBFNTYRwCVqQRd6Qyd6Z58F0VE5JBTcKFQngyVo9ZOhYKISH8FGwrNHd15LomIyKGn8EIh1RsK6lcQEemv4EKhIgqFFnU2i4jso/BCIRlmXFNNQURkXwUXCuV9NQX1KYiI9Fd4oRB1NLeopiAiso+CC4XePgX9gE1EZF8FFwrJeBGJmKlPQURkAAUXCmZGeTKu5iMRkQEUXCgAVKQSuiRVRGQABRkKYaRUXX0kItJfYYZCSsNni4gMpCBDoSIZV/ORiMgACjMUUgoFEZGB5CwUzOxmM9tmZi8Nsv4jZvaCmb1oZo+b2ZtyVZb+1HwkIjKwXNYUbgEWD7H+deAcdz8R+FfgphyWZS/lyYQuSRURGUDOQsHdHwV2DLH+cXffGT19EpiRq7L0V5GK09Wj2ddERPo7VPoUPgn8brCVZrbEzJaZ2bKGhoaD3lmF5lQQERlQ3kPBzN5GCIUrB9vG3W9y9wXuvqCuru6g96lB8UREBhbP587N7CTgB8B57t44VvvtCwVdgSQispe81RTMbBbwC+Cj7r5qLPddkQoT7ezWr5pFRPaSs5qCmd0GLAJqzaweuAZIALj7DcCXgRrgejMDSLv7glyVJ1vflJxqPhIR2UvOQsHdL9vP+r8E/jJX+x+Kmo9ERAaW947mfOirKSgURET2UpChUK5LUkVEBlSQoZCMxyiOFSkURET6KchQgFBbaOnU1UciItkKNhQqNCieiMg+CjYUNE+ziMi+CjoUmnX1kYjIXgo2FCpSGj5bRKS/Ag6FOM3qaBYR2UvBhoL6FERE9lW4oRDN0+zu+S6KiMgho2BDoSIVp7vH6Uxn8l0UEZFDRuGGQlJDXYiI9FewoVCuQfFERPZRsKFQkQwT7aizWURkj5yFgpndbGbbzOylQdabmX3HzNaY2QtmdmquyjKQPSOl6rJUEZFeuawp3AIsHmL9ecC86LYE+F4Oy7KP3ol29KtmEZE9chYK7v4osGOITS4CfuTBk0C1mU3NVXn605ScIiL7ymefwnRgY9bz+mjZPsxsiZktM7NlDQ0No7LzilToU1DzkYjIHodFR7O73+TuC9x9QV1d3ai8Z1kyBujqIxGRbPkMhU3AzKznM6JlYyIZj1EcL1KfgohIlnyGwj3AX0RXIZ0J7HL3N8ayAJUpjX8kIpItnqs3NrPbgEVArZnVA9cACQB3vwFYCpwPrAHagE/kqiyDKU9q9jURkWw5CwV3v2w/6x34bK72Pxy9g+KJiEhwWHQ054qGzxYR2VtBh0JFKsFuXZIqItKnsEMhqeYjEZFsBR0K6lMQEdlbQYdCRXRJqmZfExEJCjoUypMJ0hmno1uzr4mIQKGHQu/w2Z3qbBYRgQIPhd4pOXVZqohIUNihkNI8zSIi2Qo6FHon2tEVSCIiQWGHgmoKIiJ7GVYomNnnzKwyGtH0h2b2rJm9K9eFy7XKaKId1RRERILh1hT+h7vvBt4FTAA+Clybs1KNkb55mjXUhYgIMPxQsOj+fOC/3P3lrGWHrTJdfSQispfhhsJyM7uPEAr3mlkFcNj/4qs4XkQyXqTmIxGRyHDnU/gkcDKw1t3bzGwieZgUJxfCSKkKBRERGH5N4Sxgpbs3mdnlwBeBXft7kZktNrOVZrbGzK4aYP0sM3vIzP5kZi+Y2fkjK/7Bq9CgeCIifYYbCt8D2szsTcDngdeAHw31AjOLAdcB5wHHAZeZ2XH9NvsicIe7nwJcClw/grKPijDRjjqaRURg+KGQjqbPvAj4rrtfB1Ts5zULgTXuvtbdu4Dbo9dnc6AyelwFbB5meUZNRUrzNIuI9BpuKDSb2dWES1F/a2ZFQGI/r5kObMx6Xh8ty/YvwOVmVg8sBf52oDcysyVmtszMljU0NAyzyMNTrol2RET6DDcUPgR0En6vsAWYAXxjFPZ/GXCLu88gutw1Cpy9uPtN7r7A3RfU1dWNwm73KFdNQUSkz7BCIQqCnwBVZvYeoMPdh+xTADYBM7Oez4iWZfskcEe0jyeAFFA7nDKNFk3JKSKyx3CHubgEeBr4IHAJ8JSZfWA/L3sGmGdmc82smNCRfE+/bTYA50b7OJYQCqPbPrQfFakELZ2afU1EBIb/O4UvAKe7+zYAM6sDHgDuHOwF7p42s78B7gViwM3u/rKZfRVY5u73EK5k+r6Z/U9Cp/PHfYy/nctTcXoyTnt3D6XFw/3nEBEZn4b7LVjUGwiRRoZRy3D3pYQO5OxlX856/Apw9jDLkBPlWUNdKBREpNAN91vw92Z2L3Bb9PxD9PuyP1z1TrSzuyPNpMr9bCwiMs4NKxTc/Qozez97zupvcve7c1essdMbCupsFhEZfk0Bd78LuCuHZcmL8mQ0p4IuSxURGToUzKyZ0AG8zyrA3f2wb3DZMyWnhroQERkyFNx9f0NZHPaqSkNNYUerQkFEpKDnaAaYWpkilShizbaWfBdFRCTvCj4UioqMoydXsHpbc76LIiKSdwUfCgDzJlWwcotCQUREoQDMn1LOtuZOmtq68l0UEZG8UigA8yaH/vRVW9WvICKFTaEAzI9CYeVWNSGJSGFTKABTq1JUJOOsViiISIFTKABmxrzJ5epsFpGCp1CIzJ9SwaqtzZpXQUQKmkIhMm9SBTvbutneoiuQRKRw5TQUzGyxma00szVmdtUg21xiZq+Y2ctm9tNclmco86f0XoGkJiQRKVw5CwUziwHXAecBxwGXmdlx/baZB1wNnO3uxwN/n6vy7M/RkxUKIiK5rCksBNa4+1p37wJuBy7qt82ngOvcfSdAv9ndxlRteTETShMKBREpaLkMhenAxqzn9dGybEcDR5vZf5vZk2a2eKA3MrMlZrbMzJY1NDTkpLBmYQwk/YBNRApZvjua48A8YBFwGfB9M6vuv5G73+TuC9x9QV1dXc4Kc/TkClZt0RVIIlK4chkKm4CZWc9nRMuy1QP3uHu3u78OrCKERF4cPaWC5s40b+zqyFcRRETyKpeh8Awwz8zmmlkxcClwT79tfkmoJWBmtYTmpLU5LNOQ5quzWUQKXM5Cwd3TwN8A9wKvAne4+8tm9lUzuzDa7F6g0cxeAR4CrnD3xlyVaX+OnlwOKBREpHANOR3nwXL3pcDSfsu+nPXYgX+IbnlXXVrMpIokK7eos1lEClO+O5oPOfOnaBY2ESlcCoV+5k2qYPXWFjIZXYEkIoVHodDP/CnltHf3UL+zPd9FEREZcwqFfuZpwh0RKWCFEwobnoKfXQ6tQ1/cNG+SrkASkcJVOKHQuRte/TVsXzXkZhWpBNOrSxQKIlKQCicUao4K942r97vp0ZqFTUQKVOGEQvUsiBXD9mGEwpQK1ja0ku7JjEHBREQOHYUTCkUxmHgENK7Z76ZHT6qgqyfDusa2MSiYiMiho3BCAUIT0jBCQbOwiUihKqxQqJ0HO16HnvSQmx01qRwzhYKIFJ7CCoWaoyDTDU3rh9wslYgxe2KpQkFECk6BhUI0VcNwOpsnV+gKJBEpOIUVCrVRKAyns3lyBesa2+hM9+S4UCIih47CCoXSiVAycXi/VZhSQU/GWdvQOgYFExE5NBRWKEDoV9g+jCuQNAubiBSgnIaCmS02s5VmtsbMrhpiu/ebmZvZglyWBwhNSMOoKcytLSNeZLz6hkJBRApHzkLBzGLAdcB5wHHAZWZ23ADbVQCfA57KVVn2UnMUtGyFjt1DblYcL2Lh3In88k+b6Errl80iUhhyWVNYCKxx97Xu3gXcDlw0wHb/Cnwd6MhhWfYYQWfzkj87gi27O/jlc5tyXCgRkUNDLkNhOrAx63l9tKyPmZ0KzHT33w71Rma2xMyWmdmyhoaGgytV38B4+w+Fc46u49ipldz4yGuaiU1ECkLeOprNrAj4JvD5/W3r7je5+wJ3X1BXV3dwO554BFjRsH6rYGZ85pwjeK2hlQde3Xpw+xUROQzkMhQ2ATOzns+IlvWqAE4AHjazdcCZwD0572yOJ8OIqcOoKQBccOJUZkwo4YZHXsNdtQURGd9yGQrPAPPMbK6ZFQOXAvf0rnT3Xe5e6+5z3H0O8CRwobsvy2GZgprhXYEEEI8V8am3HsGzG5p4Zt3OHBdMRCS/chYK7p4G/ga4F3gVuMPdXzazr5rZhbna77DUHAWNr0FmeFcVXbJgJhPLirnhkddyXDARkfyK5/LN3X0psLTfsi8Psu2iXJZlL7VHQXcbNG+Gqhn73bykOMbHzprDtx5YxcotzX1Da4uIjDeF94tm2DMw3jD7FQD+4qzZlCRi3KjagoiMY4UZCrXDHy2114SyYi5dOJN7nt/Mpqb2HBVMRCS/CjMUKqZComxENQWAv3zrEQD84LG1uSiViEjeFWYomEHNkSOqKQBMry7hwjdN4/anN7KztStHhRMRyZ/CDAWIBsYbWU0B4NPnHEl7dw+3PrFu1IskIpJvhRsKNfOgaQN0j2zIpflTKnjXcZO5/qHXePy17TkqnIhIfhRuKNTOAxx2jLx/4N8+cBKza0pZ8qPlvLRp1+iXTUQkTwo3FGqODPfD/GVzturSYn70yYVUlST4+H8+zevbNTubiIwPBRwKwx8tdSBTq0r40ScXknH46A+fYuvusRn5W0Qklwo3FJIV4dLUYUzNOZgj68q55ROns7O1i4/d/DS72rpHsYAiImOvcEMBojGQRt58lO2kGdXc+NEFrG1o5ZO3PkN7V88oFU5EZOwpFA6w+SjbW+bV8q0PnczyDTv57E+fpaNbwSAih6fCDoXaedC+E1obD/qtLjhpKl+7+EQeWrmNS296kobmzlEooIjI2CrsUOgbGO/gmpB6ffiMWXzvI6eyYstuLr7uv1m1tXlU3ldEZKwUdijURlcgjXC4i6EsPmEqP1tyFl09Gd5//eM8uuog55QWERlDOQ0FM1tsZivNbI2ZXTXA+n8ws1fM7AUze9DMZueyPPuomgVFiVHpV8j2ppnV/PKzZzN9QgmfuOUZfvLU+lF9fxGRXMlZKJhZDLgOOA84DrjMzI7rt9mfgAXufhJwJ/BvuSrPgGJxmHjEqIcChMHz7vyrN/PWebV84e6X+NffvKIOaBE55OWyprAQWOPua929C7gduCh7A3d/yN3boqdPAvufBm201c4b1eajbOXJOD/4iwV87KzZ/PCPr3P2tX/gOw+u1girInLIymUoTAc2Zj2vj5YN5pPA7wZaYWZLzGyZmS1raBjlNvqao8L4Rz3p0X3fSDxWxFcuOoHbPnUmJ82o4pv3r+LN1/6Ba371Ehsa2/b/BiIiYyinczQPl5ldDiwAzhlovbvfBNwEsGDBAh/VndccBZlu2LUhNCXlyFlH1nDWkTWs2trM9x9dy0+f3sB/Pbme806YymfOOZITZ1TlbN8iIsOVy5rCJmBm1vMZ0bK9mNk7gC8AF7r72F/c3zs155aXxmR3R0+u4BsffBN/vPLtfPqcI3l0dQN//t0/8tEfPsUTrzXiPrqZJyIyEparLyEziwOrgHMJYfAM8GF3fzlrm1MIHcyL3X1YDfsLFizwZcuWjV5BO1vgu6dDVytccisc+bbRe+9haO7o5idPbeAHj73O9pZOTp1VzV8vOopzj52EmY1pWURk/DKz5e6+YL/b5fLM1MzOB74NxICb3f1rZvZVYJm732NmDwAnAm9EL9ng7hcO9Z6jHgoATRvhpx+C7Svhgm/CaR8b3fcfho7uHn6+bCM3PrqW+p3tHDOlgotOns6xUys4ZkolkyuTCgkROWCHRCjkQk5CAaBjN/z84/Dag/CW/wlv/zIUjf1v+7p7Mvz6+c3c9OhaVmzZ84vo6tIE8ydXcOzUSo6bVslpsydwRG2ZgkJEhkWhcCB60rD0H2H5f8JxF8N7b4BESW72NQxNbV2s3NLMir7bblZtaaY1Gol1Ylkxp86awII5Ezh9zgROmF5FMh7LW3lF5NA13FA4JK4+OmTE4vCeb4VZ2e77EuzeBGf+NXQ0QduOMHhee1O4n/om+LMrclqbqC4t5owjajjjiJq+ZZmMs3Z7C8vW7WTZ+p0sX7+TB17dCkAqUcS5x0zmgpOm8rb5kygpVkCIyMiopjCYV38Nd30K0u17liVKoWRCuG9cDSdeAhdfD7FE7sszhIbmTpav38ljqxu49+UtbG/porQ4xrnHTuaCE6eyaH4dqYQCQqSQqfloNDRvhbbtUDIRSqr3NCW5wx+/CQ9+FeafDx/4T0ikxqZM+5HuyfD06zv4zYtv8PuXtrCjNQTEabMn9DU1nTyzmopUfoNMRMaWQmEsPP390Acx561w2W1his9DSLonw5Nrd3Dvy1tYtn4nK7fsJuNgBvMnV3Da7AlMn1BCRSpBZSpOZSpBRSpOZUmCqVUpBYfIOKJQGCvP/wx++Vehj+Hyu6B0Yr5LNKjmjm6e29jE8qgv4k8bmmjpHHx4j1kTSzl+WiXHRVc8HTetkimVKV3xJHIYUiiMpRW/hZ9/IgyT8dG7oXJqvks0LO5OR3eG5o5udnd0s7sjTXNHmt3t3WzY0cYrm3fz8uZdrMsaoymVKKIkESOViFGSiJFMxChJFFFSHKO0OE55Mk5ZMkZZMk55cZzyVJya8iR15UnqKsKtMhVXsIiMMYXCWFv7CNx2WeiIfsc1cML7oWh8dO62dKZZ8cZuXnljNxt3tNHRnaGju4f27p69Hrd2pmnpTNPamaa1s4eunsyA71ccL6KuPElFKk4yXkQyHiOZ2HNfVZJgenUJ06pTTKsqYVp1CZMrUxTHC3tOKJGDoVDIh03L4Z7PwdYXoe5YePsX4Jj3hEb8AtSVztDSmaaxpZOG5k4asu93d9LalaYznaGzO0NnOgqYdA9Nbd3s6De8uBlMKC2mOFZEcTy6RY9LEjFmTixhdk0Zc2rKmFNbyuyaMsqTe6647u7J0NbZQ2tXmrauNPGiIipLQh9KIqawkfFPoZAvmQy8cjc89L/D5D3TToW3fxGOfHvBhsOBaO/q4Y1d7Wxu6mBzUzubmtrZ3tJJVzpDV0+G7p4MXekMnekMrZ1pNu5sp6F57/EUJ5YV4+60dvXQlR641gJQWhwLHeypBLXlSWZNLGVWTSmza0qZPbGMWTWlVKbiUcB10djayfaWLhpbutjV3k1ZMkZVSYLq0uJwX5KgujRBZSpBUZH+z+XQoFDIt540vHA7PPz1MCz37LPhbf8Mc96S75KNW62dadY3trG+sZV1jW1s3NlGzIyyZJyy4hilyTjlyRglxXHSPRl2t4d+lHDfza72bhqQr41YAAAQUUlEQVSaO9mwo43tLXvXVBIxo7tnZH8rZlBdkmBCaTHVpb33xZQnY1m1nT2PK1NxpleXMH1CCVOrSgZsLutKZ9i6u4MtuztobOmkqqSYSZVJJlem9qoZQegz2t7SxcadbWzc0caGxjZiMeOI2nKOrAthp1/AFw6FwqEi3QnLb4XH/i+0bA2Xry66Guacne+SyRBaOtNsaGxjw442NuxoZUdrNzVlxdSUF1NTnqSmrJja8iSVJXFaO3vY1R5qDU1tIVx2tnWzq62LnW3d7Gjroqmti52t3exs66Itqrl0pnvIDPLnZwaTKpJMry6hurSYhuZO3tjVwfaWwUeXLyuOMakyRV15kl3RxQLtQ0wBW2Qwc2IpR9SWMaWqZNCKbLzIiBcVEY9Z9NiIx4qi/qAiUtGFB6moXygW1Y56388ID2JFRjIRmv16t03Gi4jHinB3Mg6Og9N36XRpcYyy4vjB1bie+SHsXAeLroLisgN/n8OcQuFQ090Oy2+BP34rhMPcPwvhMPvNe7bJ9MCujaHZqXEtxJNQe3S4ldUM+tYyAhuegke+DlXT4dxroKw2r8VJ94TmsK50hl3t3Wza2U59UzubdoYms00722lq72ZyZZIplSmmVKWYWpViekk3R9b/klZK2BybynqfyusdFWxr6WRbcyeVqURoBptYwqyaUmZNLGXGhFK6ezK8vr2VtQ2trG1o4bXocUNzBzDQF6+Tzjg9PU53JkNPxkdcYxoNZcUxylPxcFVbMk6syCiyEDdFZmAh5IrM+tbFDD7Y9APO2/UzALYmZnDLlC+woeSYviONFxnlqTgV0W90KlIJKpJxSopjtHam2dXe3Rf2vTXLkuIYNWXFTIxuvY/LkvEoOItIxEI5ErEiejLe9z67o/td7d20dobAjoof7i2UvaokwcSyBBPLkn37qS45uOZIhcKhqrsdlv1nCIfWbaHmkKoKQbBjLfQMMn9zyUSomx8mBSqfAt4DmXQIkkz0OJGCWW8OtZCUZnLbS9MGuP8aePkXUDYJ2ndAcTm841/g1I+NfAyrdCc88V149kdwxl/Bwk+N3dVmax8Jv43Z3W/OqkRpuCx64lw4YlG4Aq5kwqjv3t3pyXi4SKCrm/QbL1G04XGKNz9FastyehJltE08nraa42mN7nuS1Xv1A3WmM321pe50JvoyBKIverMwcEBbV5qWzh5aOtJ9V7e1dKbJuOPOgPc97tCT5q9bvsM7Ox/g18Xn8Wj8zfxj+3eo9UZuLb6UnxZ/gAwxujMZWqJLsdODVduAimS878KEju4eGlu7aO7IzRS+gyky+KtFR3LFu485oNcrFA51XW2h5vDUDRBPhWlBa46M7qPH6Q7Yvhq2rwq3hlVhzoe2RiiKg8XCfVE8fCF1tUJPJ1hR6OA+4hyYew7MPAO6WsIX4676UBvZVR++VEproO6YEDh1x0D55PHVId7ZEgL4ie8CBmd/Ds7+uzCHxm//Adb/N8xYCO/5Jkw5cXjvufoB+N0/wY7XYOKR4X7GQrjwP2DSgf3BDkt3exha5cnroWYeXPy9UNPZsXbv27ZXoWk9xIph/nnwpg/DUeeOzhhd3e2w+U+w4QlY/wRsfAo6d4d1VTPDZ627Dd54AXbX73ld1SyYehJMOSn8O089CSqn5+az1t0Od/4PWLkUzrkqNBuZhcEsl14BL94R/r/ed2PfFLzuIeR2d3TT3JGmvauHsmScqpLwa/94cz1seBLql0GqEmqPpmvCkexMzWF7d5wdraFZMNSkQo0qHdWues/8s2+VqQRlyRhmhrvjhBB0nEwGmtq72NG67+202RNYNH/SAf2zKBTGM/eB/5jSnVD/TDiTfP2R8AH2QdqUE6VQOQ1aGqBz157lqeoQDrVHRWedWbfeYTzcw0ixvcGyqx46doUz1NqjQ6jlesjxnetgzQPhC3rzn0LNqHwSVEwJwVY+CbAQBi1bw+CF77gGqmbseQ93eP52uO8L4QvjjM+EL5BU5SD7XA/3/jOs+E0Ig/P/DY48F164A35/VQjeP/unEDzx4tE93s3Pwd2fhoYVsHAJvOMrUFw68Lbu8Mbz8Pxt8OLPw0lEWV34N5i5MJxAWNHet6JY+EwkSva+7+kKn6MNUQBsfi7MaQ5QOx9mnxVqp7PPgupZe5ejtRG2PB8C4o3nYcuLoUZM9J1TMjEExJQTw+embn64P5hRAdqbwu+FNjwB538j1OD6e/HOcEKQ6YFzroQJc8LxxpPhBC2eCn83m5aH4Nvw5J6AS5SGkzXPupqtckaowVdMDX8jyfJQC01W7LnvXZ6s3PM8UTqmJ2CHRCiY2WLg3wkzr/3A3a/ttz4J/Ag4DWgEPuTu64Z6T4XCCHQ2w/rHw4e7ZCJUzwxfilUzQ7NCbx29ZWv4smlYGe63rQhnvy1b936/sknhw7x7896jx+7Dwr5qjw5ntOWTwv5KJ4Zy9N4nyyFeEoYsH0y6KxxH5+5QpjUPwur7wyi1ANWzQ79MVyu0bIOWLWEgw97yzTgdFl8LM4b4W2jbAQ9+JdTcsBCWE+ZEt7nhfsdrocZhMTjnijCkejy55z1aGuD3V8JLd8HkE0KtYfIJ4cukaWOonfXW1LrbotpdIhx77+N4MgRSMrqloi+QDU/BI9eGL/aLrgtn/cOV7grh+fxPYeXv93yhj1SsONQ+Z50BM88MNYID6efqbIGtL8OWF6Lbi6Fmk+7Ys01ZXQicmiPCl2osAbFkKEMs+ndKVoQTgVR1dF8VmlDv+IvwOX7fjaH5bDC76uHuz8C6x4Yub/mUPcE360yYfHzYz461e2rwvbX5lgboag7HONjJWDaLhZp6WW24lWbdl/b+nUzY+2+muOyAgyTvoWBmMcIcze8E6glzNF/m7q9kbfPXwEnu/hkzuxR4r7t/aKj3VSiMoc4W2Pn63k0Tnc2h2l85PXTWVs4I98nKsG3Dyr2bvBrXhC/BocSK95yZxlOAR0HQvG8fSzwVLus96h1w1DtDM1v/PxL3cNbe3hRCcLh/RJuWh5rHznXR7XVofmPP+uPfC+/6WjjewaxYGs5Cm7f0FiZrpYWzyeKy8OWc6YGe7qhvqBu6O0Lz30COfx9c8P8O8ix6Zwh0z/S7efh37m7PurWFe4Bpp8C0k/cOwdGU6QmBuX1V9PlZGZpKd74ear/pzsH/XfpLlMGlPw6/C9of9/CZ7m6L9tMR3TpDmaaeFE46Rvol7B7ep7MlCokoKHo/073L2ptCLa51exiNufe+Y9fg7/3mv4V3/a+RlSdyKITCWcC/uPu7o+dXA7j7/8na5t5omyfMLA5sAep8iEIpFA5D3e3RJEU7siYr2hHO7rO/gLrbQl+LFQ1c5a6YEs5SB2s2yVXZmzaEP/Th9he0N8FTN4Yv3OqZoWZWPSsE6f6aldKde2pGHbvD40TJ0DWdQuAehWjnnn+jjl173zp3hw72Scfmu7QHJ921529kr7+bHXv6Cg/AoTDz2nRgY9bzeuCMwbZx97SZ7QJqgO3ZG5nZEmAJwKxZ/dot5dCXKAln10OdYR+qEiWhrXskSqph0ZUHtr94MtzyfKnsIccsNLXF4qGmdQiPRnzQ4sVQMTnc8uCwGPTF3W9y9wXuvqCuri7fxRERGbdyGQqbgJlZz2dEywbcJmo+qiJ0OIuISB7kMhSeAeaZ2VwzKwYuBe7pt809wMeixx8A/jBUf4KIiORWzvoUoj6CvwHuJVySerO7v2xmXwWWufs9wA+B/zKzNcAOQnCIiEie5LKjGXdfCiztt+zLWY87gA/msgwiIjJ8h0VHs4iIjA2FgoiI9FEoiIhIn8NuQDwzawDWH+DLa+n3w7gCUqjHruMuLDruwc129/3+0OuwC4WDYWbLhvMz7/GoUI9dx11YdNwHT81HIiLSR6EgIiJ9Ci0Ubsp3AfKoUI9dx11YdNwHqaD6FEREZGiFVlMQEZEhKBRERKRPwYSCmS02s5VmtsbMrsp3eXLFzG42s21m9lLWsolmdr+ZrY7uJ+SzjLlgZjPN7CEze8XMXjazz0XLx/Wxm1nKzJ42s+ej4/5KtHyumT0Vfd5/Fo1UPO6YWczM/mRmv4mej/vjNrN1ZvaimT1nZsuiZaP2OS+IUIjmi74OOA84DrjMzI7Lb6ly5hZgcb9lVwEPuvs84MHo+XiTBj7v7scBZwKfjf6Px/uxdwJvd/c3AScDi83sTODrwLfc/ShgJ/DJPJYxlz4HvJr1vFCO+23ufnLWbxNG7XNeEKEALATWuPtad+8CbgcuynOZcsLdHyUMQ57tIuDW6PGtwMVjWqgx4O5vuPuz0eNmwhfFdMb5sXvQEj1NRDcH3g7cGS0fd8cNYGYzgAuAH0TPjQI47kGM2ue8UEJhoPmiD8MJgw/YZHd/I3q8BcjP5K9jxMzmAKcAT1EAxx41oTwHbAPuB14Dmtw9HW0yXj/v3wb+CchEz2sojON24D4zWx7NXw+j+DnP6XwKcuhxdzezcXsdspmVA3cBf+/uu8PJYzBej93de4CTzawauBs4Js9Fyjkzew+wzd2Xm9mifJdnjL3F3TeZ2STgfjNbkb3yYD/nhVJTGM580ePZVjObChDdb8tzeXLCzBKEQPiJu/8iWlwQxw7g7k3AQ8BZQHU07zmMz8/72cCFZraO0Bz8duDfGf/Hjbtviu63EU4CFjKKn/NCCYXhzBc9nmXPhf0x4Fd5LEtORO3JPwRedfdvZq0a18duZnVRDQEzKwHeSehPeYgw7zmMw+N296vdfYa7zyH8Pf/B3T/COD9uMyszs4rex8C7gJcYxc95wfyi2czOJ7RB9s4X/bU8FyknzOw2YBFhKN2twDXAL4E7gFmEYccvcff+ndGHNTN7C/AY8CJ72pj/mdCvMG6P3cxOInQsxggneXe4+1fN7AjCGfRE4E/A5e7emb+S5k7UfPSP7v6e8X7c0fHdHT2NAz9196+ZWQ2j9DkvmFAQEZH9K5TmIxERGQaFgoiI9FEoiIhIH4WCiIj0USiIiEgfhYLIGDKzRb0jeoocihQKIiLSR6EgMgAzuzyap+A5M7sxGnSuxcy+Fc1b8KCZ1UXbnmxmT5rZC2Z2d+9Y9mZ2lJk9EM118KyZHRm9fbmZ3WlmK8zsJ5Y9QJNInikURPoxs2OBDwFnu/vJQA/wEaAMWObuxwOPEH4tDvAj4Ep3P4nwi+re5T8BrovmOngz0DuK5SnA3xPm9jiCMI6PyCFBo6SK7Otc4DTgmegkvoQwwFgG+Fm0zY+BX5hZFVDt7o9Ey28Ffh6NTzPd3e8GcPcOgOj9nnb3+uj5c8Ac4I+5PyyR/VMoiOzLgFvd/eq9Fpp9qd92BzpGTPZYPD3o71AOIWo+EtnXg8AHovHqe+e/nU34e+kdgfPDwB/dfRew08zeGi3/KPBINPtbvZldHL1H0sxKx/QoRA6AzlBE+nH3V8zsi4TZrYqAbuCzQCuwMFq3jdDvAGGo4huiL/21wCei5R8FbjSzr0bv8cExPAyRA6JRUkWGycxa3L083+UQySU1H4mISB/VFEREpI9qCiIi0kehICIifRQKIiLSR6EgIiJ9FAoiItLn/wOn9EPTtxDt7wAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"Let make predictions! I will now create a new method for test.csv import..."},{"metadata":{"trusted":true},"cell_type":"code","source":"def data_prep_test(raw):\n    num_images = raw.shape[0]\n    x_shaped_array = raw.values.reshape(num_images, img_rows, img_cols, 1)\n    out_x = x_shaped_array / 255\n    return out_x\n\nraw_data_test = pd.read_csv(\"../input/test.csv\")\n\nx_test = data_prep_test(raw_data_test)","execution_count":8,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Plot again..."},{"metadata":{"trusted":true},"cell_type":"code","source":"showing_test = np.zeros((img_rows, img_cols))\n\nimg_test = generate_image(x_test[0])\nimshow(img_test)","execution_count":9,"outputs":[{"output_type":"execute_result","execution_count":9,"data":{"text/plain":"<matplotlib.image.AxesImage at 0x7f5603cd50b8>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"Predictions!"},{"metadata":{"trusted":true},"cell_type":"code","source":"result = digit_model.predict(x_test)","execution_count":10,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Let's see the first prediction."},{"metadata":{"trusted":true},"cell_type":"code","source":"np.argmax(result[0])","execution_count":11,"outputs":[{"output_type":"execute_result","execution_count":11,"data":{"text/plain":"2"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"Now generate output file."},{"metadata":{"trusted":true},"cell_type":"code","source":"collapsed_results = np.transpose(np.asmatrix(list(map(lambda x: np.argmax(x), result))))\n    \n# add indicies\nindicies = np.transpose(np.asmatrix(range(1,collapsed_results.shape[0]+1)))\n\n# print(collapsed_results.shape)\n# print(indicies.shape)\n\noutput = np.append(np.asmatrix([\"ImageId\", \"Label\"]), np.append(indicies, collapsed_results, axis=1), axis=0)","execution_count":12,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"And we are done!"},{"metadata":{"trusted":true},"cell_type":"code","source":"pd.DataFrame(output).to_csv(\"out.csv\",index=False,header=False)","execution_count":13,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}