{"cells":[{"metadata":{"_uuid":"865ff028-b531-4670-b1fa-49e25986e8c6","_cell_guid":"dc94cb01-bfbe-4acc-ae65-3f008f0ad71f","trusted":true},"cell_type":"markdown","source":"## CNN implementation in Keras for beginners\n### KEI Takahashi\n \n *I tried eliminating waste code to implement CNN model in Keras.*\n \n *So beginners can easily and quickly write code.*\n \n *If you have questions, pls let me know.*"},{"metadata":{"_uuid":"fee37581-b9f9-43cb-8d75-350ff7209e4d","_cell_guid":"af598a18-4f79-42b6-9d5d-a9c88c4ef27e","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport matplotlib.cm as cm\n%matplotlib inline\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn import metrics\nfrom keras.models import Sequential\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense,Conv2D,Flatten,MaxPool2D,Dropout,BatchNormalization\nfrom keras.optimizers import Adam\nfrom keras.callbacks import ReduceLROnPlateau\nfrom keras.utils import np_utils","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"48e0fb6c-dcaa-42d1-b5c8-6190aeb65052","_cell_guid":"93873021-d5bc-4270-be56-9b4aebdaac65","trusted":true},"cell_type":"code","source":"# data attribute\nROOT_PATH = '../input/Kannada-MNIST/'\nclass_num = 10\nwidth = 28\nheight = 28\ncolor_num = 1\ninput_shape = (width, height, color_num)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a01f783a-0cf6-4a8e-b7f6-1dff2b565eb0","_cell_guid":"b7ba5480-9fbc-4749-bcf0-4e3f5e6bf496","trusted":true},"cell_type":"code","source":"# load data\ntrain = pd.read_csv(ROOT_PATH+'train.csv').values\ndig = pd.read_csv(ROOT_PATH+'Dig-MNIST.csv').values\nX_test = pd.read_csv(ROOT_PATH+'test.csv').drop('id', axis=1).values","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2f62455c-9f8b-499d-8770-dc1ab497b269","_cell_guid":"5349e507-f0e4-4949-939e-d1bf41eb3067","trusted":true},"cell_type":"code","source":"# reshape train data\ny = train[:, 0].astype('int32')\nX = train[:, 1:].astype('float32').reshape(-1, width, height, color_num)\n\n# train_test_split\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.10, random_state=42)\n\n# reshape check data\ny_dig = dig[:, 0].astype('int32')\nX_dig = dig[:, 1:].astype('float32').reshape(-1,  width, height, color_num)\n\n# reshape test data\nX_test = X_test.astype('float32').reshape(-1,  width, height, color_num)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b8b38160-6ed4-448a-873a-ce06a333c227","_cell_guid":"db4ec7ff-b5dd-4caf-a33a-f6e49c2e3d79","trusted":true},"cell_type":"code","source":"# plot training images\nfig = plt.figure(figsize=(15, 15))\n\nfor i in range(class_num):\n    ax = fig.add_subplot(2, class_num, i+1, xticks=[], yticks=[])\n    ax.imshow(X_train[i].reshape(width, height), cmap='gray')\n    ax.set_title(str(y_train[i]))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"127eac53-fdae-4534-b572-6a58962561ae","_cell_guid":"d6fb101e-7737-4d10-8f54-724c7298e510","trusted":true},"cell_type":"code","source":"# one-hot encode the labels\ny_train = np_utils.to_categorical(y_train, class_num)\ny_val = np_utils.to_categorical(y_val, class_num)\n\n# setting keras input data\ntrain_datagen = ImageDataGenerator(rescale = 1./255.,\n                                   rotation_range = 10,\n                                   width_shift_range = 0.3,\n                                   height_shift_range = 0.3,\n                                   shear_range = 0.2,\n                                   zoom_range = 0.3)\n\nvalid_datagen = ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4608c06c-7cf3-4f46-a43f-66eef7f39b90","_cell_guid":"59a435c9-1a52-4096-9a91-28d5ae9fed79","trusted":true},"cell_type":"code","source":"# define the model\nmodel = Sequential()\n\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n                 activation ='relu', input_shape = (28,28,1)))\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n                 activation ='relu'))\nmodel.add(BatchNormalization(momentum=.15))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\n\nmodel.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', \n                 activation ='relu'))\nmodel.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', \n                 activation ='relu'))\nmodel.add(BatchNormalization(momentum=0.15))\nmodel.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n                 activation ='relu', input_shape = (28,28,1)))\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n                 activation ='relu'))\nmodel.add(BatchNormalization(momentum=.15))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dropout(0.4))\nmodel.add(Dense(10, activation = \"softmax\"))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"bc2d6ba8-af67-4dce-bffa-34e8a25b8a5e","_cell_guid":"364cfe3f-93cd-43f8-9676-b18fbfbdbdaf","trusted":true},"cell_type":"code","source":"# set parameter\nbatch_size = 1024\nepochs = 30\n\n# Set a learning rate annealer\nlr_reducer = ReduceLROnPlateau(monitor='val_accuracy', \n                                            patience=2, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)\n\n# model compile\nmodel.compile(loss='categorical_crossentropy',\n              optimizer=Adam(lr=0.001,beta_1=0.9,beta_2=0.999),\n              metrics=['accuracy'])\n\n# model fitting\nhistory = model.fit_generator(  train_datagen.flow(X_train, y_train, batch_size=batch_size),\n                                steps_per_epoch=epochs,\n                                epochs=epochs,\n                                workers=4,\n                                callbacks=[lr_reducer],\n                                validation_data=valid_datagen.flow(X_val, y_val),\n                                validation_steps=epochs/2,\n                                verbose=2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b08893f6-7b8d-4946-b5b5-beeb7af35532","_cell_guid":"2e15426f-5236-4c10-8219-cd5336bf10c6","trusted":true},"cell_type":"code","source":"# Check accuracy \npreds_dig = model.predict_classes(X_dig/255, verbose=2)\n\nprint(metrics.accuracy_score(preds_dig, y_dig))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f969bd18-60f7-4e84-aad2-cd04f15588c2","_cell_guid":"fe760fee-899a-45dc-a021-107277fb7e4b","trusted":true},"cell_type":"code","source":"# predict test data\ntestY = model.predict_classes(X_test, verbose=2)\n\n# output\nsub = pd.read_csv(ROOT_PATH+'sample_submission.csv')\nsub['label'] = testY\nsub.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"72806a0e-fc87-4818-897e-5c2b9b7085cd","_cell_guid":"c3650924-80e0-437f-8c53-5c1ca8283dcf","trusted":true},"cell_type":"code","source":"# check submisson.csv\nsub.head()","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}