Last active
June 3, 2018 06:55
-
-
Save ftnext/cd763fc4cec9f44373ad330443cad5aa to your computer and use it in GitHub Desktop.
Chainer v4 ビギナー向けチュートリアル https://qiita.com/mitmul/items/1e35fba085eb07a92560 をData Science Virtual Machine - Windows 2016 NC6で実施した。MNISTの5.学習の途中で時間切れになった。学習結果が2イテレーション目から出力されているのは、1イテレーション回したあとエラーで落ちたため。こちらのレポートも参照:http://nikkie-ftnext.hatenablog.com/entry/2018/06/02/232402
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"Python 3.6.3 :: Anaconda custom (64-bit)\n" | |
] | |
} | |
], | |
"source": [ | |
" !python -V" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Chainer: 4.1.0\n", | |
"NumPy: 1.11.3\n", | |
"CuPy:\n", | |
" CuPy Version : 5.0.0b1\n", | |
" CUDA Root : C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\n", | |
" CUDA Build Version : 9000\n", | |
" CUDA Driver Version : 9000\n", | |
" CUDA Runtime Version : 9000\n", | |
" cuDNN Build Version : 7103\n", | |
" cuDNN Version : 7103\n", | |
" NCCL Build Version : None\n" | |
] | |
} | |
], | |
"source": [ | |
"import chainer\n", | |
"chainer.print_runtime_info()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
" from chainer.datasets import mnist" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...\n", | |
"Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz...\n", | |
"Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz...\n", | |
"Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz...\n" | |
] | |
} | |
], | |
"source": [ | |
"train_val, test = mnist.get_mnist(withlabel=True, ndim=1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
" import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAABrBJREFUeJzt3blrFX0fxuH3vIqFooY0CoKIFhEV\nSaOCCCISRNAiaiNYKVYGrNLYWUQElyJokUqwEUuXRgu3QggElyZgr6TTuC/EnOcvON/oyWru62rv\njDOFH6b4ObHRbDb/B+T5/3w/ADA/xA+hxA+hxA+hxA+hxA+hxA+hxA+hxA+hls7lzRqNhn9OCLOs\n2Ww2/uTnvPkhlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPgh\nlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPghlPgh\nlPghlPgh1NL5fgBm15IlS8p99erVs3r/vr6+ltvy5cvLa7u6usr9zJkz5X758uWW2/Hjx8trf/z4\nUe4XL14s9/Pnz5f7QuDND6HED6HED6HED6HED6HED6HED6Gc88+B9evXl/uyZcvKfffu3eW+Z8+e\nlltHR0d57dGjR8t9Pr19+7bcBwcHy723t7fl9vnz5/La169fl/vTp0/L/V/gzQ+hxA+hxA+hxA+h\nxA+hxA+hGs1mc+5u1mjM3c3mUHd3d7k/evSo3Gf7s9qFanJystxPnjxZ7l++fGn73mNjY+X+4cOH\ncn/z5k3b955tzWaz8Sc/580PocQPocQPocQPocQPocQPocQPoZzzz4DOzs5yHx4eLveNGzfO5OPM\nqKmefXx8vNz37dvXcvv161d5beq/f5gu5/xASfwQSvwQSvwQSvwQSvwQSvwQyq/ungHv378v9/7+\n/nI/dOhQub98+bLcp/oV1pVXr16Ve09PT7l//fq13Ldu3dpyO3v2bHkts8ubH0KJH0KJH0KJH0KJ\nH0KJH0KJH0L5nn8BWLVqVblP9d9JDw0NtdxOnTpVXnvixIlyv3XrVrmz8PieHyiJH0KJH0KJH0KJ\nH0KJH0KJH0L5nn8B+PTp07Su//jxY9vXnj59utxv375d7pOTk23fm/nlzQ+hxA+hxA+hxA+hxA+h\nxA+hfNK7CKxYsaLldu/evfLavXv3lvvBgwfL/eHDh+XO3PNJL1ASP4QSP4QSP4QSP4QSP4QSP4Ry\nzr/Ibdq0qdxfvHhR7uPj4+X++PHjch8ZGWm5Xb9+vbx2Lv9uLibO+YGS+CGU+CGU+CGU+CGU+CGU\n+CGUc/5wvb295X7jxo1yX7lyZdv3PnfuXLnfvHmz3MfGxtq+92LmnB8oiR9CiR9CiR9CiR9CiR9C\niR9COeentG3btnK/evVque/fv7/tew8NDZX7wMBAub97967te//LnPMDJfFDKPFDKPFDKPFDKPFD\nKPFDKOf8TEtHR0e5Hz58uOU21e8KaDTq4+pHjx6Ve09PT7kvVs75gZL4IZT4IZT4IZT4IZT4IZSj\nPubNz58/y33p0qXlPjExUe4HDhxouT158qS89l/mqA8oiR9CiR9CiR9CiR9CiR9CiR9C1QepxNu+\nfXu5Hzt2rNx37NjRcpvqHH8qo6Oj5f7s2bNp/fmLnTc/hBI/hBI/hBI/hBI/hBI/hBI/hHLOv8h1\ndXWVe19fX7kfOXKk3NeuXfvXz/Snfv/+Xe5jY2PlPjk5OZOPs+h480Mo8UMo8UMo8UMo8UMo8UMo\n8UMo5/z/gKnO0o8fP95ym+ocf8OGDe080owYGRkp94GBgXK/e/fuTD5OHG9+CCV+CCV+CCV+CCV+\nCCV+COWobw6sWbOm3Lds2VLu165dK/fNmzf/9TPNlOHh4XK/dOlSy+3OnTvltT7JnV3e/BBK/BBK\n/BBK/BBK/BBK/BBK/BDKOf8f6uzsbLkNDQ2V13Z3d5f7xo0b23qmmfD8+fNyv3LlSrk/ePCg3L9/\n//7Xz8Tc8OaHUOKHUOKHUOKHUOKHUOKHUOKHUDHn/Lt27Sr3/v7+ct+5c2fLbd26dW0900z59u1b\ny21wcLC89sKFC+X+9evXtp6Jhc+bH0KJH0KJH0KJH0KJH0KJH0KJH0LFnPP39vZOa5+O0dHRcr9/\n/365T0xMlHv1zf34+Hh5Lbm8+SGU+CGU+CGU+CGU+CGU+CGU+CFUo9lszt3NGo25uxmEajabjT/5\nOW9+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+\nCCV+CCV+CCV+CDWnv7obWDi8+SGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU\n+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CHUf+FsNTkv2hLSAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x1de195880b8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"label 5\n" | |
] | |
} | |
], | |
"source": [ | |
"x, t = train_val[0]\n", | |
"plt.imshow(x.reshape(28,28), cmap='gray')\n", | |
"plt.axis('off')\n", | |
"plt.show()\n", | |
"print('label', t)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
" from chainer.datasets import split_dataset_random" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
" train, valid = split_dataset_random(train_val, 50000, seed=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Training dataset size 50000\n", | |
"Validation dataset size 10000\n" | |
] | |
} | |
], | |
"source": [ | |
"print('Training dataset size', len(train))\n", | |
"print('Validation dataset size', len(valid))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
" # Iterator\n", | |
" from chainer import iterators" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"batchsize = 128" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"train_iter = iterators.SerialIterator(train, batchsize)\n", | |
"valid_iter = iterators.SerialIterator(valid, batchsize, repeat=False, shuffle=False)\n", | |
"test_iter = iterators.SerialIterator(test, batchsize, repeat=False, shuffle=False)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
" # Define Network\n", | |
"import chainer.links as L\n", | |
"import chainer.functions as F" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import random\n", | |
"import numpy\n", | |
"import chainer" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def reset_seed(seed=0):\n", | |
" random.seed(seed)\n", | |
" numpy.random.seed(seed)\n", | |
" if chainer.cuda.available:\n", | |
" chainer.cuda.cupy.random.seed(seed)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"reset_seed(0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"class MLP(chainer.Chain):\n", | |
" \n", | |
" def __init__(self, n_mid_units=100, n_out=10):\n", | |
" super(MLP, self).__init__()\n", | |
" \n", | |
" with self.init_scope():\n", | |
" self.l1 = L.Linear(None, n_mid_units)\n", | |
" self.l2 = L.Linear(n_mid_units, n_mid_units)\n", | |
" self.l3 = L.Linear(n_mid_units, n_out)\n", | |
" \n", | |
" def __call__(self, x):\n", | |
" h1 = F.relu(self.l1(x))\n", | |
" h2 = F.relu(self.l2(h1))\n", | |
" return self.l3(h2)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"gpu_id = 0\n", | |
"net = MLP()\n", | |
"if gpu_id >= 0:\n", | |
" net.to_gpu(gpu_id)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"(100,)\n", | |
"[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", | |
"None\n" | |
] | |
} | |
], | |
"source": [ | |
"print(net.l1.b.shape)\n", | |
"print(net.l1.b.array)\n", | |
"print(net.l1.W.array)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from chainer import optimizers\n", | |
"optimizer = optimizers.SGD(lr=0.01).setup(net)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"from chainer.dataset import concat_examples\n", | |
"from chainer.cuda import to_cpu" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"max_epoch = 10" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"epoch:02 train_loss:0.5911 val_loss:0.5340 val_accuracy:0.8650\n", | |
"epoch:03 train_loss:0.5907 val_loss:0.4239 val_accuracy:0.8842\n", | |
"epoch:04 train_loss:0.4681 val_loss:0.3746 val_accuracy:0.8952\n", | |
"epoch:05 train_loss:0.3593 val_loss:0.3450 val_accuracy:0.9022\n", | |
"epoch:06 train_loss:0.1758 val_loss:0.3250 val_accuracy:0.9082\n", | |
"epoch:07 train_loss:0.4435 val_loss:0.3136 val_accuracy:0.9103\n", | |
"epoch:08 train_loss:0.3708 val_loss:0.2987 val_accuracy:0.9147\n", | |
"epoch:09 train_loss:0.1589 val_loss:0.2898 val_accuracy:0.9158\n", | |
"epoch:10 train_loss:0.2851 val_loss:0.2781 val_accuracy:0.9201\n" | |
] | |
} | |
], | |
"source": [ | |
"while train_iter.epoch < max_epoch:\n", | |
" train_batch = train_iter.next()\n", | |
" x, t = concat_examples(train_batch, gpu_id)\n", | |
" \n", | |
" y = net(x)\n", | |
" \n", | |
" loss = F.softmax_cross_entropy(y, t)\n", | |
"\n", | |
" net.cleargrads()\n", | |
" loss.backward()\n", | |
" \n", | |
" optimizer.update()\n", | |
" \n", | |
" \n", | |
" if train_iter.is_new_epoch:\n", | |
" print('epoch:{:02d} train_loss:{:.04f}'.format(\n", | |
" train_iter.epoch, float(to_cpu(loss.data))), end=' ')\n", | |
" valid_losses = []\n", | |
" valid_accuracies = []\n", | |
" while True:\n", | |
" valid_batch = valid_iter.next()\n", | |
" x_valid, t_valid = concat_examples(valid_batch, gpu_id)\n", | |
" with chainer.using_config('train', False), chainer.using_config('enable_backprop', False):\n", | |
" y_valid = net(x_valid)\n", | |
" loss_valid = F.softmax_cross_entropy(y_valid, t_valid)\n", | |
" valid_losses.append(to_cpu(loss_valid.array))\n", | |
" \n", | |
" accuracy = F.accuracy(y_valid, t_valid)\n", | |
" accuracy.to_cpu()\n", | |
" valid_accuracies.append(accuracy.array)\n", | |
" \n", | |
" if valid_iter.is_new_epoch:\n", | |
" valid_iter.reset()\n", | |
" break\n", | |
" print('val_loss:{:.04f} val_accuracy:{:.04f}'.format(\n", | |
" np.mean(valid_losses), np.mean(valid_accuracies)))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python [default]", | |
"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.6.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment