{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## TensorFlow.jsがインストールされていることの確認\n", "\n", "まず初めに、TensorFlow.jsが正しくimportでき実行できるかバージョンを表示して確かめてみましょう。ちなみにtslabでHTMLや画像を表示するには`tslab.display`を使用します。無事バージョン番号が表示されたでしょうか。\n", "\n", "ちなみにJupyter上では`Tab`でコード補完、`Shift-Tab`で関数定義などの表示が行えます。活用しながらコードを書いてください。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

tf.version

" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "{\n", " \u001b[32m'tfjs-core'\u001b[39m: \u001b[32m'1.3.2'\u001b[39m,\n", " \u001b[32m'tfjs-data'\u001b[39m: \u001b[32m'1.3.2'\u001b[39m,\n", " \u001b[32m'tfjs-layers'\u001b[39m: \u001b[32m'1.3.2'\u001b[39m,\n", " \u001b[32m'tfjs-converter'\u001b[39m: \u001b[32m'1.3.2'\u001b[39m,\n", " tfjs: \u001b[32m'1.3.2'\u001b[39m,\n", " \u001b[32m'tfjs-node'\u001b[39m: \u001b[32m'1.3.2'\u001b[39m\n", "}\n" ] }, { "data": { "text/html": [ "

tslab.versions

" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "tslab.versions: { tslab: \u001b[32m'1.0.5'\u001b[39m, typescript: \u001b[32m'3.7.2'\u001b[39m, node: \u001b[32m'v12.13.0'\u001b[39m }\n" ] } ], "source": [ "import * as tf from '@tensorflow/tfjs-node'\n", "import * as tslab from \"tslab\";\n", "\n", "tslab.display.html('

tf.version

')\n", "console.log(tf.version);\n", "tslab.display.html('

tslab.versions

')\n", "console.log('tslab.versions:', tslab.versions);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MNIST をダウンロードする\n", "\n", "TensorFlowが無事にNodeにインストール出来たので、ニューラルネットワークモデルを実際に構築してJavaScriptでトレーニングを行ってみましょう。ここでは機械学習のチュートリアルで常に使わる手書き文字認識のデータセット[MNIST database](https://en.wikipedia.org/wiki/MNIST_database)を使って、数字の文字認識の機械学習を行ってみましょう。\n", "\n", "TensorFlow.jsのサンプルコードの中に[MNISTをダウンロードしてTensorFlowの内部表現に変換するコードの例](https://github.com/tensorflow/tfjs-examples/blob/master/mnist-node/)が存在するので今回はそれを利用します。このコードはすでに[例のレポジトリにコピーしてある](https://github.com/yunabe/qiita-20191202-jsml/blob/master/lib/mnist.js)のでここではそれを`import`します。興味があればどのような実装になっているかのぞいてみてください。\n", "\n", "`loadData()`は`Promise`を返すのでタスクの終了まで待機するのを忘れないでください。tslabはtop-level awaitをサポートしているので`await`をつけるだけでOKです。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import mnist from '../lib/mnist';\n", "await mnist.loadData();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## データの確認と可視化\n", "\n", "[WikipediaのMNISTの記事](https://en.wikipedia.org/wiki/MNIST_database)にも書かれているように、MNISTのデータは60,000の訓練用データ(training data)と10,000の評価用データ(test data)に事前に分けられています。実際にダウンロードされたデータの大きさを確認してみましょう。\n", "\n", "訓練データに60,000個、評価データに10,000個の数字の画像(`images`)と文字認識の正解データ(`labels`)が存在することが確認できたと思います。数字の画像データは28x28の白黒1チャンネル(グレースケール)であることも分かります。\n", "\n", "ちなみにデータの内部表現として使われている[`Tensor`のAPIはここにドキュメントがあります](https://js.tensorflow.org/api/latest/#class:Tensor)。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

訓練データのサイズ

" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "{\n", " images: Tensor {\n", " kept: \u001b[33mfalse\u001b[39m,\n", " isDisposedInternal: \u001b[33mfalse\u001b[39m,\n", " shape: [ \u001b[33m60000\u001b[39m, \u001b[33m28\u001b[39m, \u001b[33m28\u001b[39m, \u001b[33m1\u001b[39m ],\n", " dtype: \u001b[32m'float32'\u001b[39m,\n", " size: \u001b[33m47040000\u001b[39m,\n", " strides: [ \u001b[33m784\u001b[39m, \u001b[33m28\u001b[39m, \u001b[33m1\u001b[39m ],\n", " dataId: {},\n", " id: \u001b[33m0\u001b[39m,\n", " rankType: \u001b[32m'4'\u001b[39m\n", " },\n", " labels: Tensor {\n", " kept: \u001b[33mfalse\u001b[39m,\n", " isDisposedInternal: \u001b[33mfalse\u001b[39m,\n", " shape: [ \u001b[33m60000\u001b[39m, \u001b[33m10\u001b[39m ],\n", " dtype: \u001b[32m'float32'\u001b[39m,\n", " size: \u001b[33m600000\u001b[39m,\n", " strides: [ \u001b[33m10\u001b[39m ],\n", " dataId: {},\n", " id: \u001b[33m10\u001b[39m,\n", " rankType: \u001b[32m'2'\u001b[39m,\n", " scopeId: \u001b[33m6\u001b[39m\n", " }\n", "}\n" ] }, { "data": { "text/html": [ "

評価データのサイズ

" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "{\n", " images: Tensor {\n", " kept: \u001b[33mfalse\u001b[39m,\n", " isDisposedInternal: \u001b[33mfalse\u001b[39m,\n", " shape: [ \u001b[33m10000\u001b[39m, \u001b[33m28\u001b[39m, \u001b[33m28\u001b[39m, \u001b[33m1\u001b[39m ],\n", " dtype: \u001b[32m'float32'\u001b[39m,\n", " size: \u001b[33m7840000\u001b[39m,\n", " strides: [ \u001b[33m784\u001b[39m, \u001b[33m28\u001b[39m, \u001b[33m1\u001b[39m ],\n", " dataId: {},\n", " id: \u001b[33m11\u001b[39m,\n", " rankType: \u001b[32m'4'\u001b[39m\n", " },\n", " labels: Tensor {\n", " kept: \u001b[33mfalse\u001b[39m,\n", " isDisposedInternal: \u001b[33mfalse\u001b[39m,\n", " shape: [ \u001b[33m10000\u001b[39m, \u001b[33m10\u001b[39m ],\n", " dtype: \u001b[32m'float32'\u001b[39m,\n", " size: \u001b[33m100000\u001b[39m,\n", " strides: [ \u001b[33m10\u001b[39m ],\n", " dataId: {},\n", " id: \u001b[33m21\u001b[39m,\n", " rankType: \u001b[32m'2'\u001b[39m,\n", " scopeId: \u001b[33m14\u001b[39m\n", " }\n", "}\n" ] } ], "source": [ "tslab.display.html('

訓練データのサイズ

')\n", "console.log(mnist.getTrainData());\n", "tslab.display.html('

評価データのサイズ

')\n", "console.log(mnist.getTestData());" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次にMNISTのデータの可視化もしてみましょう。MNISTの画像データは28x28の`0`から`1.0`のグレースケールのデータの配列です。画像ライブラリ`jimp`を使用してPNGに変換して可視化してみます。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import Jimp from 'jimp';\n", "import {promisify} from 'util';\n", "\n", "async function toPng(images: tf.Tensor4D, start: number, size: number): Promise {\n", " // Note: mnist.getTrainData().images.slice([index], [1]) is slow.\n", " let arry = images.slice([start], [size]).flatten().arraySync();\n", " let ret: Buffer[] = [];\n", " for (let i = 0; i < size; i++) {\n", " let raw = [];\n", " for (const v of arry.slice(i * 28 * 28, (i+1)*28*28)) {\n", " raw.push(...[v*255, v*255, v*255, 255])\n", " }\n", " let img = await promisify((cb: (err, v: Jimp)=>any) => {\n", " new Jimp({ data: Buffer.from(raw), width: 28, height: 28 }, cb);\n", " })();\n", " ret.push(await img.getBufferAsync(Jimp.MIME_PNG));\n", " }\n", " return ret;\n", "}" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

label: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB/UlEQVR4Ab3BP0sycQDA8W8/bQhcTBIa/IebSxwhCBUELqKLkG/hdJAWQWiRoDZHB9+B0AuIkOCEllxuEf+hdA4WIggK1SAV+HCD8AxdeRr3+WwBCywksJjAYgKLCSwmsJjAYnYMpFIpZFlmNBoxn8+pVCqMx2Oenp7YhB0DxWIRv9/PUiaT4e3tjXa7zU9eXl4oFouoqsp37BiQZZmDgwM6nQ6hUAhJkjg9PSUSifD8/IzH42Hp6+uLyWTC/v4+uuFwiKqqfMeOAUVRUBQFXbVaRed0OpEkCVVVCYfDLM3nc/r9Pt1ul93dXQaDAUbsmDCbzajVaugUReF/Z2dnOJ1Oms0mNzc3GBH8AbfbTblcRgjB1dUV0+kUI4I/kM1m2dvbYzab0ev1+IlgQ0dHR1xcXKBLJpO0Wi1+IthQPB5ne3sbRVGo1+v8RrCBnZ0dYrEYHx8fXF5e8vn5yW8EG8jn80iSRK1W4/HxkVUI1pRIJCgUCry+vnJ9fc2qBGtwuVyUSiVsNht3d3fU63VWJTDJZrNRrVYJBAJomkahUMAMgUnBYJDDw0N0uVwOTdMwQ2CCz+fj/v4eXT6f5/b2FrMEJqTTabxeL7qHhwcWiwVmCVZ0cnLC+fk5mxKs6Pj4GIfDgU7TNN7f31mHHZMajQbRaJTpdMo6toAFFvoHmuWyFZCwkJgAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

label: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACQklEQVR4Ab3BP0s6cQDA4Y/f7k6aonMI9zBIKAhbmqOWMIKLewkuLZUVRuCPqNfQ1tCf4YhCipqTBBUaIpBagnRRygLpcLHsx3c4iCC9K7jnCQCf+EjgM4HPFFxKJpP09vYyMjKCYRhIOzs75PN59vf3cUvBBcuyMAwDR7vdRkokEkxOTpLNZqlUKrjRA/yjA8uyMAwDx/39PYeHhzw/PzM0NISu67y8vHB1dYUbCh3EYjHm5uaQSqUS8Xicer2ObdtomkahUGB0dBRd13FLoYNwOEwgEKBUKjE9PU21WsWRTCYZHh5GOj8/xy2FDs7OzhgcHOTt7Y3X11e+Mk0TVVXxSqGLcrnMdysrK0QiEaRisUixWMQtgUczMzNsbm6iaRpPT0+kUimazSZuCTyKxWJomoZkWRbZbBYvFDzIZDJMTU0h7e3tsbGxgVcCl8LhMBMTEwSDQer1OltbW9i2jVcCl46PjwmFQkgHBwc8PDzwGwIX4vE4Y2NjSJeXl6TTaX5L0EUoFGJ9fR1VVZFubm6wbZvfEnSxvLzM+Pg4UiaTIZ1O8xeCLpaWlnAsLCxg2zZ/oeCBruu0Wi2+ajQatFotVFWlr68Pqb+/n8XFRRwfHx+sra3RbDZR8OD29pbvjo6OqFarDAwMYJomP6nVamxvb6PQxcXFBbOzs/xkfn6er97f32m320inp6dcX18j5XI5pADwSRerq6uoqoojGo1imiaO3d1dHh8fkU5OTri7u+MnAeATHwl8JvCZwGcCn/0HydDKWOzCKSAAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

label: 1

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABSElEQVR4Ab3BocrCUBiA4ddvbdGgNk2ahgoWwzDYBMFL0Auwmv9s8yIMwlAQm8kmIqxqNJgGLg0U0cmu4D/nDM7zFIAUiwTLBMsEyxzgjxzq9TpRFPF4PDidTvxHyKndbvP9frnf76gQcmq1WiRJwnq9RoWQg+d5TKdTlsslqoQcGo0GruuyWq1QJeQwm8243W6cz2dUCYZqtRqdTofX60WSJKgSDPV6PTJRFKFDMOR5Hpn5fI4OwUC322UymRCGIfv9Hh2CgX6/T7FY5HK58Hw+0SEYaDabpGlKEAToEjRVKhV83+d6vbLZbNAlaBqPx5RKJY7HIyYETdVqlUwcx5gQNA2HQzK73Q4Tggbf9ymXy+QhaBiNRjiOQxiGHA4HTAiKXNdlMBiQCYKAz+eDCUHR+/0mjmO22y2LxQJTBSDFIsEywTLBsh8lcmftrvY7egAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

label: 0

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACm0lEQVR4Ab3BTyi7cRzA8ff3s0fJlIvnMIfFidzkYCmhFGo7KnIR2Q7kJjVkToqD44qSq4vDDuMqcWA7siPPs8MOm0SRWn2/v3ZYrV/7J7XXSwGGFhJaTGgxocUsfsnr9XJ0dEQkEiGdTjM3N4fjODRL+KWenh5WV1fRWjM8PEwwGOQ3hF+wbZvz83P+wgPEaMLGxga7u7uMjo5SppTi6+sLn89He3s7juPQiAeI0YT7+3v8fj+VlFIMDAwwPT3NxMQEd3d35HI56hGakEwmERFEBBFBRBAR3t7eyGaziAh9fX08PDzQiAeIUcf4+DgrKyt0dXWhtcYYgzGGeDzO8fExFxcXZLNZxsbGMMZQKBRIpVLU4gFi1NDb28v19TU+nw+lFMYYHMfh7OyMnZ0dnp6ecByHl5cXFhYW8Hq9TE5O8vPzQzqdRmvN/4Q62tra6O7upuzm5oZAIMDW1hbf39+UOY7DwcEBJR0dHRweHuL3+6lGaFIqlWJ5eZlCoUA1iUSCdDpNI0IDIoKIMDIyguu61KKUQkQQEUSE/f19qrGoIxKJoLWmGaFQiKGhIbTWaK3Z29ujGos6QqEQjdi2zeDgINFolLJ8Pk+xWKQaiz/a3t5mbW2NstfXV5aWlnBdl2os/iCZTNLf30+lTCbD7e0ttVjUoZRCRCiZnZ2l5PT0FJ/PR4mIoLWmUjAYpB4PEKMGy7KYmprCGMPi4iLz8/N0dnZijMEYQ4nWGmMMxhji8ThXV1fUY1HH5eUlm5ub2LZNLfl8nkwmQzgcJpfL0YgHiFHDx8cHj4+PfH5+EggEMMZQSSlFNBplfX2d9/d3isUijSjA0ISZmRnC4TChUIhEIsHJyQlKKZ6fn3Fdl2YpwNBCQosJLSa02D9bPv9BROQCpQAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

label: 4

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB/UlEQVR4Ab3BMUsyYQDA8f/zcGDoIBzSElJwm3hDTjqFS4GCi9piS4tf4hYhdBFq01GcdGhtlQY3BQODEDL8AA0HBQZhz8sNQcN7zx0I9/sJQBEhScQkEZNETBIxSUi5XI7NZoPO+fk56XQaHUlIFxcXxGIxdCqVCt1uFx1JCIZhUCqVCDKfz8lkMiQSCfxIQigWixQKBQaDATqmaZLJZIjH4/iRBLBtm9FoxHq9ptPpoFOpVAgiCeA4DolEgqurKz4/P/FjmiZnZ2cIIdCRaNRqNUqlEq+vr8xmM3Qcx+Hn54fHx0dc18WPRKNerxOPx+n3++icnJzQaDTY7Xa0222+v7/xI/GRTCbJ5/N4er0eOs1mk1QqxWq1YjKZoCPxEYvFODo6YjweE8SyLDzPz88Ekfj4+Pjg6ekJ27YxTRM/h4eH1Go1hBBMp1OCGPjYbres12uq1SoPDw/c3t7yVzabxbIsjo+PUUrhUUoRxECj1WohhKBcLjMajfjr/f0dpRSpVIpfg8GAIAYaLy8vXF5ecnp6imVZ/HV/f49nOBzSaDTwbLdbghiEsFgsWCwW/M/b2xu/bNtmuVyiY7AnIQRCCDzL5ZIgBntSSqGUIizJng4ODvB8fX0RhsGerq+vcV2Xm5sbwjDY02w24+7ujslkQhgCUERIEjFJxP4BciOfpGKyXBwAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

label: 1

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABX0lEQVR4Ab3Br6rCUBzA8e/93as+wKJGs0UtQxZtBsGyV5GF+woiqGAVzCZBH2EwjAaTLC5sQRj+O5cTrNedI+zz+QIUJRJKJpRMKJlQsm/glw8MBgOOxyNJkhBFEUop/iN8wHEcZrMZ2nQ6pVqt8o7wAc/zqNfraOv1mjzPeUewVKvVGI/HvKxWK5RSvCNYarVatNtttPv9zna7pQjB0nA45GW321GUYMnzPLTr9UoQBBQlWHBdF9d10S6XC4fDgaIEC91ul5f5fI4JwUKn00FL05TFYoEJwVCv18P3fbQsy4jjGBOCIcdxEBG0/X6PKcHQaDRCS9OU5XKJKcFAo9HA9320OI4JwxBTggHXdRERtM1mgw3BgOM4aEmSMJlMsCEY6Pf7aOfzmSzLsCEUVKlUaDabaHmec7vdsCEU9Hw+CcMQ7XQ6YeuHgh6PB0EQoJQiiiJsfQGKEgklE0r2B2eQdrbFNG1zAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

label: 4

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACXUlEQVR4Ab3BPUgCYQCA4fe+bmkIKUJpiX6gxa0pCksaAglaoqkwyEANGqJAkIh+ZoeWbrIaXKSghm6RQHBwU1qconIq6AiFpEHIL26LyLvL4J5HASQuErhM4DKBywQu6wL2seH1etF1nbGxMR4eHqjX61jxeDzMzc3x9PREq9XiO4GN3t5eKpUKk5OTjI6OUq1WseLxeCiVSmQyGYaGhvhJxUJ/fz/ZbJa+vj5OTk7Y3NzEzu7uLsPDw0SjUe7v7/lJYGF8fJxgMIjp8PAQO36/n+3tba6vr8lms/xG0IbX62VxcRFTJBLBMAys+P1+bm9vMV1dXfH+/s5vVNpIpVKsrKxQKpW4uLjATiAQwOfzcX5+TiaToR2VNqSUtFotnp+faTabtNPd3U0ymWRjYwMpJWtra1hRsTE/P08ul6Ner6NpGt/NzMwQDAaZmJjAdHl5iR2VNo6Pj5mdnWVgYIDp6WkURWFhYYHvFEVBSonp8fGRZDKJnS5gn1+8vLxwdnZGLpfj9fWVqakpDMNA0zSKxSLFYpF4PE48Hsek6zqnp6fYUbFQq9XI5/Pk83kSiQQ/jYyMoCgKd3d37Ozs4ITgH/b29pBSkkgkMAwDJwQdWlpaIhwO02g0eHt7wylBh0KhEKabmxvK5TJOCToUCoX4+PgglUrxF4IOxGIxfD4fjUaDcrnMXwg6EIvFkFKi6zqmnp4eBgcHcULlHz4/P1leXmZra4tKpcLq6ip2VP5hfX2dSCRCOp3m6OgIJxRA8keBQICDgwMKhQKaplGr1Wg2mzihABIXCVwmcNkXiOneqUmnJZkAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

label: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACdElEQVR4Ab3BTSg0cQDA4d/+ZzccrExOi3XxUdvcSBxot8RB+WouUkoOe3FULmRSLi4Urg5uSlLmOGq3JAd7cXAhyYVMSGlnaddoDltvGzvjffed5wkANj4S+EzgM4HPBD4T+EzwC+FwmO3tbdLpNKFQiL8RxKOpqSlWV1dpbm7GEQ6HeXp64rcEHjQ1NbGxsUE0GqVoc3MTWZb5LQnQcLGyskI8HicQCFCkKArJZJJ8Pk8mk6FQKOCFwEVLSwszMzM4Li4uMAyDorq6Oubn55FlGa8kQKOMeDzO9PQ0Jycn9PT0sL+/z+3tLYqiIMsytbW19Pf3c3BwgGVZuBG4qKqqwrZt1tfXceRyOXZ2dri6usK2bWzbJpvN8vHxgRcCF5OTkziGh4f5U1dXF0VnZ2e8vb3hhQRolGHbNqqqEgwGSaVSJBIJFhcX6ezs5PX1lZqaGmKxGLquY5ombiRAo4z7+3uSySTRaJS5uTlUVUVRFI6PjxkfH2doaIjGxkZCoRC6ruNGAjTKsCyLTCbD2NgY1dXVOLa2tpidneXx8ZFIJEJfXx8NDQ3ous7LywvlSICGi5ubG87PzykUCqRSKZaWlshmszhOT09RFIXu7m7q6+s5PDyknCAeGYaBYRiUsiyLvb09RkZGSCQSyLLM8/MzP5EAjX90eXlJR0cHvb29WJZFOp3mJ4IK+Pz8ZG1tjVwux/LyMu3t7fxEAjQq4OHhgff3dwYHB4lEIhwdHZHP5yklqKDd3V2ur6+ZmJigra2N7wgqyDRNBgYGcCwsLPAdQYXd3d1hGAajo6PEYjFKCf4DVVUxTZPW1lZKBQAbHwl89gWiA98KaevuzAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "{\n", " const size = 8;\n", " const labels = await mnist.getTestData().labels.slice([0], [size]).argMax(1).array();\n", " const pngs = await toPng(mnist.getTestData().images, 0, size);\n", " for (let i = 0; i < size; i++) {\n", " tslab.display.html(`

label: ${labels[i]}

`)\n", " tslab.display.png(pngs[i]);\n", " }\n", "} " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ディープラーニングで文字認識を行う\n", "\n", "MNISTのデータの素性が一通り分かったので、TensorFlow.jsを使って「ディープニューラルネットワーク」機械学習のモデルを設計、訓練し文字認識を行ってみます。\n", "初めは[PythonのTensorFlowチュートリアル](https://www.tensorflow.org/tutorials/quickstart/beginner)でも利用されている、128ノードの中間層を一つ持つ単純な\"ディープ\"ニューラルネットワークモデルを使って文字認識を行います。\n", "\n", "[TensorFlow.jsは、PythonのTensorFlowでも使われているkerasをベースにしたAPIを提供しています](https://www.tensorflow.org/js/guide/layers_for_keras_users)。そのためこの程度のシンプルなディープニューラルネットワークはTensorFlow.jsでも非常に簡単に実装できます。[Layer APIの詳細はTensorFlow.jsのドキュメント](https://www.tensorflow.org/js/guide/models_and_layers)を参照してください。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "const model = tf.sequential();\n", "model.add(tf.layers.flatten({inputShape: [28, 28, 1]}));\n", "model.add(tf.layers.dense({units: 128, activation: 'relu'}));\n", "model.add(tf.layers.dropout({rate: 0.2}));\n", "model.add(tf.layers.dense({units: 10, activation: 'softmax'}));\n", "\n", "model.compile({\n", " optimizer: 'adam',\n", " loss: 'categoricalCrossentropy',\n", " metrics: ['accuracy'],\n", "});" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "async function train(model: tf.Sequential, epochs: number, batchSize: number, modelSavePath: string) {\n", " // Hack to suppress the progress bar by TensorFlow.js\n", " process.stderr.isTTY = false;\n", " const {images: trainImages, labels: trainLabels} = mnist.getTrainData();\n", " model.summary();\n", "\n", " let epochBeginTime;\n", " let millisPerStep;\n", " const validationSplit = 0.15;\n", " const numTrainExamplesPerEpoch =\n", " trainImages.shape[0] * (1 - validationSplit);\n", " const numTrainBatchesPerEpoch =\n", " Math.ceil(numTrainExamplesPerEpoch / batchSize);\n", " const batchesPerEpoch = Math.floor(trainImages.shape[0]*(1-validationSplit)/batchSize);\n", " let display: tslab.Display = null;\n", " await model.fit(trainImages, trainLabels, {\n", " callbacks: {\n", " onEpochBegin: (epoch) => {\n", " display = tslab.newDisplay();\n", " },\n", " onBatchBegin: (batch) => {\n", " display.text(`Progress: ${(100*batch/batchesPerEpoch).toFixed(1)}%`)\n", " },\n", " },\n", " epochs,\n", " batchSize,\n", " validationSplit,\n", " });\n", "\n", " const {images: testImages, labels: testLabels} = mnist.getTestData();\n", " const evalOutput = model.evaluate(testImages, testLabels);\n", "\n", " console.log(\n", " `\\nEvaluation result:\\n` +\n", " ` Loss = ${evalOutput[0].dataSync()[0].toFixed(3)}; `+\n", " `Accuracy = ${evalOutput[1].dataSync()[0].toFixed(3)}`);\n", "\n", " if (modelSavePath != null) {\n", " await model.save(`file://${modelSavePath}`);\n", " console.log(`Saved model to path: ${modelSavePath}`);\n", " }\n", "}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output shape Param # \n", "=================================================================\n", "flatten_Flatten1 (Flatten) [null,784] 0 \n", "_________________________________________________________________\n", "dense_Dense1 (Dense) [null,128] 100480 \n", "_________________________________________________________________\n", "dropout_Dropout1 (Dropout) [null,128] 0 \n", "_________________________________________________________________\n", "dense_Dense2 (Dense) [null,10] 1290 \n", "=================================================================\n", "Total params: 101770\n", "Trainable params: 101770\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "Epoch 1 / 5\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "16931ms 332us/step - acc=0.906 loss=0.328 val_acc=0.958 val_loss=0.145 \n", "Epoch 2 / 5\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "14936ms 293us/step - acc=0.953 loss=0.160 val_acc=0.971 val_loss=0.103 \n", "Epoch 3 / 5\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "14905ms 292us/step - acc=0.964 loss=0.121 val_acc=0.973 val_loss=0.0910 \n", "Epoch 4 / 5\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "14268ms 280us/step - acc=0.971 loss=0.0960 val_acc=0.975 val_loss=0.0811 \n", "Epoch 5 / 5\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "14906ms 292us/step - acc=0.974 loss=0.0845 val_acc=0.975 val_loss=0.0796 \n", "\n", "Evaluation result:\n", " Loss = 0.077; Accuracy = 0.976\n", "Saved model to path: mnist\n" ] } ], "source": [ "const epochs = 5;\n", "const batchSize = 32;\n", "const modelSavePath = 'mnist'\n", "await train(model, epochs, batchSize, modelSavePath);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## トレーニングしたモデルを実行する\n", "\n", "98%とそこそこ精度のよい文字認識のモデルができたので実際にテストデータを使って文字認識を行ってみましょう。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "predictions: [\n", " \u001b[33m7\u001b[39m, \u001b[33m2\u001b[39m, \u001b[33m1\u001b[39m, \u001b[33m0\u001b[39m, \u001b[33m4\u001b[39m,\n", " \u001b[33m1\u001b[39m, \u001b[33m4\u001b[39m, \u001b[33m9\u001b[39m, \u001b[33m5\u001b[39m, \u001b[33m9\u001b[39m\n", "]\n", "labels: [\n", " \u001b[33m7\u001b[39m, \u001b[33m2\u001b[39m, \u001b[33m1\u001b[39m, \u001b[33m0\u001b[39m, \u001b[33m4\u001b[39m,\n", " \u001b[33m1\u001b[39m, \u001b[33m4\u001b[39m, \u001b[33m9\u001b[39m, \u001b[33m5\u001b[39m, \u001b[33m9\u001b[39m\n", "]\n" ] } ], "source": [ "const predicted = tf.argMax(model.predict(mnist.getTestData().images) as tf.Tensor, 1).arraySync() as number[];\n", "const labels = tf.argMax(mnist.getTestData().labels, 1).arraySync() as number[];\n", "console.log('predictions:', predicted.slice(0, 10));\n", "console.log('labels:', labels.slice(0, 10));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "正しく文字認識ができていますね。せっかくなので文字認識に失敗する例を可視化してみましょう。精度が98%程度あるとはいえ、人間であれば間違えないようなものが多いですね。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

予測: 4, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACbElEQVR4Ab3BTSi7cQDA8a/ffla7KFramrcbEa5uWE07yMXFSznRluYpB7c1Dg5bk8lhU5STg5IoDg9yIOWsHeSwVtJWmORla1um/0FJfzyP1fP5VAAlDCQwmMBgAoMJDCYwmOSPzGYziqIwOzvL/f09tbW1uFwuzs7OaGxsZGRkhFAoxNvbG59J/kAIQSQSobW1FZ/Px+bmJtFolEQiQXV1NUdHR1gsFtbW1ri9veUzEzCHDlVVVWxsbPD8/Mzi4iL7+/sUi0UymQxXV1ccHh5itVpxu90kk0m+kujkdrtxOBz4fD5SqRQfTk9PcTqdVFZW4vF4iMfj/I9Ep+bmZk5OTkilUnzW1tbG7u4uT09PXF9f8x2BDuFwmP7+fvx+P19NTk5isVhQFIWLiwu+I9BoaGiI4eFhent7yefzfKipqWFlZQWv10skEmFra4ufSDSQUhIKhfD7/by+vvKPEAKn00kgEKChoYHp6WmWl5f5jUSD9vZ2pJTs7e1RV1dHU1MTo6OjeL1e8vk8AwMDqKqKFhINcrkcVquVg4MDOjs7SSaTPD4+ks1micfjqKqKViZgjl/c3d2RyWRoaWlhdXWV8fFxbDYbXV1dbG9vo6oqWlUAJXRSFIWlpSXOz8/p7u6mUCiglUCn+vp6FhYWeHh4YHBwkEKhgB4SHUwmE8fHx1xeXtLX10c6nUYvgQ5TU1PY7XY6OjpIp9P8hUCjnp4e5ufnCQaDlEOiwdjYGOFwmJ2dHYLBIOUQaDAzM8PLywsTExMUi0XKIdBofX2dbDZLuUzAHD+w2Wzc3NwQi8UolUqUqwIoYSCBwd4BeFjhJ86yXVIAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAC4UlEQVR4Ab3BTyh7AQDA8e973izFQczBSqa5KX922NVBTlKihDlIiTisXKjJT9tTKwdFyGWRPwfyZ+3i6uCwA4dFWXjRTsx/si32fr3DSmt/ONjnIwAqOSSSYyI5JpJjIjkm8UPd3d1YLBbsdjsJoihydHSEz+djeXmZ+/t7spHIwuVyMTIyQkFBAXl5eaiqSkI8HsdqtWK1WqmpqaGnp4dsJDKQZZnR0VEkSULz/PzM/v4+Pp+PaDSK1+slwWw2U1paSjgcJhOJNKqqqhgYGOD29paNjQ08Hg+xWAxFUdDIsozm6uqKx8dHLBYLJpOJcDhMJiJpeL1eiouL8fv9jI2NcX5+jqIoJCwuLqIJBAK0tbVxfX3N0NAQ2YikUF5eTkVFBZmEQiFcLhctLS3U1dWhMRqNZCORQmFhIaIoollfXyedyclJSkpK8Hq9aC4uLshGJIVgMMjDwwOas7MzMpmbm+Pp6YmfEknD7XajaW1tJRNFUYhEImgkSUKSJDLJA/6RQjwep7Ozk+rqaiKRCCcnJyRrbGxkfn6e2tpaNJWVlRweHqIoCukIgEoaa2trdHV1oQmFQiwtLfHd9PQ08Xic1dVV+vr6aGpq4uDggPb2dvb29khFAFTS0Ol0NDQ0sLu7S1lZGcmOj4+ZnZ1lZ2eHSCSCJElMTU0hiiLj4+OkIgAqWRgMBgYHBzGZTGii0ShOp5O3tzdeXl74Lj8/n62tLQKBAA6Hg2QSP3B3d4fT6eQnYrEYn5+f9Pb24nA4SCbyBy4vLzEYDHR0dJBM5A+43W5OT0+x2Wwkk/glnU6H2WxGI8syqqqyvb3N5uYmCXa7nfr6ejweD8kkfml4eJiZmRk0giCgqiqyLGM0GtH09/djs9n4+vri/f2dZBK/dHNzw+vrK0VFRST4/X6++/j4YGFhgZWVFZIJgMov6fV67HY7giAwMTGBXq8nIRQK0dzcTDAYJBUBUMkhkRwTybH/hAITNyqm8v8AAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 2, 正解: 4

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACOElEQVR4Ab3BsUsyYQDA4V8vd2RKWFoNlW02NfUXWEQl1hwEEqEGjRI4JdF6iCgNbRHlUJMQgYGEg5MgBY0uEQ5lQ4Nwgxd6HzcI36B2Z3HPMwLo2EhgM8EvOJ1O7u7uyGQymCX4hfn5eba2tojFYkxOTmKG4A98fn6iaRpmCP5AoVBAVVXMEPzC4eEhmqaRyWQwSzCkhYUF9vb2UFWVWq2GWYIhra2tMTExgaIoWCEYwszMDIlEgkajweXlJVYIhhAMBllcXKRcLtNoNBgbG2N8fBwzBBa5XC7C4TAGRVGQJImbmxuKxSIej4efSFgUj8dZXV2lVCpRrVZZX19ne3sbg8/n4+vri0EEFiwtLXFwcIDh4uKCqakpzs7OMLy/v/Px8cFPJEyQZZnNzU3Oz8+ZnZ3FkM/n2djYwO/3Y2i320iSxOjoKK1Wi35GAJ0B3G43+XyeQCCAGfV6nWg0SrFYpBfBAG63m1QqRSAQwKCqKqenpxwdHVGtVunl+/ub5eVl+pHoQ5ZlUqkUkUiErpOTE9LpNA6Hg+PjYwy6rvPy8sLj4yP39/c8PT3RbDbpR6IPv99PJBKhK5fLkc1mMezs7ODxeNB1nYeHB0KhEGZJ9JFIJOh6fX0lmUzSbrcxTE9Po+s619fX7O/vY4WgB6/Xy8rKCgZN09jd3eXt7Y2uubk5Wq0Wt7e3dDodrJDoQZZlHA4HhlAoRKVS4X+KonB1dcXz8zNWjQA6NhLYTGAzgc0ENhPY7B8orrzElSix+AAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 0, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACj0lEQVR4Ab3BQShDfwDA8a/ffnYUWa3sImW11TuKHJXaapeJZ00hueGwiDj93XHYQYijA8NNbm85OKwmx2nTvIO31vNy4qDk/XsHpWXb4/9vn08bYNNCghYTtJjkFxRFQdM0fD4fAwMD5PN5fkvi0uHhIdPT03g8HorFItVqlb+QuBSJRPB4PJRKJSKRCE9PT/yFxIXd3V38fj/FYpFoNIqu6/yVwIWJiQmEEKiqiq7r/BeSJubm5ujs7OT09JRCocCXnp4eRkZGcGiaRqVSwQ1JEx0dHQghyOVyfHx8EI1GWVtbo6+vj0AggMMwDN7e3rAsi3Q6TT6f5/HxkZ9ImlhYWMBxcnJCLBYjk8ng9Xr5LhAI4AgGgwwPD1MoFIjFYui6Ti1JAzMzM/T29uJYXl4mHo/j9Xq5ublha2sLwzD4bnJykmQySSgUYnFxkZWVFWpJGvD7/QghcKRSKRymaTI7O0u5XKbW7e0tl5eXaJrG0tISuVyOTCbDd4JfeH5+JpFIUC6XqadUKmGaJlJKBgcHqSVwybIs9vb2uL6+ppFKpUIikcAxPz9PLYlLiUSCbDaLGw8PD9QjcOn+/h63fD4f9Qj+Z+3t7WxsbOA4OzujlqCBq6sr3t/fcUxNTdHV1UUz4XCY8fFxXl9f2dnZoZYH+Ic6TNMkFAqhKAqjo6PE43Fs2+bu7o7Pz0++k1ISDAY5Pz+nu7ub4+Njjo6OqCVpYnt7G9u2GRsbo7+/n3Q6zdDQEJZl8UXTNFRVJZlM8vLyQiqVIpvN8pM2wMYFRVFYXV1FVVWklPykWq2yubnJwcEB9bQBNr8QDodZX18nmUzyxTAM9vf3ubi4oFAo0EgbYNNCghYTtJigxQQt9i9OGuueI3tJoAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 7, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACF0lEQVR4Ab3BMUgyYQCA4devw7xcoiHdBEGNnAIdjDahJbcG8YIQXNwaGuKaLvCanNPNHGpocGppEoOGiECDoKHldHFQokVp6X5uEJr0O3+45/EBNh4SeEzgMYHHBB4TeExB0vr6OrFYDE3TcJycnGDbNjPD4ZDd3V0sy2IeBQlHR0ecn5+TSCSYsW2bXq+H3+9na2uLUChEOBzGsizmUVhA0zTq9TqqqvL19UWr1aLX6/H4+IhlWSiKwmAwIBAIoGkaz8/PzKMwx9raGqVSidfXVyqVCk9PT0ynU/5SVRXbtnHc3d2xiMIck8mEbDbLPKenp6iqyufnJx8fHywi+A/pdJqzszMctVqN8XjMIoIlCSHY399HVVW+v79pt9vIECypVCpxcXGBQ9d13t7ekCFYUi6Xw9Hv92k2m8gSLGFnZ4dcLoejWq3y8/ODLIFLwWAQwzAQQtBut7m6usINgUvFYpGDgwMmkwmNRgO3BC7EYjEuLy9xVKtVbm9vcUsgyefzoes6wWAQx/39PcsQSDo8POT4+BjH9fU1Ly8vLEMgKR6PM2OaJn/l83lkCSSlUikclUqFfr/P6uoqhUKB9/d3RqMRshQkZTIZHBsbG2xvb3Nzc0MkEsE0TTqdDrJWAAMJ0WiUVCpFOp2mXC6zublJs9lE13V+f3+RpSDJMAz29vZIJpN0u11M0+Th4QG3fICNhwQe+wcV5qyAvWr8fAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 3, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACEElEQVR4Ab3BsUsyYQDA4d/73iFGVpvGDamDDkFIQoEtt0qC4t6m0hROkW0O/QE6N7a6hOiatrVc4W1tgaAELh4EDXkfDkIE33WvwT2PAFwCJAmYJGAa0GRN6XSaTqdDKBTCsiz80FlTOp2m1+uRTCZJJBLc3t7ih84a6vU69Xqdvb09lt7e3vBLokjXdfb394nH4yy9vr5ydnaGXxJF5+fnVCoVVmazGePxGL8kCgzDoFqtIoRASokQgsvLS1RIFMTjcQ4ODnBdl8ViQbfbxbIsVEgUOI7DbDZjJZfLkUqlUKEBTXx6f38nlUqRzWYRQrCxsYGUkn6/j18SRTc3N3xXLBbJZDL4pQFNFMznc3Z2djg5OWFpa2uLQqFAq9XCDw1ooujp6Qnbtsnn8+i6zubmJtFolMlkwnQ6xYsGNFH0+fmJbdscHx9jGAbhcJijoyNKpRJ3d3d8fHzwP5I/KJfLNBoNVnZ3dwmFQniR/NFoNEKFzi9M02RpOBzyU61W4/r6GiEES1JKfqPjwTAM7u/veXx8JBqNslIsFjFNk1gshqZpuK7Ly8sLpVKJ6XSKFx0PmqYRiUQoFAqcnp7ynRAC13VxHIerqyu63S6TyYTf6Hj4+vrCcRy2t7f5aTwe8/z8TLvd5uHhAb8E4OLBNE0ODw9Zuri4YDAYYNs2rVaLdQjAJUCSgEkCJgmYJGD/AGqjn0I7N7RsAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 7, 正解: 3

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACc0lEQVR4Ab3BTyizcQDA8e/z20PCalbIIy7Sam7S7DLlIIed1KI4kIviJBeR2sVhjm520E4uJM2fA01xcVgRy7PVRA7WI/S0y7Zmba/V+9Z72IzR8/lIQAEDCQwmMJjAYAKDCQwmMJhMCc3NzayuruJ0OolGo6yvryNJEvf39yQSCX5CAgp8cLvd+Hw+Ojs7kWWZuro6np+faW1tJZfLIYQgm82Sy+XY3d1la2uLonA4jK7rfJXMX8vLy9jtdm5vb0kkElxfX3NyckJNTQ26rlNbW0t/fz/Dw8N0dHSwvb2N2Wzm7e2NtbU19vf3icViVCIBBT7Y7XYCgQCqqjI1NUUlTU1N9PT04PF4mJyc5Onpibm5Oc7OzviMCfDy4eXlhZ2dHYLBIO/v71SSyWTQNI14PE53dzcul4u2tjZaWlqIx+Ok02lKkfmPrut8ldvtZmNjA4vFQn19PUUOh4OhoSFubm4IhUKUIlMlRVFQFIWiSCRCe3s7KysrJJNJQqEQ5chUKRAIMDAwgMfjYXFxkaurKzRNoxIT4KUK+Xye8/NzLBYL8/Pz9Pb2cnh4SDab5TMmwEuV0uk0x8fHRKNRlpaWcLlcRCIRNE2jHBPg5Qfy+Tx3d3fs7e0xOzuLzWbj9PSUVCpFKYJf0NDQQF9fH1arlZGRES4vLylH5gcURWF8fJyZmRm6urooymQyHB0dUY5MFZxOJ2NjY0xPT2M2m/knmUyysLDA5uYm5ch8w8TEBIODg4yOjtLY2EiRqqpcXFzw8PCA3+/n9fWVz8h8QzAYxOFwEA6HicViHBwc8Pj4iKqqfJUEFDCQwGACgwkMJjDYH4E96wSz3NFtAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 3, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACo0lEQVR4Ab3BTyi7DQDA8e+eHo9JKH+iLK56InGTIjdKTUlODha3qaF4aodFNJe5KQ5TaMVBedxoS41cnoPkoEQpJZrJntTs0ba35/DWr7fNnvm97fOxAVlKSKDEBEpMoMQESkykSG63m87OTnp7e2lra+NP+/v7BINBIpEI+YhY5PF4mJycRJZlBEHA9P39jWEYmMrLyxkfH0eWZXp6ekgmk+QiUoAkSfh8PjweD3a7nfPzc1RV5eXlhfv7ezRNw7S8vIzX68UwDDKZDPmIFDA9PY2iKOi6ztDQEBcXF2QyGf5kt9txOp2Y1tfXSaVS5CNSQFVVFaaPjw+i0Si5DA8P097eTiqV4uHhgZ8IFKBpGrFYjGg0Si6tra0EAgFMLpcLTdP4iUgBkUiEjo4OdF0nl/7+fhwOB6+vr4TDYQoRsSAWi5HL/Pw8q6urfH19MTMzw9vbG4UI/FJdXR1ut5uysjLW1tY4PDzECoFfWlpaoqWlhePjY1ZWVrBK4BcWFxcZGxvj5uaGqakpstksVgkUqauri9nZWerr6/H7/cTjcYohUgRJkjg6OqKhoYG9vT1UVcVks9morq6mu7sbRVF4f3/n7u4On8/Hf4lYVFFRwc7ODg6Hg1AohMvlorm5mYGBAUZGRnA6nZiurq5YWFjg+vqaXEQs2t7eZnR0lEQiwcbGBoFAgImJCWpra/n8/CQUCuH3+3l8fCSZTJKPiEV9fX2YampquLy8xJTNZpmbm+Pk5ITb21usECmgsrKSra0tGhsb+dfz8zMHBwf4/X7i8TjFEPlBU1MTwWCQwcFBTGdnZ6iqyu7uLolEgt8QyUOSJMLhMLIso+s6Xq+Xzc1N0uk0f0Mkj3Q6zdPTE4ZhoCgKp6en/B9sQJYSEigxgRL7Bwoq/Wljo54uAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 2, 正解: 8

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACm0lEQVR4Ab3Bzyv7fwDA8efr9X5z0H7IxVouO8ztXWa1m5KTlMROIiWEHSgHR9HaRMgJKYs/YQ67qE05rFxMbly3zImayOX1+rbDu9ba2+bzrT0eAtC0kaTNJG1m8j+Ew2Fubm74+PhgdHSU5+dnmjGAbf6oq6uLVCpFPB7H4/Hg9XoZHh7m7OyMZkz+yLIsUqkUoVAIIQRaa6pub29pheQP/H4/6+vrhEIh6s3PzzMzM0MzBrBNixKJBEtLS9iEENg6OjqYnJzE6/Xi8/l4fHykEUmLwuEws7OzCCEQQiCEQEqJEAIhBEIIhBBsbGwwNjaGEwPYpgXJZJJIJIKtUCgQiUTIZrP09vYSCASwBQIByuUyhUKBeiYtmpubQ2tN1f39PdFolNfXV0qlEu/v74yMjGD7+vri7e2NRkz+wcXFBd/f37jdbrq7u1lYWKBWNpslk8nQiMk/ODg4YGVlhc/PT4aGhqh3fX2NE5MWHB4eIqVEKUWVx+NhcHAQKSVKKWpNTU2RTqdxYtLE6ekp09PTKKXQWlNLKYXWmlrpdJrfSH5hWRbRaBSXy4WtUqkQi8XY29ujkd3dXTo7O3Fi8ovV1VV6enqw5fN5tra2yOVyVLndbpaXlzEMA9vm5iaVSoVkMkkjEgcDAwOMj49T6+TkhFwuh21tbY1yuUw9y7JwYuKgv78fv9+P7eHhgUwmQ5Xb7WZxcZGjoyOUUtSSUnJ3d4cTEwdaa7TW2ILBIPF4nImJCQzDwOfzoZRCa02tvr4+yuUyTkxa5HK5iMViOPn5+WFnZ4dSqcRvTBzk83leXl4IBoM4KRaLKKWoOj8/Z39/n2ZMHBSLRS4vL0kkEtS7urri6emJ4+Nj/koAmjaStJmkzSRtJmmz/wBm3eICiv1o+wAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 3, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB3UlEQVR4Ab3BMUsyYQDA8f89HpTTgd9AhBuChiCPCG4IHRyiwbkh8ANISzQegUMkgovTCS0215BfIeikIcGhTUcDpSHFO/V5uS3eobvn3pf7/TRAkiJBygQpE6RMkDKdCLVaDdd1WS6XPDw80O12eXl5IakM4PCLvb09bNsmCAKOj485Pz/HsiweHx9Zr9eoygAOvxgOh9zd3dFut/n8/CSbzVKpVCgWizw9PeH7PioygEMMm82G19dXnp+fOTo6olQqMRqNGA6HqBAoms1mnJycELq+vkaVTkLT6ZRCocDFxQWXl5eMx2POzs6IopPQeDzm8PCQVquFYRhst1viECRULBYJGYZBaDAYEIfgP/n6+iIOnQimaWKaJpPJhGq1SqlU4m+dToebmxvi0Ilg2zau6yKl5CdN0whdXV3RbDaJSyfC+/s7t7e3SCkxTZOPjw92d3ep1+t8f3/T7/dRoRPB8zw8z+Mnx3EILRYLRqMRKgSKdnZ2OD09JdTr9VAlUJTP5zk4OCC0Wq1QJUhA0zQ0TeP+/h5VggSklEgp2d/fR5XgHxiGgaoM4KBgPp+Ty+WwLItyuUy1WqXX6xEEAXEIFG02GxqNBqFsNsvb2xu+7xOXBkhSJEiZIGV/AC07pd53WH9RAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 2, 正解: 8

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACMUlEQVR4Ab3BPU/qUACA4fcc6lLmzji44MhmxMR/IKdhlMSByGjipBgTEhUnVhNx82uznZxJ6GIcYPPoRnQxUFccjBzjcBOHe9uCN30eARhSJEmZJGWSlFnMaDKZ4HkeQggeHh7Y398nCYsZGWMolUoIIVhbW6Pf7+N5HnEyQIMZvL6+cnt7y9LSErZts7CwwNnZGXEsZtRut/lWKBSoVqskJfkPhBAEQUASkl9SSmGMwfd9kpD8ku/7CCEIgoAkLGbkOA67u7sopdBak5RkSrlcDtu2WV9fZ2tri2w2S7lcJinJlO7v71FKsbOzgzGGZrPJ4+MjSUmm4LoujuNQr9dxHIenpyeazSbTyAANYuTzeWq1Gq1Wi7m5OU5PTwnDkGKxyOfnJ0EQkJRFjFwux+HhIUoput0u8/PzXF9fk81m0VpzcHDAYDDg6uqKJCxinJ+fs7y8zGg0Ynt7m+fnZ8IwxLZttNb4vk+9Xuf9/R3P84hjEcFxHFZWVuh2u6yurvLTeDzmW6/Xo1wuMxwOGQwG9Ho9okgiKKUwxuD7PnEqlQqLi4vEsYgQhiFvb29sbm7y8vKC53n8jeu63NzcMJlMuLy8JEoGaPAPWms+Pj4oFApsbGwghCAIAn7a29uj1WphWRZHR0d0Oh2iZIAGEe7u7uh0OriuS61WYzwe88fFxQXFYpFv1WqVk5MT4lgkoLWmUqnwUz6fp1QqcXx8TLvdJgxDkhCAIUWSlElSJknZFw7f14zfy+abAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB/klEQVR4Ab3BMUsyYQDA8b9PJ06aQ0EO4gmtNjk4iIQcSJpQY6sW5NAUbg5vhLQEieIoCdYiGEgtfoA+QB50gzhdgosSSIPB0cs7vNCSPadwv58L+MJBAocJHCZwmMBhCkvY3NwkHo+TzWYJBoNomsbj4yMvLy9cXl7y+fnJTxRs0jSNq6srIpEIpmlyf3/P8/MzR0dH7O/vMx6Pqdfr/ETBhkqlQi6XYzqdcnp6SrPZ5L9Wq8VgMMDr9bKIgqSbmxvOzs5oNBoUCgUsy+K7cDiMDAVJ/X6fw8NDer0elmXxndvtplQqMRwOabVaLKIg6fb2lp9cX1+TSCQ4Pz9nNBqxiGBFyWSSk5MT2u021WqV3whWsLGxwcPDA5PJhGKxiGVZ/EawJL/fT6fT4ePjg1QqhWmayBAswe/38/T0RDQaRdM0Xl9fkSWwyefz0e12CYVCpNNpDMPADgUbdnZ2qNVqbG9vo2kahmFgl4Kk9fV1Go0GW1tbFAoFDMNgGQoSfD4f3W6XQCDA3t4euq6zLIGEdrtNIpGgXC6j6zqrEEhQVZV+v8/d3R2rEkgyDIPZbMaqBJJisRiqqrKqNeAPv/B4PGQyGfL5PLu7u7y9vfH+/s58PscuF/CFhEgkwsXFBQcHB/wzHA4ZjUaYpsnx8THz+RwZLuALBwkcJnDYX4sWr24HGFWIAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 1

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABi0lEQVR4Ab3BMU7qAADG8X+/OhDnMhF3DsHiBUzTiTTSA3gCRjdOQOLYqV4A2CGEkbmyoZuycAC/vri9mLzXFk1/vwCo6JDomOiY6NgVNe7v78nznC9ZllEUBT8RAo/8x36/xzZVVRHHMe/v71xfX/P6+solREvz+Zz5fM5oNOISokaWZXw3HA4ZDodcQtQ4HA5IQhKSkIQknp6eSNOUtkSNj48PNpsNtrGNbWxjmzzPaUvUOB6PPDw8sN1u+Q2igbIseXl54TeEwCMNLJdL7u7uGAwGfAmCgCAIGI/HLBYLzuczTYTAIw1FUcTt7S22qaqKqqqIooher8dqtaIJ0cJsNuOnxC9IkoQ4jmniipYk8TdJ9Pt9oiiiCdFCkiTYxja2sY1tbDMajYiiiDqihel0yr+kacrNzQ11RAtZlvFTooWyLDkcDkhCEpIIwxBJSKIJ0dJkMsE2trHN5+cntlmv15xOJ+qIlo7HI0VR8N3z8zNvb2/UES2dTid2ux2XCoCKDomOiY6Jjv0BUHufRDVXJBYAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACOUlEQVR4Ab3BP0s6cQDA4Y/fvmINihAeklBObQ6JLYEvQOQGESIbil6Ei0stOTnYEkFbWRY4HBjNEYFBQUVBW5OBUZJw9EcR7kfDQUhX3v3gnscDGLhI4DKBywQuE7hM4tDk5CS1Wo1EIoHH46FUKpHP5/mLxKa5uTkKhQLhcJiZmRkMw+D19ZX9/X2GIRlSKBRifn6e9fV1/H4/3wWDQXK5HFdXV/xF8otAIMD4+DiZTIalpSVisRj/S2JhbGyMSqVCOp1m0NHREd1ul2w2i10CC6Ojo6TTaQadn5+zvLzM4eEhTgj+sLe3h6ler1Mul+l0OiwuLuKE5BfNZpOpqSkikQhfdF3n7e2NL6lUCickFt7f31lYWMDn89FqtfhuZWUFKSVOCCx0u10ajQYnJycMqlQq9Pt9TK1Wi0KhwDAkNsViMVZXV/F6vZgMw6Df7zMMgU2hUIhMJsPp6SlOCGzq9XpsbGxwcHCAqVgsMiyBTWdnZwQCAba2tjDd398zLIFN09PTBINBTJqmcXl5iUlRFKLRKFZGgDVsuL29JZFIYPr8/ERRFHw+H/F4HFVVKZfLNBoNHh8fGTQCrGFDs9kkm81iCofDJJNJVFVldnaWu7s72u02u7u79Ho9Bklsen5+5icXFxdomoaiKOTzeXRd5ycCm9rtNsfHx2iaxsTEBKbr62s2Nzd5eHhASokVgU03NzeoqsrHxwcvLy9sb2/T6XSoVqt82dnZ4enpCSsewMBFApcJXPYPBq/FwgUo0fEAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 3, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACqUlEQVR4Ab3BwSu7DxzA8ffnYc1Ew3YwcaCWWlKTtVqODiZ/gXZzcHNBuYirxM1VibKDk6t6XOzgMqc5jEY5rJ5iZA82s8/PDqsdvmb7qb1eAigtZNBiBi1m0GIGLdZODYfDgcfjIRAI4PV6CYVCRKNROjs7OTk5oWJ3d5eXlxfe39/5PwRQvg0MDLC0tMTKygpVIoKqUktESCQSbGxscH5+TrPagE2+ra+vs7y8zOPjI4lEgkwmQyaTwbIsBgcHqRIRhoaGGBsbIx6PUywWaYYAyjefz4fX6yWfz3N3d0eVy+Vienqa1dVVIpEIIoKqUhGLxYjH4zSjDdjkWz6fx7Isnp+fqVUqlUin08TjcYLBIH6/n6rZ2Vmurq64vb2lUW3AJg0olUocHx8TDofx+/2ICA6Hg/n5eXZ2dvj8/KQRBk1aWFhAVVFVVBVV5fT0lEYZNCmXy2GaJrUmJycJBAI0wqBJhUIB0zSpVS6X+fj4oBFtwCZNury8xOVyEYlEqOjo6CAUCrG/v89v2mlSf38/0WiU4eFhRIQKwzBwu904nU4KhQL1CKD8YmRkhHA4zMzMDLFYDFWlloigqpimydraGslkkp8IoNTR3d2NaZoEg0EqRARVpZaIoKpUZLNZxsfHyeVy/Es7v+jt7eXp6YmqZDJJKpWiYm5ujp6eHqqy2SxbW1t8fX3xEwGUXzidTtxuNxW2bWPbNhWLi4vs7e0hIqgqZ2dnRKNR6jFoQKFQwLIsLMvCtm2qLi4usG0bwzAQEUZHR/H5fNRj8AepVIr7+3vK5TKqSl9fH11dXdRj8EeHh4dUpdNppqamqMfgjw4ODri+vqZiYmKC7e1tPB4PP2kDNvmDt7c3Hh4eKBaL3Nzc8Pr6ytHREcVikX8RQGkhgxYzaLH/ABleDKN3QlB6AAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 4, 正解: 8

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACrElEQVR4Ab3BP0hqYRjA4d/3nYLihEpgg0UILWGtUREUIgk1SEtk0B9oaY2IGhoUGtpKiGpLaAyErKCpTKfgrFKz5BJnsCGkIHwvZxAu4q2rgc+jAKGFNC2maTFNi2larI1/6OnpYWlpiUgkwuTkJCKCZVns7u5yd3dHswwgTh2np6dsbm7S39+PQ0Tw+XxEIhH6+vq4vb2lGQYQp8bCwgKxWAylFI7p6Wl2dnawLIv5+XnGx8d5eHigUCjQKE0d6+vrKKVwJJNJMpkMtm2TSqVYWVmhXC6TTqcJBAI0SvODw8ND/pZKpVheXsblcpFIJOjs7KQRmjqUUiilUEoxNzdHrXQ6zdXVFaFQiNnZWRphAHFq+P1+xsbGMAyDYDBIMBjE4/Hw/v6Obds4bm5umJmZIZlM8vr6yv8ygDg1stksXV1dTExM4PD7/YTDYVZXVxkcHOT5+Rm/38/W1hYvLy/k83ncbjemaWKaJqZp0t7ezsfHB7UUINQRCATY2NggGo1imiYiwt+UUogIT09PuN1uent7UUohIjiy2SyhUIhaBhCnDtu2ub6+5uLiAsMwKJVKDAwMUKWUwuH1enG5XDiUUlQVCgXOz8+ppQChAWtra+zt7eHz+ahUKlSVSiVisRgigmVZWJZFPW006OzsjI6ODo6OjhARqsrlMsfHx/xE8wufn5+Uy2UcPp+Pk5MTfqL5hcfHR8LhMLZt41hcXCQQCPAdTRPy+TyOqakpRkZGyOVyOFwuF16vl++00YRcLsfb2xsej4dEIkGV1pru7m6+o2lSNBpFRBARRAQRoVKpMDQ0xHc0TcpkMtzf31NreHiY7xhAnCZUKhUymQxaa0ZHR3FcXl5ycHBAsVjkX9r4hWKxyPb2Nl9fX5RKJfb39/mJAoQW0rSYpsX+AOOj9HjadnAbAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACk0lEQVR4Ab3BoUs7fxzH8ef7fmvGr8uLd2c8NbkdWMZsm5hEq+ifsCD8gtySQZO4IIgahG3JoM25KoLBz+UZDLtVbb5+LAgi/tx++GOPhwFiijymzGPKPKYsxw/iOObo6Ajf9+n1ejjnGAnDkFKphCTMjM3NTc7Pz5lEjh8EQYDv+0iiWCyytLSEmSEJSbTbbdI0pdPpMKkcP7i7u8PMGNnZ2eGzu7s7nHP8Vzl+4JxDEpLIsox2u81veYzR6/UwM+r1Ov8HjzGSJEESQRAQBAG/5THG9fU1Dw8PzMzMUCgU+C2PCTjnkES9Xue3ckyg0WiwsbFBqVQijmO63S4fKpUK1WqVra0tJDEcDllZWeH+/p7v5JiAcw5JSCIIAgaDAaurq1SrVaIoQhKSkMSfP3+4urpieXkZ5xxfGSAmcHt7S7FYxMyQhJkhCTOj3W5zcXGBc45Wq4Xv+wyHQxYWFuj3+3z2F/A3E3h5eWF9fZ0RSWRZxtnZGdvb2zSbTR4fH8myjJOTE8IwJIoiCoUCl5eXfJZjQnNzc5gZZkaSJOzu7vKd19dX1tbWeH9/p1arkc/nGQwGfPCYkO/7SGIwGNBsNhlHEpKo1Wp85jGhm5sbnp+fOTw8pN/v85M4jjEzzIzj42M+yzFGGIacnp6yuLhIt9slyzLGqdfrSMI5x1ceY1QqFaIoIo5jsixjnL29PcrlMp7n0Wg0+CrHGL7vI4n9/X2azSYf0jQlCALSNCUIAkZqtRrlchlJtFotOp0OX+UYI8syzIz5+XmiKMLMkISZIQkzQxJmhiTe3t5IkoQkSfhOjjGSJEESs7OzjIRhyIhzjjAMyefzPD09kWUZIwcHB6Rpyr8xQEyRx5R5TJnHlP0DOcgudPDImF4AAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 9, 正解: 4

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB00lEQVR4Ab3BsWrqUBzA4d85N0OhqO2oS4lDlqKDFQUVoc0j+CguLoX7CqVzoRAQEaEUOvgAVbtERGyGDhm7ieDSQeF/yRC4kx4byPcpQEiRJmWalGlSpkmZJmUWv5DL5Xh7eyPy/PzM09MTpixOkMlkcF2XxWJBo9FAKUWtVmM2mxEEASY0hq6vr1ksFgwGA7LZLB8fH0Qsy6JcLmNKY+Dy8pJ+v49t2wRBwHK55PX1lVin08GU5gjHcRgOh5RKJVarFc1mk8hoNEIphVKKQqGAKc0B9Xodz/O4u7tDRHh5eWG/3xMJwxARQUQolUo4joMJiwO63S7VapXY/f09t7e3DIdDPM8jdn5+ztXVFV9fXxxjcUClUiEWhiHT6ZSLiwseHh7o9Xr8hsUB7XYb13UJggDf94nd3NwwHo+JKKU4heaA7+9vPM/D933+5/s+juMQERFEBFOaX9psNnx+fnIqTQLz+ZxYsVjEhCaB2WyGUgqlFI1GAxOaBCaTCT8/P4gI8/kcE5oE8vk8Z2dnRGzbxoQmAd/32Ww2RCqVCiY0CazXa3a7HUopWq0WJiwSEhFEBFOahEajEaf4A/wlgff3d7bbLbZt8/j4yDEKEFKkSdk/KomhI1/dHzcAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 7, 正解: 8

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACpElEQVR4Ab3BTyh7AQDA8e97XmHLK9FQpjUlCk9JinIg7OCV/ImSWrlSLjhIxGENuSrj4GIXO4m80hQXh5UVDtOknJ7sIJSexfu1q9g8fu3zEQCTLBLJMpEsE8kykSyTyKCiooL29nba2tqora2lqakJXdcpKCjA5XKRSCSwQgBMvjE0NITP58PhcBCLxQiFQgSDQV5eXvB6vVxcXHB4eIgVAmDyid1uZ319nZGREa6urpiamkLTNP4HkS8IgkBjYyOCILCzs4OmafwvOcACn7y9vWEYBh0dHXR2dtLS0oLNZiMej2MYBpnk5uaSYpomn+UAC3zh/Pycvb09ZFmmr68PVVXp7e0lkUhQXl7Ozc0NX5EkiVAohKZpvL6+8pkAmKQhCAJ5eXmMjo5SX19PV1cXbrcbwzDY3t5mcXERXddJKSkp4ezsjPHxcfb39/mKAJhYIMsyiqKgqioej4fi4mK2trbY3d1ldnaW5+dnxsbG+I4AmPxSaWkp09PTTE5OkhKLxaipqSEdkT/QdZ3Ly0usEPmD6upq5ufniUQiXF9fU1hYSFlZGemI/JLNZuPo6Ii7uzu6u7uJRqM4HA5cLhfpSPxCfn4+x8fH3N7eoqoqT09PyLJMPB4nEomQjsgvBAIBFEVhYmKCx8dHGhoa8Hg8GIZBMpkkHRGLmpubGRwcZHNzk2g0Skp/fz8pfr+fTEQssNvtbGxs8PDwwNLSEilVVVV4vV7C4TDBYJBMRCxQFIW6ujpOT0+5v79HkiRWV1cpKipibW2N9/d3MpGwYGZmhhS/309lZSXhcBin08nc3BwHBwf8hIQFbreblOHhYQYGBnA6nQQCAVZWVvipHGCBH/r4+KCnp4fW1lZOTk7w+XwsLy+TTCb5KQEwySKRLBPJsn+O4elrB6ZX1wAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 7, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAC50lEQVR4Ab3BzSu7AQDA8e+zPZfVY+bAlO1gUi5KjSQvKcnLckKu/gAvpUm2ZM0SJS0n2cjNTPJy0YpyQShql2miLLODg0Ustjy/noPSr3mvfT4CIJNBKjJMRYapyDAVGaYiw0R+wWg00t3dzZuOjg4uLy85OTlBsbOzw/7+PumIfENtbS1tbW309/ejEAQBURQRBAFZllEUFhYSiUTo7e1ldHSUQCCAxWLhfyL/KS8vp6amhuHhYUKhECaTCb1ej1qtRqVS4ff7icVi3NzccH5+zvb2NgpZlnl6emJiYoJoNEpLSwvpiLzj9/uxWCxoNBoUubm5KJaWlojH48zOznJ2dkYymSQdjUaDx+NBcXR0RDoi7xQVFaHRaHjj8/lwuVyEw2FSqRRfqauro7W1lWQySWNjI+mIvNPQ0IBOp+PN9fU1qVSK72hqamJlZQXF6ekpDw8PpCPyTjweJx6P81OSJDE0NIQkSaRSKcbHx/mIyB9lZWXh9Xqpr6/n5eWFnp4eNjc3+YjIH5jNZgYHB+ns7OT5+ZmNjQ28Xi+fEfklrVbLzMwMVVVVKCYnJ3E4HHxF5BdKS0tZWFjAbDaTSCSw2+0sLy/zHSI/pNVqsdlsmM1mFJFIBLfbzRu1Wk1eXh6xWIx0RH6guLgYp9NJV1cXisPDQ+x2Owqj0YjBYMBms7G6usri4iLpCIDMN1RUVBAIBNDpdCQSCVwuFz6fj4KCAvr6+igrK2NtbY2DgwPW19f5iMg3GAwGrFYrOp2Ovb09xsbGCAaDWK1WBgYGuL29ZW5ujpGREb4i8oX8/Hx2d3cxmUwopqamqKysZH5+Hr1eTzAYpL29nYuLC75DAGQ+UF1dzdbWFpIk8UYQBGRZ5v7+nunpaZxOJz8h8omSkhIkSeK9x8dHPB4Pbrebq6srfkrkE8fHx9zd3ZGTk8Pr6yuhUIjm5mai0Si/JfKJYDCIw+EgOzubcDiM3+/nrwRAJoNUZNg/UM0OTRHEhpMAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 5, 正解: 3

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAC8ElEQVR4Ab3BPUhybQCA4fuoUYMhSVAuboUNQTQ0qIcWi6AoaBJtKIPaW7TNppKGln5AaBGNFpWioSEwMFKChkJQMir6GY5Dk6Vp8Xw4BBGl+X7gdUmAoIFUNJiKBlPRYCoaTMM/sFgsVNhsNtxuN0dHR0SjUWKxGHd3d1QjAYIqmpqa0Ol0FItFFhYWsNvtmEwmhBB8JUkSPp+PxcVFqtFQw9bWFjMzM9zf32M0GvkuHo8jyzJ/paGKtbU1XC4XQgiMRiPZbBa32002m0UIwdzcHP39/VRcXFxweHhILRqqUBSFT/F4HKfTydPTExVer5epqSn0ej1XV1eMjIygKAq1aKhiZWWF5eVlKlKpFEtLS3R3dyPLMkII0uk0GxsbeL1e/koCBFXIskwkEkGv1/NpdXWVcDhMOp0mn89TDxU1xONxzs/P+aqtrY329nby+Tz1UgNeagiHw6RSKYQQ6PV6BgcHsdvtTExM8Pz8zO3tLe/v7/yFBAjq0NHRgdlsZnt7G51OR0U4HCYQCHBwcEAtasBLHV5eXshkMvh8Pk5PT7FYLFitVhwOB+VymXg8TjVqwMs/urm5YXd3F0VRGBgYYHh4mGKxSDKZRAjBT9SAl//h9fWVRCLByckJs7Oz2Gw21tfXKRQK/ETFNxqNBq1WS73Ozs64vr6mwul08hsV3zidTpLJJA6Hg3qUy2U+Pj6oaG5u5jcqvtnb20OSJILBIPv7+8iyzF90dXVhMBiQJIlcLsdv1ICXL4rFIoFAgL6+PoaGhhgbG+Px8ZGHhwfe3t74SUtLC8FgkJ6eHkqlEvPz8xQKBX6iBrx8UyqV2NnZ4fj4mPHxcVwuF9PT02QyGbLZLJ8MBgOTk5P4/X4sFgsVm5ubRKNRfiMBgiq0Wi1WqxW/309nZyehUIhcLkdvby9ms5nW1lYqLi8v8Xg8xGIxSqUSv5EAwR/o9XpMJhMVHo+H0dFRKkKhEJFIhEQigaIo1CIBggZS0WAqGuw/uS8sn7ydqRwAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 3

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACSUlEQVR4Ab3BvUsycQDA8W+/O0Upi1qK1nIMRGj1DISCIIMaInBobChqcRCMqy1o6cV/oMUh0M0EcXCLlDiEXrZbInpZKlLIt3u4wfHRO4P7fIYAAwcJHCZwmMBhAocJHCZjkcvlwuPxsLOzQyQSYWFhgU6nw+XlJVtbW1gl04fb7WZ+fp5EIsHi4iJdnU4HwzBYWVkhEAigaRpWyPSxtLREJpOhS9d12u02fr8f09jYGLOzs2iahhWCHqampjg+Psb0+fnJ9vY2c3NznJ6e0vX6+srNzQ1WSYDKf/z8/PDy8sL09DR7e3tcXV3RarUoFou43W4ajQYHBwcUi0Wskukjm82SzWbpisfjeL1eTOVymVQqhR0CG6LRKEdHRwghuLu7Y319HbsENiiKgizLmDKZDB8fH9glsGF5eRlTpVLh7OyMQQgGUCgUqNVqDEICVCz6+vpidXWVUCiEEIJyuUyz2cQOCVCxqFqtMjk5STAYJBwOs7u7y+3tLbquY5UEqNiQy+XQdZ1wOIzP5yMajfLw8EC9Xuf7+5t+JEDFpmq1Si6XQ9M01tbW2NjYQFEU0uk0jUaDXiRAZQDv7+/c39/z9PREKBRiZmYGn89HPp+nF8Ef/P7+kk6nKZVKmDY3N/H7/fQi8wder5dYLEYkEsE0Pj7O8PAwvcgMIBaL4XK5GB0d5eTkBNPb2xupVIrHx0d6kRnAxcUFIyMjGIaB6fr6msPDQyqVCv1IgIpN5+fnKIrCxMQEyWSS/f19np+fsWIIMHCQwGH/APFHzcve64K1AAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 4, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACc0lEQVR4Ab3BzSs0cQDA8e/8ZqbEmFHabTlvYe3BwYFyoFzWOuxli4uTg+JPWKXcxU1xEbko7W1LijsXKbUpRNmysxJrph0v8zSHKenZF7s1n48EuARIEDBBwAQBEwRMBlaoIhwOk8vl0DQNTdO4vb2lVYIaDMNgbGyMjY0N1tbW0DSNVglqMAwDXzQaZXR0lFYp1FEsFgmFQti2zdfXF7/pus7AwACmadLT00MkEsFXKpU4OTnhJ4X/UFWVcDhMoVAgn88TCoXo7u7m4OCA7+9vfpJlGU+lUsF1XSzLYmdnh8/PTwqFAr8p/Ed7ezurq6vMzc0hhMBjmiZnZ2d4Li8vUVWV/v5+tra2eHh4wLZtTNPk6emJWiTApYrJyUmOjo7w5HI5kskkHkmSMAwDx3GwLIu/UKghkUjgGxoaYnl5mVgshhCCdDrNzc0N6+vr7O3t8fLyQiNkYIUq7u7uSKVS6LqOruuMj48Tj8cZHBzk8fGR6+trFhcXmZ2d5fz8nPv7e+qRgRWqKJVKRKNR4vE47+/vtLW1US6X2d3dZWJigtfXV2ZmZjAMg0Qiwfb2NpVKhVokwKWOWCyG4zh0dXXx9vZGPp/H5zgOiqLgOT4+JpVKYVkW1Sg04Orqikb09fXR0dGBZVlUI2jB9PQ0sizjW1hYoFgsUougBZFIBEmS8GmaRj2CFkxNTeGzbZuPjw/qETRpZGSEZDKJ7/DwkGw2Sz2CJs3Pz6OqKr6lpSUaodCE4eFh0uk0nufnZzKZDOVymUYoNCGTydDZ2Ynn4uKCzc1NGqXwR729vWiaxunpKdlslv39ff5CAlwCJAiYIGD/AORB2K5gC0JtAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 0, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACwElEQVR4Ab3Bzyu7AQDA4c/e99XyF7yrvWsHS8OJi5wcllGrJUclSbuK20s0S3OSw7JQilop5E2KLXGaOZiLJJPTK3n3OsnFW1v2bYdvSfYDteexASUaSKDBBBpMoMFEYJ4/cLlcXF1dEYvFsCyLTCZDNQJ/oCgKqVSKlpYWdF1H0zRqEfglp9NJMpnE6/VSKpUYGRnh4eGBWiR+weVycXp6isfjYWtri8PDQ9LpNPWQ+KHe3l7i8Tgej4f19XUmJiYoFovUS+IHFEVhc3MTt9tNNptlcnKSYrFIU1MThUKBekjUyW63c3Z2htvtpsyyLFZXVylra2vj7u6OsmQyyeXlJY+Pj3zHBpSow8LCAjMzM9TDNE2mpqbY2dnhK4k6DA0Noaoq/1mWxdLSEnt7e5imycDAAB6PhzKn08no6CjhcBhN0ygUCnwmUYOiKKysrCAIAqZpIssy+Xye7e1t7u/vKUskEnzW3d1Ne3s7fr+fo6MjPpOoIRQKIcsylmXR09ODLMs8Pz/z9PRENYZhkMlk+EqiClEUCQQClC0vL6PrOrquU4koikxPT+P1epmbm+P19ZWvBKpQFIXOzk6y2SyLi4vU0tXVRSQS4eXlhYODA74jUMXs7CxlJycnvL+/U01rayuaplE2PDxMLpfjOxIVNDc34/f7KRaLpFIpKhFFkbGxMcLhMA6HA03TSKfTVCJRgc/nQ1EUbm9vubi44DsOh4N4PM7g4CCGYTA/P080GqUaiV+w2+2oqsr4+DhOp5N8Pk8gEOD6+ppaJCo4Pj5G13U6OjqIRqNsbGzg8/kIBoP09/cjSRJlu7u7RCIRcrkc9ZCo4OPjg/Pzc9xuN6qqoqoqn93c3BCLxUgkEhQKBeplA0pUYLPZCIVCBINB+vr6WFtbY39/H8MwME2Tt7c3fsoGlGgggQYTaDCBBvsHbUgMaS/yjZUAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 5, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACXUlEQVR4Ab3BT0SzcQDA8e9+PTSpp8OkjSiNLslTdEh/niiS2CGRpkuXDumQinRbt5FO3eqU8tglixJdIrHIHpHYYYcOneJZ83iq03iWHcZjerfnfb1+n08AKCORQDKBZALJBJIJJBNIpvCfhEIhWlpaqAiHw+i6zsfHB4ZhUCqVqFL4R+Pj4/T396PrOpqm0dXVhaqq1IpEIiSTSaoUfAoGg4yNjTE/P8/CwgKtra3kcjnu7u44PT3l+fmZ9/d3vIaGhnh6eiKZTFKl4ENPTw8HBwfEYjFeXl7Y3d3l+vqaQqFAPfF4nJubG7wU6mhra2NnZ4etrS0Mw2BgYIB8Po8fKysrTE9PMzs7i5fCH6iqyuXlJdFolKWlJa6urvBrYmKCubk5RkZGKJVKeAWAMjXC4TAXFxfYts3y8jLFYpG/oaoqzc3NWJZFLcEvZmZmUFWVeDxOsVikqr29nd7eXhpxHAfLsviNwi8WFxc5Pz/Htm28zs7OmJyc5P7+nnQ6TTqd5vPzE9d18asJ2KPG5uYmfX19HB8f45VKpTAMg4rV1VUODw8ZHBwkk8ngOA5+NAF71MhkMiQSCSKRCNlslu/vb6ocx8E0TU5OTjBNk+HhYfb39zFNk9fXVxppAvaoYVkWhUKBjY0N1tfXiUaj2LbN29sbVa7rks/nSaVShEIhEokEhmHw9fVFPQGgTB3b29tMTU2h6zrBYJDb21u8Ojs70TSNo6Mj1tbWaCQAlPGho6OD7u5uNE2jYnR0lIeHByoeHx/J5XK4rksjAaCMRALJBJIJJBNIJpBMINkPVkLTCCaj3CgAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACfElEQVR4Ab3BQSgscQDA4d/8ZzMbLbmMK06uSq0L2ZSmiCsXWkV72pwctTdFDqyDnMRhCyW3RVubw5ZcCGujXQe1SeGgmNGsec1ha3u9NzPrveb7JMDCRwKfCXwm8JnAZwE8amtrIx6P09vbSyQSQZIkLMvC9v7+zt7eHqurq1xdXeFEAixczMzMsLa2hqIoOPn+/ubk5ITT01MWFxf5EwmwcDAyMsLh4SGSJGHb399ncnKSWpqmEQ6HicVitLS0YFkW+XyepaUldnZ2qCUDCRx0dXUxMTFB1cbGBrlcDtM0MU0T0zQpFApkMhmSySQ3NzeEQiF0XWdubo7R0VE2NzepClCng4MD/ubj44NUKkUqlUJRFDo6Onh6eqJWABdHR0fouk4wGMT29fWFF4ZhUCgU+J3AhWEY/E+COuRyOV5fX/kXgjoYhkGlUuFfCHwWoE6NjY1Eo1FisRi27e1tlpeX8UoGEjgYGBggGo0iSRKWZTE4OEg8HkdVVVRVpa+vj8vLS+7u7vBC4KK5uRkhBLbOzk40TcNWKpUol8sEg0EWFhZoaGjAC4ELXdexLIta5+fn9Pf3MzU1ha2np4exsTG8ELg4Pj7m+fkZW7FYZH19nenpacrlMmdnZ9zf32MLh8N4IQMJXGxtbZFOp1lZWWF3d5ehoSHa29spFos0NTURiURQVZVkMombAB68vLyQzWapenh4IJ1Oc3t7y/z8PDYhBLIsU6lUcCIDCer0+PiIoiiMj4+jaRqhUIjW1laur6/J5/M4kYEEP5DNZpFlmeHhYapKpRKZTAYnMpDghy4uLvj8/KS7uxvTNJmdneXt7Q0nEmDhI4HPBD77BZEX8f57eiFjAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 2, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB2klEQVR4Ab3BIWsyARzA4d/9ve7CEDa4YFNwYZ9A5OpAOLEpCyYxGLfgOKOM+RG2FYNwiEEuaRCbbVsSrgiGMVhQ2cKNc/diW9I7X7nnUQCfCAkREyImREyImBCxGNDkAOl0msViQT6f5/HxEd/3CUI4wNnZGd1ul5+fH+7v7/n9/SUolZCy2Sy3t7dcXFxQLBbp9XqEIexxcnLClqIo1Ot1+v0+0+mU+XzO+fk5YanscHp6ysPDA51Oh7u7O5LJJOVyGdu20XWdQ6jsUKvVKJVKXF9fY9s2uq7jOA5bk8mEQ6js0O/3+fr6wrZtHMdhs9nwl4gQlrDD29sb7Xab2WzGZrPhr+l0SqFQQFEUwhAONB6PSaVSxONxwhAOtF6vcV2XXC5HGMJ/sCyLRqOBiBBUDGgSwuXlJdVqFcMw0DSNXC5HpVLh5eWF+XzOPiohlEolnp+ficVibI1GIzzPI5FI4DgOQaiEYFkWruuyNRwOWa1WmKbJzc0N7+/vBCGE4LoulmVhWRbL5RLf92k2m6iqytXVFUEIR/D09ESr1SII4QhM00TTNDKZDPsIR/D5+cnr6yvtdpt9hCPwPA/DMEilUmiaxi7CkXx8fDAYDPj+/mYXBfCJkBCxf5N6rI2zzVrbAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 6, 正解: 4

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACeUlEQVR4Ab3BQSh7cQDA8e9+772Nq5IpFGntpKgp5Uo7UMPFhcPcKCE5SbMdkBIprRx2mRxIsTgOu2jKSWtx4OCk1xwsHNDv3zu80r+97W2H9/m4AImDBA4TOEzgMAWIUKP7+3v29vZoaWkhlUphh6BGkUgEv9+PlJJwOEwoFMIOQY2amppQFAVDoVAgn89jh6AGk5OThMNhTBcXFzw8PGCHoEp+v59YLIamaRhub2+JRqPYJaiCx+Nhf3+f1tZWDFJKDg8PeXp6wi4VmxRFIZPJEAgEMCWTSXZ2dhBCMDc3R2dnJ9vb2zw+PmJFxQaPx8PBwQGBQADT0dER8/PzGBYXF1lfX8fQ3d1NX18fVlQqqK+vZ3V1ldHRUUzZbJbp6Wne3t4YGBggFothcrlclKNSQTweZ2JiAlOxWGRhYYFCoUB7ezu7u7tomobp+vqacgRlDA8PEwwGMX18fDAyMsLNzQ1ut5u1tTV8Ph9/DQ0NMT4+jtvtphQFiGAhnU7j9XoxfH5+EgqFSKfTGJaWlpidneV/jY2NjI2N0dzcTCqV4n8qFrq6umhoaMA0MzNDJpNB0zSCwSDLy8uUMzg4SCkqFn5/f5FSYkokEiQSCewoFousrKxQioqFXC5HPp+np6cHuy4vL9F1nc3NTe7u7ijFBUgstLW1kUwm6e/vx8rr6ytXV1ccHx9zcnKClJJyXICkDE3T8Pl8nJ6e0tHRwV8bGxtsbW2h6zp2CSr4/v4ml8vx/PzMX2dnZ0SjUXRdpxoCG+rq6vB6vZheXl6Ix+N8fX1RLQWIUMHPzw/v7+/09vZyfn7O1NQU2WyWWrgAiYMEDhM4TOCwfwfN2RuziVY6AAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACdUlEQVR4Ab3BTyg0YQDA4d+8+7Y4LsKBchAHd4WD05bQykVrCWdFLtobc5NSyG3jQLaUPzlRk3KQqW3VDmlz2OLCQdQ6GIddM19zUPr6Zs3yNc+jADY+EvhM4DOBzwQ+E/hM4DOJi6amJi4uLlhfXyeTyRAOh/n08PDAzs4Ojnw+j23bhEIhIpEIwWCQRCKBG4mL6upqampqWFpa4l9WV1dxJJNJisUiExMTOM7OzkgkEriRuLi6uuLo6IiRkRGenp6YnZ2lUCjgaGxsJBaLUVtby+joKA5FUXh7e+P29pZSJCWsrKwwMDDA3t4eu7u7fLW2toaqqszPz/Px8UE8Huf8/Jx0Ok0pkhIuLy+5u7ujtbUVKSXFYpGvhoeHcXR0dJDJZPBC4EE4HKaiooKv4vE4LS0tbGxsYBgGXgm+oes6jrm5OT4JIYhEIkgp0TQN27bxSvCN09NTLMtienqaT11dXXR2dpJOpzk+PqYckm8cHh4SjUbJ5XL8LZvNYpom5ZB4sL+/z/8i+IVUKkW5JB4Fg0EMw8BRVVWFY3FxESEEr6+vJJNJvAgAKh4oikJzczO5XI62tjZCoRCVlZX09fUxNDTE1NQU4+PjPD8/k81mcRMAVDywLAtN09A0DcMwmJycZHNzk5mZGR4fH+np6aGhoYG6ujq2t7dxI/kBy7Jw3NzcoOs6uq6zsLDA2NgY/f39lBIAVMr0/v7O4OAg3d3dnJyc8PLyguP6+pqDgwNKCQAqZTJNk0AgQDQapVAooGkaXgl+aGtri/v7e2KxGO3t7Xgl+KF8Pk8qlaK+vh5VVfFK8AvLy8uYpklvby9eKYCNj/4Atlbp8iuKDJAAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 1, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB2ElEQVR4Ab3BMUsyYQDA8X/P+xAHwZ2DQ0P4CYqGluYGN2mItppq8BMYisPBDeHkOaiDX0CQxiCOpoTmG6rjtsDtMNDkRBS8lxtaXurtHpX7/baAiBQJUiZImWSDDMPg/v6eMAy5vLwkCAL+JdgQIQS3t7fs7+8TBAHL5ZLvSDbk4uKCYrFIzHVdhsMh3xFswPHxMdVqlViz2aTdbvMTyZqy2SwPDw/ous58PqfVajGdTvmJYE2dTgdd14nZto3nefyPYA2lUonT01Ninudhmia/Eawom81SqVSILRYLrq6umM1m/EayIsuy0HWdwWBAPp/H932SEKygVCpxfX1NrNvt4vs+SQkU7e7uUi6XkVLS6/W4ublBhUBBLpfDcRwMwyCKIh4fH9ne3kbFH8AkgZOTE/r9Pnt7e3wpFApMJhOen59JSpCAYRjU63V2dnaIfXx8sFwuiR0eHqJCkMD5+TkHBwd8MU2Tz89PViFIIJPJ8OXp6Yn393c0TSP29vaGCoGC0WhErVbDsiw0TSPm+z4qJAoymQx3d3domkbs9fUV13VRIVGkaRoxx3E4OzsjDENUSBKwbZujoyOklLy8vNBoNBiPx0RRhKotICJFgpQJUiZImSBlfwG0ZJ2Dynx0YgAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACTUlEQVR4Ab3Bv0syYQDA8a+Pp4hSyEXQ0hIRblEh2SrVUFCGNeZiQ21Fc2BTTbo5tOQf0Bi4xAXS1RQNtVgRQdGpRT8QIiu4lxsOHKx7fN+X+3w8gImLBC4TuEzgMgVJo6OjTE1NsbGxgc3j8XB3d8fExATlchkZXiCDhP39fRYWFmhmmiadnZ2MjY1xcnJCrVbDiUDC6uoq/f392EzT5P39ne/vbyzDw8NEIhFkKEjo7e0lGAxiOT8/5/T0lHQ6zdraGtPT0/T19WEYBjIU2pTP59nZ2cGSy+UoFAoMDQ2h6zoyBA78fj+BQICfvLy8oGkasgQOJicnWV5e5n8RuEzBwcfHB/V6nY6ODiybm5usr69jSyaTXFxcIMsLZPjFzc0N3d3dxGIxLKFQCFVVUVUVVVWZm5vj+PiY+/t7ZAj+UU9PD7u7uxQKBUKhEE4EEp6enmg0Gti+vr6oVCrYBgYGWFxcxO/340QgYWtri3K5jK1SqZBMJrm8vKTZzMwMTgR/oauri5GREVKpFM/Pz9iy2SypVIrfeIEMEuLxOMFgkHA4jM/nIx6Pc3t7y/b2Nul0GksgEKBer6NpGo1Gg1a8QAYJe3t7GIbB/Pw8FkVRGB8f5/Pzk2g0im1wcBBd17m6uqIVQRuOjo4oFos0W1lZoR2CNhiGQalU4u3tjevra1p5eHjg9fWVn3iBDG3QdZ3Hx0dKpRKzs7M0q1arLC0tcXh4yE+8QIY2nZ2dUa1WKRaLaJpGIpHAkkgkODg44DcewMRFApcJXCZw2R8ZO82qv46nHQAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 2, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACF0lEQVR4Ab3BvUsycQDA8e/9TpSGCG1JcTSCXHyZLINwcipxaAiSVkcnHf0XHGt20AbnBvGWhsJcRCWCVBpqKjFNVHx5uOFZHvTp7p6H+3wkYImJBCYTmExgMhnIskY4HKZUKnF1dcXW1hY2m414PM79/T2LxQIjZCDLCrFYjHw+j9Vqpd/vc3x8zN7eHhcXF3Q6HQaDAb1eD70kYMkKOzs7uN1uHh8fUQWDQQaDAeVyGbfbTS6XI5VKoZcMZFlhOBzy9vbGb+/v73x8fPD9/U00GqXX6+Hz+SiXy+ghA1l0qNVqbG9vc3p6itPppNVq0e120UoGsuh0e3vL4eEhBwcHOBwOCoUCWgkMUhQF1XQ6RQ+BQfP5HJUsy+gh+Ecejwc9BAY9PDygcjqdRCIRtBIYtLu7i0oIQafTQSuBQQ6HA5Xdbsfv96OVhf8gk8nw/PyMqt1uMxqNWEcCluhgs9lIJBIkk0l8Ph9/ajQaBAIBZrMZq1jQ6Pz8nJOTE8LhMC6Xi3X29/c5OjpCURRWsfCDzc1Nrq+vOTs7Q5IkVqlUKkQiEW5ubigWiyiKwjoWfiCEoN/vMx6PeXp6olQqEY/H8fv93N3dkU6naTabeL1earUa0+mUv5GAJTpdXl6Sy+V4eXkhFAoxmUzQyoIBr6+vVKtVvr6+mM1m6CEwoFKp8Pn5Sb1eZ2NjAz0kYImJBCYTmExgsl/i9bqJw4SCYAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "const predicted = tf.argMax(model.predict(mnist.getTestData().images) as tf.Tensor, 1).arraySync() as number[];\n", "const labels = tf.argMax(mnist.getTestData().labels, 1).arraySync() as number[];\n", "\n", "const numSamples = 32;\n", "let count = 0;\n", "for (let i = 0; i < predicted.length && labels.length; i++) {\n", " const pred = predicted[i];\n", " const label = labels[i];\n", " if (pred === label) {\n", " continue;\n", " }\n", " tslab.display.html(`

予測: ${pred}, 正解: ${label}

`)\n", " const pngs = await toPng(mnist.getTestData().images, i, 1);\n", " tslab.display.png(pngs[0]);\n", " count++;\n", " if (count >= numSamples) {\n", " break;\n", " }\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# CNN (convolutional neural network) による画像認識\n", "\n", "MNISTの文字列認識は典型的な画像を対象としたディープラーニングなので、[CNNによるディープラーニング](https://developers.google.com/machine-learning/glossary/#convolutional_neural_network)も試してみましょう。モデルの構造は[TensorFlow.jsの例から拝借してきます](https://github.com/tensorflow/tfjs-examples/tree/master/mnist-node)。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "const cnnModel = tf.sequential();\n", "cnnModel.add(tf.layers.conv2d({\n", " inputShape: [28, 28, 1],\n", " filters: 32,\n", " kernelSize: 3,\n", " activation: 'relu',\n", "}));\n", "cnnModel.add(tf.layers.conv2d({\n", " filters: 32,\n", " kernelSize: 3,\n", " activation: 'relu',\n", "}));\n", "cnnModel.add(tf.layers.maxPooling2d({poolSize: [2, 2]}));\n", "cnnModel.add(tf.layers.conv2d({\n", " filters: 64,\n", " kernelSize: 3,\n", " activation: 'relu',\n", "}));\n", "cnnModel.add(tf.layers.conv2d({\n", " filters: 64,\n", " kernelSize: 3,\n", " activation: 'relu',\n", "}));\n", "cnnModel.add(tf.layers.maxPooling2d({poolSize: [2, 2]}));\n", "cnnModel.add(tf.layers.flatten());\n", "cnnModel.add(tf.layers.dropout({rate: 0.25}));\n", "cnnModel.add(tf.layers.dense({units: 512, activation: 'relu'}));\n", "cnnModel.add(tf.layers.dropout({rate: 0.5}));\n", "cnnModel.add(tf.layers.dense({units: 10, activation: 'softmax'}));\n", "\n", "const optimizer = 'rmsprop';\n", "cnnModel.compile({\n", " optimizer: optimizer,\n", " loss: 'categoricalCrossentropy',\n", " metrics: ['accuracy'],\n", "});" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最初のモデルに比べると構造が複雑なのでトレーニングには時間がかかります。GPUが使える場合はGPUによる高速化の威力がよく実感できると思います。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output shape Param # \n", "=================================================================\n", "conv2d_Conv2D1 (Conv2D) [null,26,26,32] 320 \n", "_________________________________________________________________\n", "conv2d_Conv2D2 (Conv2D) [null,24,24,32] 9248 \n", "_________________________________________________________________\n", "max_pooling2d_MaxPooling2D1 [null,12,12,32] 0 \n", "_________________________________________________________________\n", "conv2d_Conv2D3 (Conv2D) [null,10,10,64] 18496 \n", "_________________________________________________________________\n", "conv2d_Conv2D4 (Conv2D) [null,8,8,64] 36928 \n", "_________________________________________________________________\n", "max_pooling2d_MaxPooling2D2 [null,4,4,64] 0 \n", "_________________________________________________________________\n", "flatten_Flatten2 (Flatten) [null,1024] 0 \n", "_________________________________________________________________\n", "dropout_Dropout2 (Dropout) [null,1024] 0 \n", "_________________________________________________________________\n", "dense_Dense3 (Dense) [null,512] 524800 \n", "_________________________________________________________________\n", "dropout_Dropout3 (Dropout) [null,512] 0 \n", "_________________________________________________________________\n", "dense_Dense4 (Dense) [null,10] 5130 \n", "=================================================================\n", "Total params: 594922\n", "Trainable params: 594922\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "Epoch 1 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "40096ms 786us/step - acc=0.922 loss=0.250 val_acc=0.982 val_loss=0.0641 \n", "Epoch 2 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "38724ms 759us/step - acc=0.978 loss=0.0700 val_acc=0.984 val_loss=0.0571 \n", "Epoch 3 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "38442ms 754us/step - acc=0.985 loss=0.0487 val_acc=0.983 val_loss=0.0554 \n", "Epoch 4 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "41739ms 818us/step - acc=0.988 loss=0.0390 val_acc=0.987 val_loss=0.0487 \n", "Epoch 5 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42047ms 824us/step - acc=0.990 loss=0.0333 val_acc=0.992 val_loss=0.0279 \n", "Epoch 6 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42048ms 824us/step - acc=0.991 loss=0.0284 val_acc=0.993 val_loss=0.0288 \n", "Epoch 7 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42536ms 834us/step - acc=0.992 loss=0.0257 val_acc=0.993 val_loss=0.0290 \n", "Epoch 8 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42460ms 833us/step - acc=0.993 loss=0.0227 val_acc=0.994 val_loss=0.0248 \n", "Epoch 9 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42492ms 833us/step - acc=0.994 loss=0.0194 val_acc=0.994 val_loss=0.0233 \n", "Epoch 10 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42412ms 832us/step - acc=0.994 loss=0.0177 val_acc=0.992 val_loss=0.0267 \n", "Epoch 11 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42587ms 835us/step - acc=0.995 loss=0.0158 val_acc=0.994 val_loss=0.0275 \n", "Epoch 12 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42507ms 833us/step - acc=0.995 loss=0.0146 val_acc=0.994 val_loss=0.0307 \n", "Epoch 13 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42602ms 835us/step - acc=0.996 loss=0.0126 val_acc=0.994 val_loss=0.0292 \n", "Epoch 14 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42281ms 829us/step - acc=0.996 loss=0.0122 val_acc=0.994 val_loss=0.0243 \n", "Epoch 15 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "41718ms 818us/step - acc=0.996 loss=0.0120 val_acc=0.995 val_loss=0.0236 \n", "Epoch 16 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "41984ms 823us/step - acc=0.997 loss=0.0109 val_acc=0.994 val_loss=0.0280 \n", "Epoch 17 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42295ms 829us/step - acc=0.996 loss=0.0101 val_acc=0.994 val_loss=0.0321 \n", "Epoch 18 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42540ms 834us/step - acc=0.997 loss=9.02e-3 val_acc=0.993 val_loss=0.0322 \n", "Epoch 19 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42968ms 843us/step - acc=0.997 loss=9.14e-3 val_acc=0.995 val_loss=0.0305 \n", "Epoch 20 / 20\n" ] }, { "data": { "text/plain": [ "Progress: 100.0%" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "42547ms 834us/step - acc=0.997 loss=9.66e-3 val_acc=0.994 val_loss=0.0277 \n", "\n", "Evaluation result:\n", " Loss = 0.020; Accuracy = 0.995\n", "Saved model to path: cnn_mnist\n" ] } ], "source": [ "const epochs = 20;\n", "const batchSize = 128;\n", "const modelSavePath = 'cnn_mnist'\n", "await train(cnnModel, epochs, batchSize, modelSavePath);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "テストデータに対する精度が99.4%まで上昇しました。先の単純なモデルでやったように、CNNを使ってもなお認識に失敗している画像を表示してみましょう。\n", "最初の単純なモデルの失敗例に比べると、人間でも認識に失敗しそうな、あるいはラベルが間違っていると言いたくなるような例が多くなっており、文字認識の精度が大きく向上していることが体感できると思います。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

予測: 6, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACkklEQVR4Ab3Bzyu7cQDA8fdn+/iRR0QopbGsHeYwpZWUTI6WuM3BDYUDc+L2OImdnRx28weI0kJiFzksNaWdHmtKONijUfbr23PYZW3fzfe7ntdLAAVMZMFkFkxmwWSSOujo6MBms1H09PREIBAgFosRj8e5v7+nSPIfpqenmZmZwev14nA4KIrH4/T399PU1ITBarVSJPmlwcFB1tbWWF5eprm5GSEEpZxOJ5VIfqmvr4/19XUqeXx85OHhgUokVXR1dbGxsUEkEuHs7Iyfnx9SqRTpdBpFUQiHw8RiMW5vb4lGo3x/f5NOp6lEAAUqUBSFm5sb3G43c3NzHB8fYxgYGEDTNGw2G8lkknw+T60kFTQ2NnJ0dITb7WZ3d5fz83OKNE3DkEgk+C1JGa2trWxvb+Pz+Xh/fycYDPL19UU9SMqYnZ1la2uLRCLB+Pg4qVSKerFQxtjYGIZoNEoymaSerIBKiVAoREtLC3a7HSkluq7z8vJCPVgBlRL7+/sUCgWklExMTLC4uEhPTw+dnZ34fD56e3sxdHd34/V60XUdXdephQAKlAgGg2xublKrt7c3rq6u8Pv9VGMFVEpcXl5yenrK5OQkn5+ftLW1IYSgEkVRcLlc5PN5rq+v+RtJGblcjru7O5xOJ4apqSkaGhpQVRWPx0M5QghGRkaoRlKDi4sLDMPDw3g8HrLZLKFQiMPDQwKBAPPz89TKwi+Ew2EMUkqWlpbY29vD7/dT9Pz8TDVWQKVGHx8fOBwOhoaGMNjtdoQQ5HI5Tk5OWF1dJZPJ8DdWQKVG2WyWSCSCy+Wivb0dRVHQNI2DgwNWVlbIZDJUI4AC/2BhYYHR0VF2dnZ4fX2lVgIoYCILJrNgMgsm+wNVkeLOGvJ7SwAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 7, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACF0lEQVR4Ab3BMUgyYQCA4devw7xcoiHdBEGNnAIdjDahJbcG8YIQXNwaGuKaLvCanNPNHGpocGppEoOGiECDoKHldHFQokVp6X5uEJr0O3+45/EBNh4SeEzgMYHHBB4TeExB0vr6OrFYDE3TcJycnGDbNjPD4ZDd3V0sy2IeBQlHR0ecn5+TSCSYsW2bXq+H3+9na2uLUChEOBzGsizmUVhA0zTq9TqqqvL19UWr1aLX6/H4+IhlWSiKwmAwIBAIoGkaz8/PzKMwx9raGqVSidfXVyqVCk9PT0ynU/5SVRXbtnHc3d2xiMIck8mEbDbLPKenp6iqyufnJx8fHywi+A/pdJqzszMctVqN8XjMIoIlCSHY399HVVW+v79pt9vIECypVCpxcXGBQ9d13t7ekCFYUi6Xw9Hv92k2m8gSLGFnZ4dcLoejWq3y8/ODLIFLwWAQwzAQQtBut7m6usINgUvFYpGDgwMmkwmNRgO3BC7EYjEuLy9xVKtVbm9vcUsgyefzoes6wWAQx/39PcsQSDo8POT4+BjH9fU1Ly8vLEMgKR6PM2OaJn/l83lkCSSlUikclUqFfr/P6uoqhUKB9/d3RqMRshQkZTIZHBsbG2xvb3Nzc0MkEsE0TTqdDrJWAAMJ0WiUVCpFOp2mXC6zublJs9lE13V+f3+RpSDJMAz29vZIJpN0u11M0+Th4QG3fICNhwQe+wcV5qyAvWr8fAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 2, 正解: 8

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACMUlEQVR4Ab3BPU/qUACA4fcc6lLmzji44MhmxMR/IKdhlMSByGjipBgTEhUnVhNx82uznZxJ6GIcYPPoRnQxUFccjBzjcBOHe9uCN30eARhSJEmZJGWSlFnMaDKZ4HkeQggeHh7Y398nCYsZGWMolUoIIVhbW6Pf7+N5HnEyQIMZvL6+cnt7y9LSErZts7CwwNnZGXEsZtRut/lWKBSoVqskJfkPhBAEQUASkl9SSmGMwfd9kpD8ku/7CCEIgoAkLGbkOA67u7sopdBak5RkSrlcDtu2WV9fZ2tri2w2S7lcJinJlO7v71FKsbOzgzGGZrPJ4+MjSUmm4LoujuNQr9dxHIenpyeazSbTyAANYuTzeWq1Gq1Wi7m5OU5PTwnDkGKxyOfnJ0EQkJRFjFwux+HhIUoput0u8/PzXF9fk81m0VpzcHDAYDDg6uqKJCxinJ+fs7y8zGg0Ynt7m+fnZ8IwxLZttNb4vk+9Xuf9/R3P84hjEcFxHFZWVuh2u6yurvLTeDzmW6/Xo1wuMxwOGQwG9Ho9okgiKKUwxuD7PnEqlQqLi4vEsYgQhiFvb29sbm7y8vKC53n8jeu63NzcMJlMuLy8JEoGaPAPWms+Pj4oFApsbGwghCAIAn7a29uj1WphWRZHR0d0Oh2iZIAGEe7u7uh0OriuS61WYzwe88fFxQXFYpFv1WqVk5MT4lgkoLWmUqnwUz6fp1QqcXx8TLvdJgxDkhCAIUWSlElSJknZFw7f14zfy+abAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 6, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABdElEQVR4Ab3Brw9pUQDA8a/jTqRJdhRFUFSRojGbblNsmgnay4LkEmx+/AMoRpFMkETb1e2OjdkNNuGeN8H20uNe2/l8AoBCI4FmAs0MfBgOh1QqFebzOcViES8EPriui+u6KKXwSqCZQDOBZgLNBJoJPIrH40gp8cvAo1wuRzabpd1us9vt8MrAp9FohGVZeCXwoFwuMxgMqFarWJaFHwIPTNNEKcUvBJoZfCkWixEMBnkzDINEIsFbv99ns9lQq9V4ud/v2LaNlJLr9UooFKLZbGLwpW63SyQS4SWTyRAOh+l0OrxdLheOxyOz2YyX7XbLZDKh1WqxWq2IRqOk02kCgOKDfD5Pr9dDSsm/9vs9pmnycj6fWSwWfGLwhVQqhZSSN8dxKJVKHA4HTqcTXhh8UCgUSCaTvCyXS57PJ6Zpsl6v8cPgg+l0ilKK8XhMvV7n8XjwiyDwh/+wbZvb7Uaj0cBxHH4VABQaCTQTaCbQTKDZX9D4gnuuI4FoAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 1, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACOUlEQVR4Ab3BP0s6cQDA4Y/fvmINihAeklBObQ6JLYEvQOQGESIbil6Ei0stOTnYEkFbWRY4HBjNEYFBQUVBW5OBUZJw9EcR7kfDQUhX3v3gnscDGLhI4DKBywQuE7hM4tDk5CS1Wo1EIoHH46FUKpHP5/mLxKa5uTkKhQLhcJiZmRkMw+D19ZX9/X2GIRlSKBRifn6e9fV1/H4/3wWDQXK5HFdXV/xF8otAIMD4+DiZTIalpSVisRj/S2JhbGyMSqVCOp1m0NHREd1ul2w2i10CC6Ojo6TTaQadn5+zvLzM4eEhTgj+sLe3h6ler1Mul+l0OiwuLuKE5BfNZpOpqSkikQhfdF3n7e2NL6lUCickFt7f31lYWMDn89FqtfhuZWUFKSVOCCx0u10ajQYnJycMqlQq9Pt9TK1Wi0KhwDAkNsViMVZXV/F6vZgMw6Df7zMMgU2hUIhMJsPp6SlOCGzq9XpsbGxwcHCAqVgsMiyBTWdnZwQCAba2tjDd398zLIFN09PTBINBTJqmcXl5iUlRFKLRKFZGgDVsuL29JZFIYPr8/ERRFHw+H/F4HFVVKZfLNBoNHh8fGTQCrGFDs9kkm81iCofDJJNJVFVldnaWu7s72u02u7u79Ho9Bklsen5+5icXFxdomoaiKOTzeXRd5ycCm9rtNsfHx2iaxsTEBKbr62s2Nzd5eHhASokVgU03NzeoqsrHxwcvLy9sb2/T6XSoVqt82dnZ4enpCSsewMBFApcJXPYPBq/FwgUo0fEAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 9, 正解: 8

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB9UlEQVR4Ab3BsUsyYQDA4d+9nSXEIQeHo4MQ0hSaiFvYEDhIRONN7Y0OiQmBk4NCg7uLtNVfIIhj0BSCHoGD5yRNoYOE78cNByIfvh7EPY8GSEIkCJkgZIKQCUKmE4BhGNzf3+O5uroin8/TarVotVp8f3+zDw2Q7CGVSvH+/s7x8TEeTdOQUuJZLpdUKhXa7TYqB8ATCpZl0el0ODk5wadpGr5IJMLl5SX5fJ6Xlxd20VGIx+N0u10uLi7Y5ejoCMuyUNFRuLm5oVAo4Pv9/aVarTIYDLi9vaVcLhOEjsLd3R2bHMeh2WziyeVyBCUIYDQacX19jc+2bTbN53NUBAF8fX0xmUzwlEol0uk0m56fn1ER7HB2dkYikcA3nU7xnZ+fE4lE8I3HYxzHQUVnh2QySTwexxeLxYhGo9RqNR4eHpBS4nNdF9d1UdHZ4e3tjY+PD7LZLB7btrFtG48QgvV6je/x8ZF96ChIKZFSsm29XiOlJCiBQqPR4C8dAE/sMJ1O6ff7GIbBaDTi8PAQ0zTRNI1NhmHw+vqKio7CYrGg1+vR6/XwnJ6e8vn5yTbLstiHIKDZbMb/ZDIZ0uk0KoI/YpompmmiIgiZICApJavVim3j8RjHcVARBPTz80OxWGTTcDikXq/jui4qGiAJkSBkgpD9Azasn7Xao9gvAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 5, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACXUlEQVR4Ab3BT0SzcQDA8e9+PTSpp8OkjSiNLslTdEh/niiS2CGRpkuXDumQinRbt5FO3eqU8tglixJdIrHIHpHYYYcOneJZ83iq03iWHcZjerfnfb1+n08AKCORQDKBZALJBJIJJBNIpvCfhEIhWlpaqAiHw+i6zsfHB4ZhUCqVqFL4R+Pj4/T396PrOpqm0dXVhaqq1IpEIiSTSaoUfAoGg4yNjTE/P8/CwgKtra3kcjnu7u44PT3l+fmZ9/d3vIaGhnh6eiKZTFKl4ENPTw8HBwfEYjFeXl7Y3d3l+vqaQqFAPfF4nJubG7wU6mhra2NnZ4etrS0Mw2BgYIB8Po8fKysrTE9PMzs7i5fCH6iqyuXlJdFolKWlJa6urvBrYmKCubk5RkZGKJVKeAWAMjXC4TAXFxfYts3y8jLFYpG/oaoqzc3NWJZFLcEvZmZmUFWVeDxOsVikqr29nd7eXhpxHAfLsviNwi8WFxc5Pz/Htm28zs7OmJyc5P7+nnQ6TTqd5vPzE9d18asJ2KPG5uYmfX19HB8f45VKpTAMg4rV1VUODw8ZHBwkk8ngOA5+NAF71MhkMiQSCSKRCNlslu/vb6ocx8E0TU5OTjBNk+HhYfb39zFNk9fXVxppAvaoYVkWhUKBjY0N1tfXiUaj2LbN29sbVa7rks/nSaVShEIhEokEhmHw9fVFPQGgTB3b29tMTU2h6zrBYJDb21u8Ojs70TSNo6Mj1tbWaCQAlPGho6OD7u5uNE2jYnR0lIeHByoeHx/J5XK4rksjAaCMRALJBJIJJBNIJpBMINkPVkLTCCaj3CgAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 4, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB9klEQVR4Ab3BMUsyYQDA8b/Pq0PCeS7eoWCD2H2AJqElrqDB1UFQENwamyJweINoicY+gA1uQYNNxS1NB4IigoI6iYJDg3iJkOHLMwjv+JzD/X4hYEuABAETBEwQMEHAwuzh/f2d8/NzxuMx2WwWPwQ+3d3dYds22+2W6XSKXwIfdF3Htm1CoRCe53F7e4tfAh+ur6/J5XJItVoNx3GoVCo8PDygSuBDKpVCur+/5+npiYODA25ubri6uiKXy6FCoCgWi3FxcYHnedTrdX5/f7m8vMSyLH5+flitVqgQKCqVSpimieu6DIdDpFQqhfT19UW320WFQNHR0RGS4zjsnJ2d4ZfAp263i5RIJEgmk0hvb2+oEijSdR2p3+8jlctlDMNA8jwPVQIF0WiUfD7P/wqFAvsQKDg8PETTNEajEfP5nEQiQSaTYWcwGKAqjILpdMr39zfZbJZ0Ok2xWMQ0TaTNZkOr1UJVGAXL5ZJer8fp6Smvr69YlsXO8/Mz7XYbVQJFnU4HybIspPV6jXR8fEwkEkHVH+AvCsbjMZqmsVgseHx8ZDAYcHJygmEYNJtNZrMZKsIoGo1GVKtVdj4+PpAmkwmtVgtVgj2Zpon0+fmJH4I9xONxdF1Hcl0XPwR70DQNTdN4eXmh0WjgRwjYEiBBwAQB+wfE6aBxffN/dAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 1, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABQUlEQVR4Ab3Bv8qBYRjA4d9zI6UM6lUWg7IYxBFgchDOw0wG0zsblclkeDd/sihlNZnIZrEwUJTn6z0Cnvur57oMYPFI8EzwTPBM8CzJD4IgYLlcUqlU2O12rFYrwjDk9XrhKskP8vk8tVqNWKPRoNlsksvl6Ha7uEoAfb643W5Mp1Oy2Sz7/Z56vc7j8WA2m/F+v3GRAPp88fl8uF6vRFFEFEX0ej1KpRKbzYbT6YQLQWE0GhHrdDq4EhTCMOT5fNJutykWi7gQFM7nM5PJhEKhQCaTwYWgdDgc0BA8EzwTlIbDIcYYjDG4EJSstVhrsdbiQlCoVqukUimOxyP3+x0XgsJ6vSadTrPdbrlcLrgQFIIgQEv4h/F4jCtBwRhDrFwu40pQmM/nxBaLBa4EhVarhZagMBgM0DKAxSPBM8GzP79FZHCJbt62AAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 7, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACnklEQVR4Ab3BTyizcQDA8e/z289GSoh2eVYrqUcOyoHzjlOStMfBQXYQ5UbZbsuJOCwnORIpDnPh6GyraZPlYCLT8qceWcifp+dtBxftedCrfT4KYFFFgioTVJmgygRVJqgyiYOhoSHm5uY4OzvDMAw2NzcxTZNisUgul+Or3t5eOjs7OTk54fDwkEokDvb29picnKS/v59SqYTP5yMQCPD09MTDwwOWZfEpn8/j9XrRNI1CoUB3dzf39/d8JXHw9vaGqqqU7e/vc3BwQCAQwOPx0NzcjGVZSClxu93U1tays7ODEIJCoYAQgkokNlwuFxMTE/j9fsp0XUfXdTKZDOPj46RSKcra2tpYW1vD6/USiUR4fHzEiQuIUcHY2BjLy8tIKTFNk2w2SzQaZXp6msvLSz4ZhkFLSwuhUIh8Ps/R0RFOXECML/r6+lhaWqKpqQlFUYhEIoyOjpLJZHh/f+crwzAIh8P09PSwu7uLYRjYkVRwd3dHMpnk6uqKRCLB6uoqTnK5HM/Pz6iqSkdHB+fn59iRVJBKpQiFQgghME2T32htbcWJwIZlWZimyW8Fg0GcCKpM8IcURcHv9yOlxI7gD1mWRTab5ePjAzuCPxAOh2loaKAskUjgRPCfPB4PsVgMKSWlUol0Oo0TwX8KBoOoqkpZPB6nWCziRGCjpqYGXdcRQmBncHCQ9fV1yra2tpifn+c7AhtCCBYXF2lsbKSSgYEBNjY2qK+vp2xqaoqXlxe+4wJiVGCaJul0mmQyiaZp3Nzc4PP50DSNlZUVZmdncbvdXF9fMzIywvHxMT+hABYOhoeHiUajtLe3U1dXx6fX11e2t7eZmZnh9vaWn1IAix/o6uoiHo9zcXFB2enpKQsLC/yWAlhUkaDK/gEORfk7aO7VVQAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 6, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACRklEQVR4Ab3BQSgsYQDA8f98801Jy+xhd9qciKNcOOxJKGeHPXPYIivlKrV6Lg4icVKENk60B4fJhtTeNfamuCiblLa0MQyZ1xxe6eXZmXk1v58CuERIEDFBxAQRk/yHrq4uhoeHeX5+5unpiZGREQYGBujo6MB1XTY2NpiamuIrSQiqqpLP55mZmUHXdTzVahXHcSgUCtTrdd7e3rAsi79JQlBVlc7OTo6PjykWi9RqNcrlMu/v7zQiCcFxHFpaWjg7O+Pg4IAgBCG0tbUxNDTE6+srQQlC2N7eplKpsLOzQ1CCgNrb2+nr62NlZYWPjw+CEgQ0PT1NPB7Htm3CEASUy+WwLItSqUQYEp80TWNtbY2mpibGx8cJS+JTIpFgcnISy7K4u7tD13U8juNg2zZ+SXwaGxvDoygKNzc3tLa24jk6OiKXy3F/f48fKvCLBgzDYHd3l1gsRiqVYn19neXlZU5OThgdHSWdTlMqlXh5eaERiQ+Dg4PE43Gurq7IZrNUKhVs28ZTLpe5vr5mcXGRiYkJGpH4UK/XOT8/Z35+nouLC756fHzEk06n8UPyA03TSCQSmKaJaZp8p7e3F8/m5iZ+CH6QSqW4vLxE0zS+k0wmWVpa4vPzk/39ffwQNJBMJjk8PKS5uZmvDMPg9PSUnp4estkstVoNPxTA5R+klCwsLDA7O8vDwwOmaVKtVunu7qa/v59YLMbq6ipzc3P4pQAuDWQyGba2ttB1nT9ub2/J5/Ps7e0RhAK4REgQMUHEBBH7DZIMzHlj0S/cAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 3, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB1klEQVR4Ab3BsW3yQBiA4dd3lKeQAcgCZICzWcB9EFZoWQCzALJET8YISFb6yD0cDJAs8HkBRH33V39nAgmWnycCAh1SdEzRsR4NkiRht9vhvUdrTZsUDebzOd57vPe0TdHg9fWVKIpQSpEkCW3SQEEDYwzWWtI0xTmHiNAGDRQ0OJ/PPDw8MBqNmM1mVFWFiHAvDRQ0EBHKssQYg7WWNE1xziEi3CMCAjfY7XZYazkcDmRZhojwFxoouMHn5yf7/Z7FYkEcxzw+PrLf7/ktDRTc4HQ68f39TVVVDIdDFosFxhjO5zMiwq00UPALIkJZlhhjyPOcNE1xziEi3EIDBX9QVRWr1Yosy1gul1RVhYhwjQYK7nA6nXh5eSFNU5xziAg/0UDBHb6+vlitVqzXa2azGc/Pz5RlySUaKGiBMQZrLf1+H+ccIkITRUuOxyNKKZ6enhiPx1yiaJH3nhACIQQu6dGCJEnYbreEEKjrmo+PDy5R3ClJEt7f3wkh4L0nyzKcc1zS44rJZMJms+FwOPD29sZ/cRyT5zlRFBFCoK5rsizDOcdPIiDwg8FggLWWOI7J8xylFN57lFJ475lOp4QQqOsa5xzXRECgQ4qOKTqm6JiiY/8AIiLL9sO1sFAAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 4, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB60lEQVR4Ab3BMUsyYQDA8f89nfnc1BKCkKBgIOjQEIgk+BkaxCnQwUUC8QMIIWhDQ9DU2uDgrDa4aEOLjuISRFtDLipWh+kZNwjxLj73Ivf7acAaFwlcJnCZwGUClwlcJnDZHnCFA7quo+s6UkqKxSKPj4+MRiNeXl5QoeNAoVAgn8/j9XrRNI1AIMDPzw8XFxc0m01U6Cg6Pz/n5uYGwzCwaZrGer3Gdnp6ipQS0zTZRqDg7OyMer2OYRjYut0uoVCI6+trbMFgECklKgQKjo+PkVKyEY/HiUajlMtlSqUSTgi28Hg81Go1/rq/v6fdbmNZFk9PT9jS6TQqBFtEIhEODg54fn5mPB5jmiaVSoWNxWLBcrmkWq2iQmeL4XBILBZjPB7TarWwLIvZbMbGarXCsiwODw9RIVDw9vbGfD6n1+sRDocxDIMNwzDY39+n0+mgQuDQ0dERiUSCf319faFC4MDt7S3v7+8kk0lsXq+XTCaDbTAYoELHgel0ysPDA5eXl3x/f5PP5wmHw9gmkwkq9oArHOj3+5ycnJDNZvn8/CSXy5FKpZBS0mg02EbHofl8TjqdxufzMZvNME2Tu7s7VOn8p4+PD/7y+/2oEOxIPB5HhWBHXl9fUSHYkeFwiAqBywQu04A1LvoFbHmeyNJA+ugAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 9, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABcElEQVR4Ab3BIa7qQBSA4f/MKyuYGVtMk4a7h3YNqErWgEHgnkLiKXuABRAcgpAQHPUYBFOL5LwgXoIcbpN+nwBKjww9M/TM0DNDzww9+wP8JcJwOGQ2m1FVFVmWcb/fybKM/X7PYDDgeDwSIyHS6XTCWouIoKrM53OstYgIeZ4TKyGS957VasXlcuGtrmuWyyXT6ZT1ek2shEiqyltd13x6PB6EEIhliHQ4HPDe86koCtq2JYRALEOkxWLBeDxmNBrxyVqLc45YhkghBESEoij45L3HOUcswxdUlf+89zjnUFW+kRDpfD5TVRVN0/CWpilpmtK2LSEEYiV8YbPZ8ElVsdbinON2uxHD0IGIICJ8I6EDVeVbhg5EBBGhLEtiJXSgqrzleU4sQwcigohQliWxEjpQVd5UlViGDkQEYwyTyYRYhl9qmobtdsvr9eIbhl96Pp/sdjvatuXn54dYhg6u1yvWWqy1xBJA6ZGhZ/8AINV3qBrbb1AAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 6, 正解: 0

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACV0lEQVR4Ab3BvUvjcBzA4c/vZ6EYFMFOFl9w6WwEoaKLdLLBqXYQdFJBcBAJdBIR+6e4KEIKQhwVhaJTBEGHdvSlUx2MUBD0e2Q4OI42ydWjz6MAoYc0PabpsT7ggJgMw8BxHGzb5u3tjcfHR/5VgpgymQzFYpHFxUWUUnQrQUzlcplCoUCgWq1yeXlJNxLEkE6nyefzBDzPw7IsfN+nG5oYzs7OMAyD+/t7crkcvu/TLU0MpmkiItRqNXzf5yc0ETKZDFGmpqYoFoukUimiJIhQqVQINBoNyuUy7aytrbGzs0O1WmV/f5+rqys60USo1+torTk6OuLh4YF2bNvGcRzm5+e5uLhgcHCQTjQhZmdnyeVyfH9/43keYY6Pj/F9HxHBdV1SqRTtaEKMjo7S399Pq9Xi+fmZMI7jUKlUCMzNzbGwsEA7mhAbGxsEms0mt7e3RDk/PyeKJkStVkMpxfj4OMvLy0Q5PT3l9fUVpRS7u7u0owkxPT2NiPD+/k69XicOEUFEEBHa0cQwMDCAZVn8D5oQpVKJj48PAuvr64yMjPBTfcABHTw9PTExMcHMzAxDQ0MsLS0xOTnJzc0Nn5+f/CmZTLK5ucnKygovLy8UCgWazSZ/6wMOCOG6Lul0GtM0GR4eJpvNYlkWrVYLwzAYGxtjdXWVvb09tre3CRweHuK6Lu0oQIiQTCbJ5/PYtk02m0UphYjwm1IKESHgui5bW1s0Gg3aUYAQk2EYlEolLMvCNE0CnudxfX2NiHBycsLd3R1fX190ogChhzQ9pukxTY9peuwXLJ3aF+QdBYcAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 7, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACiElEQVR4Ab3BMUgyYQCA4be7L6kIwyGChKOmaJISMtKCkGoKXC6iIWqWaGqoySkaIiOPCBtqanBwFFoqiAYFh6YgsFrqiISGFDJNfxx+OI6ztOGepw2oYSMJm0nYTMJmEjaTsJmEzQR/sLi4iKIoGIVCIUZHRymVSszMzJDJZLDSBtT4wfDwMHNzcwwNDbG0tERdZ2cnsizTSKFQoKenByuCBg4PD1FVFYfDQXd3N63o6OjA6/WSzWYxk4EIBqurqySTSaanp+nq6sLhcNAqSZLo7e0lkUhgJjBYW1tjf3+fZlxcXKDrOpOTkyiKglkoFMKKwMDv9/ObdDrNysoKz8/PtLe3k0qlUBQFo2q1SjgcxorAYGFhgVqtRt3T0xPRaJRgMMjBwQH5fJ66YrHIw8MDLpeL5eVlfD4fRpVKhfX1deLxOFYEDWiahqZpaJqG2djYGFtbW8zPz2MWjUY5OjqiEYHB4+MjAwMDJBIJNE3Ditfr5fz8HKfTiZWXlxd+ImFwenpK3fb2NuVyGTNVVTk+PsbpdGL29fXFzc0Nuq7zE4HB2dkZmUyGu7s7rGxsbODxeLBye3vL1NQUvxEY5HI5crkcrdrb2yMWi9EMQQvy+TxWAoEALpeL3d1dXl9feX9/pxEZiNCky8tLAoEAbrcbI7fbzcjICOFwmGAwiN/v5+rqis/PT8xkIEKTPj4+SKVS+Hw++vr6EEJg1t/fj8fjoVgscn19jZkMRGhBoVDg5OSEt7c3ZmdnkWUZs0qlwubmJrquYyb4o3g8jq7rDA4OoqoqExMT/FetVslms1iRgQh/dH9/TzqdJplMUi6XGR8f5/v7m1KpxM7ODlbagBo2krCZhM3+AbH/4c1oDE3gAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 4, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB20lEQVR4Ab3BMUtqYRzA4Z//N3CxpkKHwDJEcRFcxckWIQwqDuYnaIqgzckP4ODgoijo4nbATQhyK4cocAjnaCjIQVxE8HjiDBfucPG+HuE8jw+w8ZDgMcFjgscEjymgjAYR4fz8nPF4TDabxTRNFosFmxI0JRIJTNNktVqRTqfJ5/O4sYOmfD6PwzAMEokEvV4PN3bQsLe3x+3tLZ+fnzw9PWGaJm4JGk5PTzk4OKDZbPL9/c02hA0Eg0G2JWh4fX1lOp2SzWYJBAJsQ9Dw8fHBaDQiFouRTCb5l7OzM/r9PoeHh6wjaDIMA8fNzQ0iwt+i0SjVapVYLMbPzw/rCJrm8zmOYrHI3d0df2QyGR4eHjg+Puby8pLFYsE6PsBGg1KK6+trOp0OlmXx9vaGI5VKoZSiUqlQKpWwLIt1FFBGg23bvL+/4/f7icfj7O/vc3JygojQaDS4v7/Hsiz+RwFlNNm2zePjI5VKhVarxcXFBbu7u7TbbV5eXtAhuCQiKKV4fn6mXq+jS3ApEolwdHTEYDBgE4JLuVwONwSXIpEIjm63yyYEl2azGY5CocAmBJdqtRqz2YyrqytCoRC6FFDGhclkwnK5JBwOMxwO+fr6QocPsPGQ4DHBY780XJT/XEx3HAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 9, 正解: 4

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACYElEQVR4Ab3BvUsycQDA8a8/D3EQg6Q15JyEIAKXpkjILVpawqnoH7AtcugNhIpaLiIoKIKgoKEG6YWGhIzGcpEcKkGw7QY5KcuLGw5E7Lx7HrjPxwPouEjgMoHLBC4TuEzgMi+wiAPBYJC1tTXm5uZ4e3ujUqmg6zp2eYFFbOrp6WFhYYFUKoUsy0xPT/P6+srT0xOGaDTK8PAwfr+fj48POpGwye/3c3Z2Rjwep1U6nebw8JDBwUFub2/p7e2lVqvR19fH5+cn7bzAIl0Eg0EuLi6Ix+OY6vU6Ly8v3NzcUCqVyOVyhEIhDD6fD1VVeXh4oJ2EDdvb24yOjmIqFousrq5yfHxMLBbj5OSEUChEK1mW6UTCgtfrJZvNMjIygqlQKJBIJFBVlWQyyc7ODoFAgFbf399ks1k6kbCQTCYZGxvDVC6XSSQS9Pf3c39/jyzLtCsWi8zOzpLP5+lEwsLS0hKtms0miqIwMTGBJEm0q9frzM/Pk8/n+YuEA+FwmHA4zF+urq44Pz/HisDC9fU1TqysrNCNwMLy8jKlUolW7+/v7O/vc3l5Sav19XWen5/pRsJCpVJhaGgIn8/HzMwMmqZxdHREs9nk8fERU7lcZmtri5+fH7qR6ELTNDRNY3NzE9PU1BQDAwMYGo0GmUyGarWKHYJ/kE6nMamqyu7uLnYJHJqcnCQajWLa2NjACYFD4+PjGDweD4ZCoYATAocikQgGXdcxnJ6eEolEsEvwnwKBALFYDLsEDu3t7dFoNDB9fX1RrVaxS+DQwcEBiqJgUhSFu7s77PIAOi4SuOwX7jXcuEdW+Z4AAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 1, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABvklEQVR4Ab3Bu2oiUQCA4d+zgUFQgxgQvDWCYCEiKHZWVj6B2opiY4KQImMhaxoLwdbKRrFIFbAQ5gGU+ABpTCxSWAiTTsRLMcu2S5bMnMh8nwMwsJHAZgKbCWwmuCC3202j0WCxWBCNRvnKFRfi9XrRNI10Os12u+Xm5ob1es2/BBfgcrlQVZVMJsP5fKZYLLJcLvnKFRcQjUap1Wo8PDzw/PzMarXif674oUAgwHw+p9Pp0Ov1+I7gB3w+H8PhkM/PT0ajEWYIJDkcDprNJolEgnw+z3a7xQyBpFgsRqvVot1u8/b2hlkCCaFQiMlkwnA4ZDweY4VAQrVa5XQ6oaoq5/MZKwQWpVIpKpUKj4+P6LqOVQILFEVB0zReXl7QNA0ZAgvq9TrX19c0m00Mw0CGwCSPx0Oj0cAwDCKRCLIEJt3f3+P3+3l/f2cwGCBLYFIul6Pf79PtdonH4wSDQWQITAiHw2SzWWazGZvNho+PD3RdR4bAhEKhgKIo/FUul9nv9xyPR2QITHh6euL19ZW7uztKpRK73Q5Zv4DffONwODCdTkkmkzidTm5vb9lsNshwAAY2EthMYDOBzf4An2iOKvMm/FwAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 6, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACjElEQVR4Ab3Bv0syYQDA8e89HnYHRyV2GA1NV4OXUINB0SIEUREETkHQ0BJF4RbS0tCPqUnQQaKooK2a6g8oJycHh+DGIqSGWpIiel4cBJHz1F7w81EASQcJOkzQYYIOU2lBKBTCsix6e3vZ3t4mmUxSkcvlaJcCSDwEg0EymQzxeJx6KysrXFxc0A4fsIuHy8tLFhcXcROLxSiVShQKBVql0kAwGOT4+Jj5+Xka0TSNvr4+2iFwEQqFyGQyLCwsIISgkb29PY6OjqinaRqrq6tEIhHqqbiwLIt4PE69nZ0dSqUSVScnJ7jZ398nkUiQz+dZXl7GcRyqVJr4+fnh/f2dw8ND0uk039/fNDM3N0dFNBrFNE0cx6FKpQnHcbBtm1aNjY1hGAaNqLhYX1/nL8bHx8lmswwMDNCIwMXS0hJ/EYlEGBkZwYuKi2KxiG3bVAghaCYcDjM6Oko2m0VRFKSUVCmKQi2Bi7W1NaSUSCkJBALMzs7i5eDggPPzc6SU/P7+IqVESomUEikltQRNmKZJOp1menqaeuFwmJubG6LRKG5OT095fHykloqLcrnM6+srpmlSMTg4yNXVFV9fX9Ty+/0YhkEjb29vlMtlavmAXeq8vLxQLBaZmpqip6eHCr/fj67r6LqOruvouk5XVxdeJicnub295enpiSpBA3d3dxQKBbwoikKt+/t7Hh4e8KLiYWNjA9u26e7uxjAMNE2jlpSSz89Ptra2yOVyfHx8kEwmmZiYwOfz4UbFw/PzM0NDQ1Rsbm4Si8Xo7+/HMAwcx0FRFK6vrzk7O6MqkUgwMzPD8PAwblRalEqlSKVSWJZFIBAgn8/zFyptchyH/6EAkg4SdJigwwQd9g+ves6R52NOMAAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 4, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABYElEQVR4Ab3BQW3DMBiA0W/eYMQhUAL5EZRAbQa9RwmBEbAbACWQmkes4nARNAA6+RBpp83uIe99AC92pNiZYmeKnSl29gl8U2lZFq7XK+u6EmOkhqLSsiyICJlzDq01NRQVnHOICCkl2rYlc85RQ1HBGEPWti0pJWKMGGPQWlNKUUFrjfeezePxIDPGUEpRaBgGsmma2BhjyLquo5SiUNd1ZCklsmEY2DRNQylFoaZp+O10OrEREUopCsUYyUSETETIQgjUUBSapolsnmestWTee4wxeO8ppSiUUiKEgNaaeZ7JtNZsrLXcbjf+8wl8UyiEwLquHI9HssPhQCYiNE3D+Xzm+Xzyly8qee9xzrEJITCOIyklSnxRSWvNb9Zaaigq9X3PJsZILUUlEWEzjiO1FBW01ogIWQiBGCO1FBX6vmdjreUdijeEEHiXosL9fie7XC686wN4sSPFzhQ7+wEmI3O+woByuQAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 0, 正解: 2

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACG0lEQVR4Ab3Bv0syYQDA8e89nuAgJba4OaRDDSmIYwitklSLWNzSEE7lGAbyakTR5KLDERhkUFsSTf4B4Xb/QDgZHA0JBRVJ9+Lwgjxcp/147/NRAAsXCVwmcJnAZSpf4PV6WV9fZ2lpCU3TsKNpGpeXlwwGA+wogMUYQgg0TaNYLBKJRBinXq9TLBZ5fn7GsixGeYA/jBGNRmm32wSDQSaRTCbZ3d2lWq3y9vbGKMEYqqqytrbGd5RKJWSCMfL5PAcHB8hM06RcLtPpdHh/f8dOoVBApuIgEAiwvb3NqNfXV46OjtB1HdM0qVQqLC8vc3h4yNzcHOMIHITDYWZnZxllGAb7+/uYpsk/19fXHB8fMwmBg62tLX6bwEGv10PW6/X4CYGDRqOBzOfzkUqlSKVSTE1N4eT8/ByZyifi8Tj1eh1ZOp0mnU4zZBgGT09P6LrO/Pw8snK5jEzFRiwW4+bmhlAohJN4PM7Q4uIismazSbfbRSawkcvlCIVC/ITf78eOQLKxscHm5iY/tbKywsLCAjKB5OzsjJmZGX7D6uoqMsF/ZBgGMpVfdnp6ysvLC7e3t1xdXSFTkWSzWS4uLphEt9ul1Wqh6zoPDw8M9ft9Pj4++IwCWIxQFIVMJsPe3h6JRALZ/f09zWaToZOTE+7u7vgKBbCw4fF4mJ6eZmdnh8fHR2q1GkOWZTEYDPguBbBwkcBlApcJXPYX6C6uZ6GK9gwAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 3, 正解: 5

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACnklEQVR4Ab3BP0gyYRzA8e9zHg02FHSuNeo16uTgUosNgQZBKLTl3FhB4HRNgjU02Ci5RNrSWqCLBC0hPbe0nMMt5+Bybf1eHIKXl/z3vi9+PgoQFshgwQwWzGDBDBbMZA6pVIp8Po9t2+RyOZRSaK2JxWI0m00ajQbtdptJFCBMsbe3x+npKclkEhFBKYWIMBgM0FqTyWQQEfr9Pp1Oh8PDQ8YxmaJer1MsFhERlFKMfH5+orXm4eGBZrNJJpOh2WyyublJpVKhVCpRq9X4ickUiUQCEUFE6HQ6aK25vLzEdV2+aa0Zabfb7OzsMIkChAls2yYWi/H+/k4QBIxks1kSiQSWZeE4DmEYMiuTKbTWaK35Vq/XKRQKiAiDwYBarYbneczKZEa2bXN/f088HkcpRavVotFo4Hke8zCZgW3bvLy8EI1GEREcx+Hi4oIwDJmXyQyy2SzRaBSlFK7rcn5+zt+KAGWmWFlZoVAoMLK2tkY6nWZ5eZnX11fmFQHKTPHx8UGv1+P5+ZmlpSVSqRT7+/scHBzQ7XbxfZ9ZKUCY0/r6OpZlUa/XicfjXF1d4TgOQRAwTQQoM6fhcIjv+1xfX9Pr9Tg7O8M0TXq9HmEYMkkEKPMPtNY8PT1RqVTY3d3FdV08z2OcCFDmH/m+z+PjI8fHx2xtbXF3d0cYhvwkApT5D4IgwPd9crkc6XSa29tbfhIByoyxsbHB6uoqw+GQWby9vbG9vU02m2U4HNLtdvmTyQT5fJ6TkxP6/T7jtFotXNdlxLIsLMvi6+uLeDzOT0wmqFarVKtVSqUSI5lMhkQiQSqVQkRQSpFMJlFKISIopRARDMNgHAUIcyoWi2itOTo64ne2baO1JggCbm5u8DyPPylAWCCDBTNYsF9oXxrem2oSHQAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 1, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABj0lEQVR4Ab3BwaoxYRzA4d/8jc4sJWUh0ViYhWxZuwf3QFaysURcg42lcgEmLNyABUp2FrgBlFjhPc1i6ut0vvI6Nc9jAIoACQETAiYEzERTKpViv9/jq9Vq9Pt93mWiSSmFUgqfUgodQsCEgAmaer0efyFoikQi+A6HA9PpFB2CBsdxcBwH3/V65Xg8okPQkMlksG0bX6PRQJegodFo4LtcLpxOJ3QJGmzbxjeZTFiv1+gy0SAiGIaBxzAMPmGi4fV6oZTCo5TiE8KHwuEwpmmiS/hQuVymUCigS9Cw3W75V7fbRVcIaPGm+XxOPp8nk8ngiUajbDYbdrsdHhEhmUxSqVRYrVY8Hg9+CgEt3nS73XBdl2KxSDqd5uvri1gsRi6X43a7Ua/XGY1GJBIJXNflfD7zkwEoNFmWxXg8plQq4RER7vc7lmXhabfbdDodfhMCWmh6PB7MZjOWyyXZbJZ4PI5pmniGwyHNZpPn88lvDEDxR9VqFdu2iUQiDAYDFosF/2MAigAJARMCJgTsG1lYfZ4LEFrQAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 4, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAB/ElEQVR4Ab3BP0gyYQDA4Z+viZ20SI0emEu4SuFQBgmJNLvcFjTVUItrIC3NtbjXUmR/cFccWkQhaNZFiCNSzIbqTDPe4dbP9/WDex4fMMFDAo8JPCbwmMBjAo/Noenk5ITj42MmkwkXFxfs7u6iww8UUHR6esra2hqxWIz7+3sCgQDz8/MsLi4Sj8dptVpMM4ciwzA4PDzEMAyenp44ODig1+tRqVRIpVJ8fX2Rz+cpFov8i0CRZVkYhoF0dnbG6+srCwsLRKNRJMMw2N7eZhqBIsuykAaDAeVyGSmZTGKaJq5SqcQ0Ak1HR0e8v78jJRIJXI+Pj1xfXzONQFGn00Ha2NjAlUqlcL29vTEej5lGoOj39xdpb2+PcDiMFIlE0DWHom63i+Tz+VhdXeXl5YV4PI7r7u4OFX6ggIJms8nm5iamaRKLxRiNRmSzWaRut8v+/j4/Pz9M4wcKKHAch9vbW6LRKDs7O2QyGVylUombmxtU+IECihzHoVqtYts26+vrBINBvr+/OT8/5/n5GRUCTf1+n6urKxzHQfr8/OTy8hJVghlsbW2xtLTELAQzyOVyuOr1OjoEM0in07ja7TY6BP/p4+MDHQJNy8vLBINBpNFoxMPDAzoEmlZWVgiFQki1Wo1ms4kOgSbbthkOh0iNRgNdPmCChwQe+wPBh6lCZk6VuwAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 2, 正解: 3

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACsklEQVR4Ab3BTyh7AQDA8e/bnvciLdFDvaRYlkivcXDRuGzv6uAykj9JwnHXtZpycJGri4MD4bCTcRWTHF4ooua0wyw7KL2Wl/frHZRe+/0Mv/b5CIBNFXmoMg9V5qHKRFxkWUaSJBymaWJZFv+TiMvJyQnBYBBHOp1mdXWV29tbisUi/4OIS39/P7Zt49B1HV3XyeVyRKNRnp6eeHx8xLIsfsoLJPikpaWFgYEBSqUSNzc31NXVoSgK09PTLC0toWkara2tnJ+f8xNeIMEnx8fHXF9fk8lkmJub4/7+Hl3XkWUZR1dXF+FwmGAwSC6Xo1Qq8fr6SqUEwOYLfX19+Hw+5ufn0TSN7u5uBEHAtm0uLi6IxWKcnp5SCQGw+QZFUVBVlVAoxMLCAn6/H9M0iUQinJ2d8RWRbyoUChQKBQzDIJVKkU6n8fv9+Hw+KuHhF3p6elBVle8Q+aH6+nr29/epqakhn8+TzWaphMg3SZLE8PAwR0dHvL+/4xAEgcnJSRyzs7M0NzezsbFBMpmkWCzymQDYVKC2tpaGhgY2NzfRdR1BELBtm6+IoshnIhUIhULE43FCoRAfnp+f2dnZQZZlMpkMbW1tDA4Osre3RywWIxAIUI7IX7S3t/P29sby8jIzMzM0NTXx4erqimg0yt3dHeWMjo4SCAQoR8TF6/USj8eZmpqiVCrR0dHBh8vLS9bW1kilUliWRTmKoqBpGo7d3V3cRFwkSWJiYgJVVflQKBRYXFzk8PAQ0zT5m87OTra3t1FVFUcymcRNxMU0TVZWVgiHw+Tzeba2tnh5eSGbzfIviqIwNjZGb28vjkQiwcPDA24CYPNLIyMjxONxhoaGcBwcHDA+Po5lWbiJ/FJjYyORSATDMDAMA8f6+jqWZVGOANhUkYcq81BlHqrMQ5X9AWlv8OcKvVAxAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 5, 正解: 9

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACaElEQVR4Ab3BsUsyYQDA4d+9XQrO0eYkISRGUA1OLS0ixAtNTYIQEh1EGC6ROIRQFBEEFQ0NlUGC+A8E1VrWUBEEt9QQSUsN3YHg+3GDEB+eWsQ9jwYoPCTwmMBjAo8JPCbwmM4PBYNBZmZmkFISiURomp6e5vT0lE50uhQMBjEMg2QySV9fH5qmoZSiWq2SzWa5vr6mGzpdSCQSrK2tEQ6HabJtG7/fz9nZGRcXF3SrB8jTRiqVYmVlhYGBAb6LxWJ8fX1hGAZvb288PT1Rr9fpRNBGKpVie3ubUCiEaZrYto3j/v6e29tbisUiSin29vZIJBJ0Q+AiHA6zv7+P3++nVCqRyWTQNA3LspiamsJxc3PD5OQkmqZxcnKClJJOBC6WlpZQSqGUIpPJEI1GcSSTSUzTpKlarfLy8oJSisPDQ4aHh2lH0EIkEkFKiWNxcZFsNksul+Pz85Nyucx3Hx8fxONx3t/fCQQCTExM0I6ghcHBQQKBAI7Z2VkMw6C3t5eDgwNaeXx85OjoCEc8Hsfn8+FG0IJpmti2jSMUCuHY2Nggl8vhplAo4BgfHyedTuOmB8jzn9fXVzY3NxkaGqJYLLKwsMDx8TGNRgM3lmXR39/P2NgYIyMjrK+v04qOC8uykFLyU0oplFK4EXhM4DGBxwR/RErJ3NwcmqZRKBRwI/gDsViMra0tGo0G5+fn7O7u4kbnl/L5PHd3d4yOjjI/P4/P5+P5+ZmdnR3q9TpudH4hGo2yvLyMUoqmq6srVldXqVQqtNMD5PmhWq1GrVZD13UuLy8pl8uk02keHh7oRAMUHhJ47B/ZqeXtQGEq9AAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 5, 正解: 3

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACKElEQVR4Ab3BoUszYRzA8e/z7IIoYhDEJGsT/wIHGizTJIIMm0ENImhzWIRV86IMjhsLEwzXtAjPxLAypgZd24JwOBEHhrnwO7kgvIjvdrdwn48CfGKkiZkmZpqYaWJmMcDs7CwXFxcsLy8jIgSOj495f38ncHV1hed5RGExwPz8POl0GhFBRAicnZ0R0FrTaDRwHAfXdXl7e+Pz85NhEkCeAbrdLsYYqtUqgWQySUApxczMDJlMhqOjIxYWFuj3+zw/PzNIAsjzHx8fHxhjMMZgjOHh4YHNzU3Gx8dRSuH7Pj9SqRRfX1+4rssgFiGdnJyQzWaZnp7mL8VikVKpxDAWQywtLXF7e4uI8C/Hceh0OuRyOaKwGGJnZwcRQUT4USwW2d/fZxQWI9jd3cXzPGzbptVqEYVmiGazyV9OT0+pVCpElQDyDHB3d0e73cZ1XZRSpFIpAkopJicneXp6otlsEpYCfCLa29vj/PwcESGwvb1NuVwmjASQJ6J6vc7BwQFjY2P4vs/KygovLy88Pj4yjGZEq6urtNttAlNTU9i2TRiaETUaDba2tojKIoKNjQ3W19cJKKWYmJggKouQkskkl5eX/NBaIyJEpQnJ8zxs20ZEEBFEBBFBRBARXl9fCUMTUq/Xw3Ecut0uv7VaLdbW1ghDE4Exhlqtxm/X19fc398TRgLIE8HNzQ2Li4vMzc3R6XQ4PDykUCjQ7/cJQwE+MdLETBOzb99U5koZB5nEAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 0, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACz0lEQVR4Ab3BPUgybBSA4fs8NilBlAUt5hKFRC2uFmKEQRAULSG1hIFDNEVkg0tzNBXR0OiQk1SuCQ069UMILqFLpNLoYPCcDwchJH3zG7wuAZQ+MvSZ4X+Ym5vj8/OTcDhMrxxAgh74fD5isRiBQIBgMEitVuPl5YW/MvQoGo2yu7tL08jICKpKLwb4IxHB7XYzPz9PS71ep1wu04sB/igcDpNOp/mpWq2SzWbpheEPtra2uLy8pJ3L5WJ5eZleOIAEXYgIbrebjY0NnE4nTSJC0+DgIJubmzQaDXK5HNZa/sUBJOhCRCgWizidTlpEhJ9CoRAej4disUitVqMbB5Cgg9XVVc7Pz/F6vYgIIoKIYIyhSUQQEYwxzM7OEovF+Pr6Ip/P04mhi2g0SiAQQFVRVVSVt7c3bm9v2dnZ4eHhAVXFWouqoqocHx/TjQNI8AuXy8X29jYTExP8dHJywv7+Pk9PT9zc3DAzM8Pw8DBOp5Mmp9NJo9Egl8thraWdA0jwi8XFRQ4PD2mXyWTI5/M0fX9/8/HxwdXVFaqK3++nKRQKUa/XeXx8pN0AHZydnSEitNzf37OyskK7bDZL09LSEiJCkzGGSCRCMpmkVCrxk6EDVUVVUVVUFVWlm729PSqVCqqKtRZV5TeGP/L7/VxfXzM0NMRvMpkM8XicFp/Px/T0NO0G6CCVSnFwcEDL6OgokUgEj8fD6+srhUIBEWFqagoRIZVKEY/H+ZcBOhgbG0NEaLewsEAwGMRaS4sxhvHxcbxeL03GGKy1iAjtDB1cXFxQqVRQVVQVVUVVUVWstagqqoqqYq1lbW0NVUVVeX9/5+7ujmq1SjsBlA7C4TCnp6dMTk7yk4igqrSICKrK8/MzR0dHlMtlCoUCvxFA6UJESCaTrK+v0yIiqCrVapVCoYCIkEqlSKfTlEoluhFA6SNDnxn6zNBnhj4z9Nl/U3swOPg2Vx0AAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 6, 正解: 1

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABC0lEQVR4Ab3BMQ4BYRSF0c+d0REFtZXYgkSnkEisQKUjmUYxpQ2I6JSzBwvQ6iYqOr3kkdmB9yb5z+kAXxISiYnEMqDAabvdslgseL/fPB4PPHICVqsV4/GYbrfL9XrFQyQmAo7HI437/Y6XcJrNZmw2GxplWeKV49Dr9Vgul/T7faJyHEajEdPpFDMjSgRVVUWECJpMJkSIoOFwSESOkyTayHEyM9oQLRRFwXq9xiOnhd1ux+fzoXE4HPiHaCnLMgaDAf8SDnVds9/vkYQkJCEJD+F0Op14Pp+YGWaGmeEhnOq65nK5ECUCzuczr9eLCBFwu92Yz+c0yrKkqir+1QG+JCQSE4mJxERiP8x9TbAH1MqnAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 8, 正解: 6

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACLUlEQVR4Ab3BPUgyYQDA8f89XqhBIdSioEtYmGAKQoNrW4ltB2FDBFEQhTT1QTjYUCBNfUxtjQoOTa6G2BDo4GRDQxAtmlx4gXAvDcG7mI8l9/spgImFBBYTWEwwZOPj42xvb9OLYMhyuRzNZpNeVIZkbGyMzc1Nut0uhUKBXlSGIBgMcnl5ic/nIxAIYBgGvaj8USgU4uzsjFqtRjwexzAMfiL4A7/fTzabJRqNcnR0RLvdph+VX3I4HNze3jI1NcXS0hLv7+/IEPzSzc0N0WiU4+NjyuUysgR9XFxc4Ha7cblcfNva2mJhYYFYLMb19TWDUOkjHA7z+PjI09MTqVSKt7c3Tk9POTk5oVwuMyiVPhYXF7Hb7ezu7lKpVPhWKpX4DRuQ5geGYfDx8YGu66ytrSGE4IthGIyOjlKv1xmEDUgj4eXlhZWVFSYnJ2m1WkxPTzMxMYHdbqdarSLLBqSRMD8/TyqV4urqivPzc0zTxOv1srq6isfjoVgsYpom/Qgkzc7O0m632dnZoVAosLGxwf7+Po1Gg0QigdPpRIZAkt/vR1EU/nd/f08+n6daraLrOjIEku7u7nC5XCwvLyOE4MvIyAhzc3N0Oh1k2YA0Enw+H+vr62iaxszMDN1ul729PSKRCMlkEl3XkaEi6eHhgWKxSCAQQNM0NE1DURQODw95fX1FlgKYDCASiXBwcMDz8zOfn59kMhk6nQ6yFMDEQgKLCSwmsJjAYv8Ac4O5/wRN5Y0AAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

予測: 1, 正解: 7

" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABZUlEQVR4Ab3BoaryYBzA4Z9/Xxiu7B4Ub2BNsNhXrRqsIharBhGDVi9ALBoEy8CyNjAbBaOow6KIYZb3YDhwih/b+8GeJwdoMiRkTMiYkDEhY0LGhIwpDDUaDebzOcfjEdd1eT6fJKFIybZt+v0+3W4XrTWlUolisch+vycJRQpKKZbLJZ7nEccxJoSECoUC6/Uaz/M4n8+Uy2VMKBJwXZfJZEKtVmM2mzEej7nf75hQfKGUwnEcWq0WvV4PEWE4HDIYDPiwbRsTii86nQ7T6ZSP7XZLvV7n9XrxK45jwjCkWq2ShuKLw+HAbrcjCAJGoxFxHPOXZVlUKhXSUnzh+z6+7/Mv+XyeKIqIooikhP90uVy4Xq8kJRhqNpvkcjkWiwVpCIa01mitSUvImJAxIWOCIcuyMCEYcByHdrvNRxAEpCEYeDwe3G43Pk6nE2kIhjabDSYEQ6vVijAMeb/fpJEDNBn6AUkMeA6kBDdUAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "const predicted = tf.argMax(cnnModel.predict(mnist.getTestData().images) as tf.Tensor, 1).arraySync() as number[];\n", "const labels = tf.argMax(mnist.getTestData().labels, 1).arraySync() as number[];\n", "\n", "const numSamples = 32;\n", "let count = 0;\n", "for (let i = 0; i < predicted.length && labels.length; i++) {\n", " const pred = predicted[i];\n", " const label = labels[i];\n", " if (pred === label) {\n", " continue;\n", " }\n", " tslab.display.html(`

予測: ${pred}, 正解: ${label}

`)\n", " const pngs = await toPng(mnist.getTestData().images, i, 1);\n", " tslab.display.png(pngs[0]);\n", " count++;\n", " if (count >= numSamples) {\n", " break;\n", " }\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以上でJavaScriptのみで複雑なディープラーニングモデルを構築・訓練から実際にアプリケーション上で推論を行うところまでエンドツーエンドで行うことができました。TensorFlow.jsを使っているので、完成したモデルをブラウザ上で実行することも最小限の追加コードで実現できます。詳しくは[TensorFlow.js](https://www.tensorflow.org/js/guide)のドキュメントや他の人による解説記事を参照してください。" ] } ], "metadata": { "kernelspec": { "display_name": "TypeScript", "language": "typescript", "name": "tslab" }, "language_info": { "codemirror_mode": { "mode": "typescript", "name": "javascript", "typescript": true }, "file_extension": ".ts", "mimetype": "text/typescript", "name": "typescript", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 2 }