{"cells":[{"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)\nimport tensorflow as tf\nimport keras\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### data preprocessing"},{"metadata":{"trusted":true},"cell_type":"code","source":"# train data preporcessing\nfrom keras.utils import to_categorical\n# train data preporcessing\ntrain_csv = pd.read_csv('/kaggle/input/Kannada-MNIST/train.csv')\nx_train = np.array(train_csv.iloc[:, 1:])\ny_train = to_categorical(train_csv.iloc[:, 0])\nx_train = x_train.reshape(x_train.shape[0], 28, 28, 1)\nx_train = x_train.astype(np.float32)\nx_train /= 255.0\ny_train = y_train.astype(np.float32)\nprint(x_train.shape)\nprint(x_train.dtype)\nprint(y_train.shape)\nprint(y_train.dtype)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# validation data preporcessing\nval_csv = pd.read_csv('/kaggle/input/Kannada-MNIST/Dig-MNIST.csv')\nx_val = np.array(val_csv.iloc[:, 1:])\ny_val = to_categorical(val_csv.iloc[:, 0])\nx_val = x_val.reshape(x_val.shape[0], 28, 28, 1)\nx_val = x_val.astype(np.float32)\nx_val /= 255.0\ny_val = y_val.astype(np.float32)\nprint(x_val.shape)\nprint(x_val.dtype)\nprint(y_val.shape)\nprint(y_val.dtype)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### train information \n* Trained on local environment, not on Kaggle kernel(GTX 1050Ti 4GB VRAM)  \n* Using Keras 2.2.4 Version due to below codes  \n* Using AdaBound Optimizer from https://github.com/titu1994/keras-adabound  \n* Using SGDR Scheduler from https://qiita.com/koshian2/items/4c27c887438a52062d97 (This is written by Japanese, use sgdr code as module python file)  \n* Using Random Erasing Augmentation from https://github.com/yu4u/cutout-random-erasing  \n* Using CheckPoint"},{"metadata":{"trusted":true},"cell_type":"code","source":"# # using keras for learning\n# import tensorflow as tf\n# import keras\n# from keras.models import Model\n# from keras.layers import Input, Conv2D, Dropout, Activation, Flatten, Dense, MaxPool2D\n# from keras.layers.normalization import BatchNormalization\n# from keras.optimizers import Adam, SGD, Nadam\n# from keras.callbacks import LearningRateScheduler, ReduceLROnPlateau, CSVLogger\n# from keras.preprocessing.image import ImageDataGenerator\n\n# from adabound import AdaBound\n\n# from random_eraser import get_random_eraser\n\n# # model structure\n# inputs = Input(shape=(28, 28, 1), name='input')\n\n# # old model\n# conv1_1 = Conv2D(filters=64, kernel_size=(3,3), padding='same', name='conv1_1')(inputs)\n# bn1 = BatchNormalization(name='bn1')(conv1_1)\n# act1 = Activation('relu', name='act1')(bn1)\n# conv1_2 = Conv2D(filters=64, kernel_size=(3,3), padding='same', name='conv1_2')(act1)\n# bn2 = BatchNormalization(name='bn2')(conv1_2)\n# act2 = Activation('relu', name='act2')(bn2)\n# maxpool1 = MaxPool2D(name='maxpool1')(act2)\n\n# conv2_1 = Conv2D(filters=64, kernel_size=(3,3), padding='same', name='conv2_1')(maxpool1)\n# bn3 = BatchNormalization(name='bn3')(conv2_1)\n# act3 = Activation('relu', name='act3')(bn3)\n# conv2_2 = Conv2D(filters=64, kernel_size=(3,3), padding='same', name='conv2_2')(act3)\n# bn4 = BatchNormalization(name='bn4')(conv2_2)\n# act4 = Activation('relu', name='act4')(bn4)\n# maxpool2 = MaxPool2D(name='maxpool2')(act4)\n\n# conv3_1 = Conv2D(filters=32, kernel_size=(3,3), padding='same', name='conv3_1')(maxpool2)\n# # conv3_2 = Conv2D(filters=64, kernel_size=(3,3), padding='same', name='conv3_2')(conv3_1)\n# bn5 = BatchNormalization(name='bn5')(conv3_1)\n# act5 = Activation('relu', name='act5')(bn5)\n# maxpool3 = MaxPool2D(name='maxpool3')(act5)\n\n# # conv4_1 = Conv2D(filters=32, kernel_size=(3,3), padding='same', name='conv4_1')(maxpool3)\n# # # conv4_2 = Conv2D(filters=64, kernel_size=(3,3), padding='same', name='conv4_2')(conv4_1)\n# # bn6 = BatchNormalization(name='bn6')(conv4_1)\n# # act6 = Activation('relu', name='act6')(bn6)\n# # maxpool4 = MaxPool2D(name='maxpool4')(act6)\n\n# dropout = Dropout(0.25)(maxpool3)\n# flatten = Flatten(name='flatten')(dropout)\n# dense1 = Dense(256, activation='relu', name='dense1')(flatten)\n# dropout2 = Dropout(0.5)(dense1)\n# dense2 = Dense(10, activation='softmax', name='output')(dropout2)\n\n# model = Model(inputs=inputs, outputs=dense2)\n# model.summary()\n# # local values\n# epochs = 1000\n# batch_size = 32\n\n# # callbacks\n# callbacks = []\n\n# fpath = './checkpoints/weights.{epoch:02d}-{loss:.2f}-{acc:.2f}-{val_loss:.2f}-{val_acc:.2f}.hdf5'\n# cp_cb = keras.callbacks.ModelCheckpoint(filepath=fpath, monitor='val_acc', verbose=1, save_best_only=False, mode='auto')\n# callbacks.append(cp_cb)\n\n# # rlp = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=10, verbose=1, mode='auto')\n# # callbacks.append(rlp)\n\n# from sgdr import LearningRateCallback\n# lr_cbs = LearningRateCallback(1e-3, 1e-4, lr_max_compression=5, t0=10, tmult=2, trigger_val_acc=0.85)\n# sgdr = LearningRateScheduler(lr_cbs.lr_scheduler)\n# callbacks.append(sgdr)\n\n# import os, datetime\n# now = datetime.datetime.now()\n# csvname = './log/train_{0:%Y%m%d}_adabound_sgdr_deeper.csv'.format(now)\n# csv_logger = CSVLogger(csvname)\n# callbacks.append(csv_logger)\n\n# # datagen\n# datagen = ImageDataGenerator(width_shift_range=0.2,\n#                              height_shift_range=0.2,\n#                              rotation_range=5,\n#                              zoom_range=[1,1.5],\n#                              preprocessing_function=get_random_eraser(v_l=0, v_h=1),\n#                              fill_mode=\"constant\", cval=0)\n# # datagen.fit(x_train)\n\n# # optimizers\n# base_lr = 1e-3\n# opt = AdaBound(lr=1e-03,\n#                 final_lr=0.1,\n#                 gamma=1e-03,\n#                 weight_decay=0.,\n#                 amsbound=False)\n# model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['acc'])\n# model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size), steps_per_epoch=len(x_train)/batch_size, epochs=epochs, callbacks=callbacks, verbose=1, validation_data=(x_val, y_val))\n\n# model.save('model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# evaluate\n# test_csv = pd.read_csv('/kaggle/input/Kannada-MNIST/test.csv')\n# x_test = np.array(test_csv.iloc[:, 1:])\n# x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)\n# x_test = x_test.astype(np.float32)\n# x_test /= 255.0\n# id_test = np.array(test_csv.iloc[:, 0])\n# from keras.models import load_model\n\n# load your model \n\n# result_list = []\n# for idx in id_test:\n#     pred = model.predict(x_test[idx].reshape(1, 28, 28, 1), batch_size=1)\n#     result_list.append([idx, np.argmax(pred, axis=1)[0]])\n# print(result_list)\n# submmit_csv = pd.DataFrame(result_list, index=None, columns=['id', 'label'])\n# submmit_csv.to_csv('submission.csv', index=None)","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}