{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Very simple CNN with chainer"},{"metadata":{},"cell_type":"markdown","source":"# package import"},{"metadata":{"trusted":true},"cell_type":"code","source":"# packages\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# Time to say good-bye, chainer...\nimport chainer\nimport chainer.links as L\nimport chainer.functions as F","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# get datas\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\ntest_df = pd.read_csv('/kaggle/input/Kannada-MNIST/test.csv')\ntrain_df = pd.read_csv('/kaggle/input/Kannada-MNIST/train.csv')\nprint(test_df.shape)\nprint(train_df.shape)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Prepare data"},{"metadata":{"trusted":true},"cell_type":"code","source":"# load dataframe to numpy\nX_train, Y_train, X_test, Y_test= [], [], [], []\nX_train = train_df.iloc[:,1:].values.reshape(-1,1,28,28)\nY_train = train_df.iloc[:,0].values\n\nprint(len(X_train))\nprint(len(Y_train))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Transfer 32\nX_train = X_train.astype('float32')\nY_train = Y_train.astype('int32')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"---"},{"metadata":{},"cell_type":"markdown","source":"## chainer dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Dataset for Chainer\ndataset = chainer.datasets.TupleDataset(X_train, Y_train)\nlen(dataset)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 70% as training\nn_train = int(len(dataset) * 0.7)\ntrain, test = chainer.datasets.split_dataset_random(dataset, n_train, seed=1)\n\n# check raws\nlen(train)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Define model and train"},{"metadata":{"trusted":true},"cell_type":"code","source":"# very simple CNN\nclass CNN(chainer.Chain):\n\n    def __init__(self, n_mid=100, n_out=10):\n        super().__init__()\n        with self.init_scope():\n            self.conv1 = L.Convolution2D(in_channels=1, out_channels=3, ksize=6, stride=1, pad=1)\n            self.conv2 = L.Convolution2D(in_channels=1, out_channels=3, ksize=3, stride=1, pad=1)\n            self.fc1 = L.Linear(None, n_mid)\n            self.fc2 = L.Linear(None, n_out)\n\n    def __call__(self, x):\n        h = F.relu(self.conv1(x))\n        h = F.max_pooling_2d(h, 3, 3)\n        h = F.relu(self.conv2(x))\n        h = F.max_pooling_2d(h, 3, 3)\n        h = self.fc1(h)\n        h = self.fc2(h)\n        return h","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# define random seed\nimport random\ndef reset_seed(seed=0):\n    random.seed(seed)\n    np.random.seed(seed)\n    if chainer.cuda.available:\n        chainer.cuda.cupy.random.seed(seed)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"reset_seed(0)\nmodel = L.Classifier(CNN())\ngpu_id = -1\n# none gpu\n# when gpu use\n# gpu_id = 0\n# model.to_gpu(gpu_id)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# define optimizer, and set up with model\noptimizer = chainer.optimizers.Adam()\noptimizer.setup(model)\n\nbatchsize = 96\ntrain_iter = chainer.iterators.SerialIterator(train, batchsize)\ntest_iter = chainer.iterators.SerialIterator(test, batchsize, repeat=False, shuffle=True)\n\nfrom chainer import training\nfrom chainer.training import extensions\n\n# set epoch\nepoch = 10\nupdater = training.StandardUpdater(train_iter, optimizer, device=gpu_id)\ntrainer = training.Trainer(updater, (epoch, 'epoch'), out='mnist')\n\n# validate with 30% train data\ntrainer.extend(extensions.Evaluator(test_iter, model, device=gpu_id))\n\n# logging learning process\ntrainer.extend(extensions.LogReport(trigger=(1, 'epoch')))\n# Print Report per 1 poch\ntrainer.extend(extensions.PrintReport(['epoch', 'main/accuracy', 'validation/main/accuracy', 'main/loss', 'validation/main/loss', 'elapsed_time']), trigger=(1, 'epoch'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## run train"},{"metadata":{"trusted":true},"cell_type":"code","source":"# start training\ntrainer.run()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# plot training summary"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"import json\nwith open('mnist/log') as f:\n    result = pd.DataFrame(json.load(f))\nresult","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 損失関数(loss)\nresult[['main/loss', 'validation/main/loss']].plot()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 精度(accuracy)\nresult[['main/accuracy', 'validation/main/accuracy']].plot()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Test and Submit data"},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test = test_df.iloc[:,1:].values.reshape(-1,1,28,28)\nprint(X_test.shape)\n#X_test = test_df.values.reshape(1,28,28)\nX_test = X_test.astype('float32')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# predict with test data\n\ndef predict(model, x_dataset):\n    y = model.predictor(x_dataset)\n    return np.argmax(y.data, axis = 1)\n\ny_test = predict(model, X_test)\ny_test","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_y_test = pd.DataFrame({'label':y_test})\ndf_Y_id = test_df.iloc[:,0]\ndf_submit = pd.concat([df_Y_id,df_y_test],axis=1)\ndf_submit.columns = ['id', 'label']\ndf_submit","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submit.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":1}