{"cells":[{"metadata":{"_uuid":"86c199604a01c46f3ee550e978210eae1d4cabeb","_cell_guid":"0dd5ccf7-d1cd-4624-8b5b-6e48953460a4"},"cell_type":"markdown","source":"## Imports"},{"metadata":{"_uuid":"a3d76ad23f24c13423abd94e12f7daf468400b5b","_cell_guid":"cea99acb-6bc0-4298-baf2-778f3bb79b89","trusted":false,"collapsed":true},"cell_type":"code","source":"from keras.models import Sequential, Model\nfrom keras.layers import ZeroPadding2D, Conv2D\nfrom keras.layers import MaxPooling2D, BatchNormalization, Input\nfrom keras.layers.core import Flatten, Dense, Dropout, Lambda\nfrom keras.optimizers import Adam\nimport numpy as np\nimport pandas as pd","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"27a349ca-7ef4-4f77-963b-7980aed66ce7","_uuid":"a6c3b4c2f6b2ed883de9d989b093029839770906","trusted":false},"cell_type":"code","source":"# Set the path of the data\nPATH = \"../input\"","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"5755b6fe-4251-453a-b652-7089c6eb6327","_uuid":"2e05d9b9846d2c90b4ad7b060a4f8ea6023faa38","trusted":false},"cell_type":"code","source":"# Import dataset\ntrain = pd.read_csv(PATH + \"/train.csv\")\ntest = pd.read_csv(PATH + \"/test.csv\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5be186b52ca072f8c9c0b530638a3613fafa2fa9","_cell_guid":"8de28454-d850-4f98-97e3-84b8b99b8c4a"},"cell_type":"markdown","source":"## Preprocessing"},{"metadata":{"collapsed":true,"_cell_guid":"560a9657-aaaf-4942-8d3b-9ba4ae4d0783","_uuid":"d7f2ece4cc6c0a17446b765fa17cb045c511da27","trusted":false},"cell_type":"code","source":"# We will resize the vectors into 28x28x1 arrays\n# example = X_train.values[1]\n# np.resize(example, (28,28, 1)).shape","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"488b43e6-bcf3-4a84-8c29-649fb121e422","_uuid":"f216e26913380276857809d630b67fb9b005b0f8","trusted":false},"cell_type":"code","source":"X_train = []\ny_train = []\n\nfor index, row in train.iterrows():\n    label = row[\"label\"]\n    row = row.drop([\"label\"], axis=0)\n    image = np.resize(row.values, (28, 28, 1))\n    entry = { 'label': label, 'image': image}\n#     data.append(entry)\n    X_train.append(image)\n    y_train.append(label)\n\nX_train = np.array(X_train)\ny_train = np.array(y_train)\n# train_processed = pd.DataFrame(data=data); train_processed.head()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"a75303d9-568f-4ea4-ade9-db6e2ad1cfb1","_uuid":"ff3f9a73367ec146cb427de5357616fd7ba6d9e0","trusted":false},"cell_type":"code","source":"# data = []\nX_test = []\n\nfor index, row in test.iterrows():\n    image = np.resize(row.values, (28, 28, 1))\n    entry = {'image': image}\n    X_test.append(image)\n#     data.append(entry)\n    \nX_test = np.array(X_test)\n# test_processed = pd.DataFrame(data=data); test_processed.head()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"89c55bbf-bdc7-44ec-b0f7-f6a2f68c7063","_uuid":"fb8f7987eaf430dbdb29359e353ae754622ba331","trusted":false},"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\n\nenc = OneHotEncoder(n_values=10)\ny_train_encoded = enc.fit_transform(y_train.reshape(-1, 1))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3fcacbe62476e5e3b63bcb41080980aeba14b7c2","_cell_guid":"9b073a96-0359-413f-a2fa-764b37ad2ec9"},"cell_type":"markdown","source":"## On to the Model"},{"metadata":{"collapsed":true,"_cell_guid":"8501bf9d-d858-4082-a03a-e2ec268bb6d8","_uuid":"86585abbbaa0ad7f872ad94574a26c03c06e2955","trusted":false},"cell_type":"code","source":"inputs = Input(shape=(28,28,1,))\n\nx = ZeroPadding2D((1,1))(inputs)\nx = Conv2D(32, kernel_size=(3,3), activation='relu')(x)\nx = ZeroPadding2D((1,1))(x)\nx = Conv2D(32, kernel_size=(3,3), activation='relu')(x)\nx = ZeroPadding2D((1,1))(x)\nx = MaxPooling2D((2,2), strides=(2,2))(x)\nx = Conv2D(64, kernel_size=(3,3), activation='relu')(x)\nx = ZeroPadding2D((1,1))(x)\nx = Conv2D(64, kernel_size=(3,3), activation='relu')(x)\n# Flatten and dense layers\nx = Flatten()(x)\nx = Dense(128, activation='relu')(x)\nx = BatchNormalization()(x)\nx = Dropout(.5)(x)\nx = Dense(128, activation='relu')(x)\nx = BatchNormalization()(x)\nx = Dropout(.5)(x)\npredictions = Dense(10, activation='softmax')(x)\n\nmodel = Model(inputs=inputs, outputs=predictions)\nmodel.compile(optimizer='adam',\n             loss='categorical_crossentropy',\n             metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"cd17ec90ae7219c50db407ac91d425fc3b9b3998","_cell_guid":"7da17047-3c71-4d1b-be08-5b34b410a752","trusted":false,"collapsed":true},"cell_type":"code","source":"train_pct = .75\nsplit_pnt = int(train_pct * len(X_train))\nX_val, y_val = X_train[split_pnt:], y_train_encoded[split_pnt:]\nX_train, y_train = X_train[:split_pnt], y_train_encoded[:split_pnt]\nprint(len(X_train), len(X_val))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"638a1ebecd981f6bb6297aefe9cc1b46c48000a9","_cell_guid":"1390450c-5c78-4331-8e77-9e1893332a5d","trusted":false,"collapsed":true},"cell_type":"code","source":"model.fit(X_train, y_train, batch_size=64, validation_data=(X_val, y_val), epochs=3)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1e292f8f3ac34fe2ab0b7edad6ab7b823d48862c","_cell_guid":"b4784f34-7fdd-47d5-af83-66828762bb4d","trusted":false,"collapsed":true},"cell_type":"code","source":"model.fit(X_train, y_train, batch_size=64, validation_data=(X_val, y_val), epochs=8)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"fa69607f-79ad-4d3b-9470-fccbda04486b","_uuid":"f34af861bab520db3a0a1fd97c6436230282403b","trusted":false},"cell_type":"code","source":"model.save(\"models/mnist.h5\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2295c0d1078c1469e13ebbe0c65d8d434536d851","_cell_guid":"51eeb8f1-b387-4f52-811c-0ddcba40808e","trusted":false,"collapsed":true},"cell_type":"code","source":"test.head()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"6e489248-8af9-4f8b-b024-7c6ea64b29d0","_uuid":"ea46550a45fa8774dc024b9b952edacceaa78bbd","trusted":false},"cell_type":"code","source":"preds = model.predict(X_test)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"1a94950f-e69c-4fd5-8e15-b536d643432b","_uuid":"c3eaf4856575e0acf45b1294794e223992b099f0","trusted":false},"cell_type":"code","source":"data = []\nfor i in range(0, len(preds)):\n    entry = { 'ImageId': i+1, 'Label': np.argmax(preds[i]) }\n    data.append(entry)\nsubmit = pd.DataFrame(data=data)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"53ecfadfa98ce25bf8bcebbb61e16bdee1fe7943","_cell_guid":"66d3d5cb-5926-4d2a-b41c-76f1b0a23f48","trusted":false,"collapsed":true},"cell_type":"code","source":"submit.head()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"293c075e-5dfc-49ed-a899-5f04a2635475","_uuid":"6fc6a3d806c1a419907734f62841a815b8fde46d","trusted":false},"cell_type":"code","source":"submit.to_csv('mnist_submit.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"4e9f4e7a-8588-404f-9af3-7930d9c89b53","_uuid":"58d8473e3e50084a553c0ddd2f8e28304d0ddbd0","trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"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"},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":1}