Skip to content

Instantly share code, notes, and snippets.

@kyamagu
Last active December 11, 2017 07:32
Show Gist options
  • Save kyamagu/2f1ed444cf73db614ac17a210de6f387 to your computer and use it in GitHub Desktop.
Save kyamagu/2f1ed444cf73db614ac17a210de6f387 to your computer and use it in GitHub Desktop.
Caffe2 MNIST tutorial
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import os, requests, zipfile, StringIO\n",
"\n",
"if not os.path.exists(\"./mnist\"):\n",
" r = requests.get(\"http://download.caffe2.ai/databases/mnist-lmdb.zip\",\n",
" stream=True)\n",
" z = zipfile.ZipFile(StringIO.StringIO(r.content))\n",
" z.extractall(\"./mnist\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:root:This caffe2 python run does not have GPU support. Will run in CPU only mode.\n",
"WARNING:root:Debug message: No module named caffe2_pybind11_state_gpu\n"
]
}
],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from caffe2.python import core, model_helper, workspace, brew, optimizer\n",
"\n",
"def AddInput(model, batch_size=100, db=\"mnist/train-nchw-lmdb\", db_type=\"lmdb\"):\n",
" \"\"\" データベース入力Operatorの定義 \"\"\"\n",
" data_uint8, label = model.TensorProtosDBInput(\n",
" [], [\"data_uint8\", \"label\"], batch_size=batch_size,\n",
" db=db, db_type=db_type)\n",
" data = model.Cast(data_uint8, \"data\", to=core.DataType.FLOAT)\n",
" data = model.Scale(data, data, scale=float(1./256))\n",
" data = model.StopGradient(data)\n",
" label = model.StopGradient(label)\n",
" return data, label"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def AddLeNetModel(model, data):\n",
" \"\"\" LeNetの定義 \"\"\"\n",
" conv1 = brew.conv(model, data, \"conv1\",\n",
" dim_in=1, dim_out=20, kernel=5)\n",
" pool1 = brew.max_pool(model, conv1, \"pool1\",\n",
" kernel=2, stride=2)\n",
" conv2 = brew.conv(model, pool1, \"conv2\",\n",
" dim_in=20, dim_out=50, kernel=5)\n",
" pool2 = brew.max_pool(model, conv2, \"pool2\",\n",
" kernel=2, stride=2)\n",
" fc3 = brew.fc(model, pool2, \"fc3\",\n",
" dim_in=50 * 4 * 4, dim_out=500)\n",
" fc3 = brew.relu(model, fc3, fc3)\n",
" pred = brew.fc(model, fc3, \"pred\", 500, 10)\n",
" softmax = brew.softmax(model, pred, \"softmax\")\n",
" return softmax"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def AddAccuracy(model, softmax, label):\n",
" \"\"\" 正答率の計算用Operator \"\"\"\n",
" accuracy = brew.accuracy(model, [softmax, label], \"accuracy\")\n",
" return accuracy\n",
"\n",
"def AddTrainingOperators(model, softmax, label):\n",
" \"\"\" 学習に関わるOperator、損失計算とSGD更新 \"\"\"\n",
" xent = model.LabelCrossEntropy([softmax, label], \"xent\")\n",
" loss = model.AveragedLoss(xent, \"loss\")\n",
" model.AddGradientOperators([loss])\n",
" opt = optimizer.build_sgd(model, base_learning_rate=0.1, policy=\"step\",\n",
" stepsize=1, gamma=0.999)\n",
" for param in model.GetOptimizationParamInfo():\n",
" opt(model.net, model.param_init_net, param)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlobReference(\"softmax\")"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 学習用モデルの構築\n",
"train_model = model_helper.ModelHelper(name=\"mnist_train\")\n",
"data, label = AddInput(train_model, db=\"./mnist/mnist-train-nchw-lmdb\")\n",
"softmax = AddLeNetModel(train_model, data)\n",
"AddAccuracy(train_model, softmax, label)\n",
"AddTrainingOperators(train_model, softmax, label)\n",
"\n",
"# テスト用モデルの構築\n",
"test_model = model_helper.ModelHelper(name=\"mnist_test\", init_params=False)\n",
"data, label = AddInput(test_model, db=\"./mnist/mnist-test-nchw-lmdb\")\n",
"softmax = AddLeNetModel(test_model, data)\n",
"AddAccuracy(test_model, softmax, label)\n",
"\n",
"# デプロイ用モデルの構築\n",
"deploy_model = model_helper.ModelHelper(name=\"mnist_deploy\", init_params=False)\n",
"AddLeNetModel(deploy_model, \"data\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"TRAIN: accuracy=0.1000, loss=2.3646\n",
"TRAIN: accuracy=0.9800, loss=0.1051\n",
"TRAIN: accuracy=0.9400, loss=0.1828\n",
"TRAIN: accuracy=0.9600, loss=0.1246\n",
"TRAIN: accuracy=0.9900, loss=0.0785\n",
"TRAIN: accuracy=0.9800, loss=0.1213\n",
"TRAIN: accuracy=0.9800, loss=0.0749\n",
"TRAIN: accuracy=0.9800, loss=0.0472\n",
"TRAIN: accuracy=0.9700, loss=0.0948\n",
"TRAIN: accuracy=0.9700, loss=0.0762\n"
]
}
],
"source": [
"# パラメータの初期化を一度だけ実行し、計算グラフを構築\n",
"workspace.RunNetOnce(train_model.param_init_net)\n",
"workspace.CreateNet(train_model.net, overwrite=True)\n",
"\n",
"# 学習経過の記録用に配列を用意\n",
"total_iters = 600\n",
"accuracy = np.zeros(total_iters)\n",
"loss = np.zeros(total_iters)\n",
"\n",
"# 学習ループを手動で構築\n",
"for i in range(total_iters):\n",
" workspace.RunNet(train_model.net)\n",
" accuracy[i] = workspace.FetchBlob(\"accuracy\")\n",
" loss[i] = workspace.FetchBlob(\"loss\")\n",
" if i % 60 == 0:\n",
" print(\"TRAIN: accuracy={:1.4f}, loss={:1.4f}\".format(\n",
" accuracy[i], loss[i]))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7e8f344a2390>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEKCAYAAADpfBXhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXd4FcX6x79DEhJqkKpICVywcJWAoAjYsSBWbKggggX9\nKSKKBfsFhSvCtXvFgmJBrDQRK0XlqkBAepEiJfSWhDTS3t8f7xl2ds+ekuQkJ3t4P8+zz+7Ozs7O\nnLP7nXfemZ1VRARBEAQhtqgW7QwIgiAIkUfEXRAEIQYRcRcEQYhBRNwFQRBiEBF3QRCEGETEXRAE\nIQYRcRcEQYhBRNwFQRBiEBF3QRCEGCQ+Whdu2LAhpaSkROvygiAInmTx4sX7iKhRqHhRE/eUlBSk\npaVF6/KCIAieRCm1JZx44pYRBEGIQUTcBUEQYhARd0EQhBgkaj53QRBil8LCQqSnpyM/Pz/aWfEs\nSUlJaNasGRISEsp0voi7IAgRJz09HXXq1EFKSgqUUtHOjucgIuzfvx/p6elo1apVmdIQt4wgCBEn\nPz8fDRo0EGEvI0opNGjQoFwtHxF3QRAqBBH28lHe389z4r5yJfDUU8DevdHOiSAIQtXFc+K+bh3w\n3HPAzp3RzokgCFWZ2rVrRzsLUcVz4l6zJq/z8qKbD0EQhKqM58S9Rg1e5+ZGNx+CIHiPzZs344IL\nLkD79u3Ro0cPbN26FQDwxRdf4JRTTkFqairOOeccAMCqVatwxhlnoEOHDmjfvj3Wr18fzayXGs8N\nhdSWu4i7IHiDoUOBpUsjm2aHDsDLL5f+vPvuuw+33norbr31Vrz33nsYMmQIpk2bhpEjR+L777/H\n8ccfj4yMDADA+PHjcf/996Nv374oKChAcXFxZAtRwXjOchdxFwShrPz++++4+eabAQC33HIL5s+f\nDwDo3r07BgwYgHfeeeeIiHft2hWjR4/GmDFjsGXLFtTQbgOP4DnLXf++4nMXBG9QFgu7shk/fjwW\nLFiAb775Bp06dcLixYtx8803o0uXLvjmm2/Qq1cvvPXWW7jggguindWwEctdEISjhm7duuHTTz8F\nAEyaNAlnn302AGDjxo3o0qULRo4ciUaNGmHbtm3YtGkTWrdujSFDhuCqq67C8uXLo5n1UuM5y13E\nXRCEcMjNzUWzZs2O7D/44IN47bXXMHDgQIwdOxaNGjXC+++/DwB4+OGHsX79ehARevTogdTUVIwZ\nMwYfffQREhIScOyxx+Lxxx+PVlHKhOfEXdwygiCEQ0lJiWv4nDlz/MKmTJniFzZ8+HAMHz484vmq\nLDznlklIAOLixHIXBEEIhufEXSl2zYi4C4IgBMZz4g6wa0bcMoIgCIHxpLiL5S4IghAcz4p7Tk60\ncyEIglB18aS416kDHDoU7VwIgiBUXTwp7snJQFZWtHMhCEJVZ9q0aVBKYe3atdHOSqXjSXGvW1fE\nXRCE0EyePBlnnXUWJk+eXGHXqKoTinle3EtKgJkzAaLo5kkQhKpFdnY25s+fjwkTJhyZcgAAxowZ\ng1NPPRWpqalHXlLasGEDLrzwQqSmpuK0007Dxo0bMW/ePFx++eVHzhs8eDAmTpwIAEhJScGjjz6K\n0047DV988QXeeecdnH766UhNTcW1116LXN+Ij927d6N3795ITU1FamoqfvvtNzz99NN42Zhw54kn\nnsArr7wS8fJ77g1VgMU9M5O3x48H7r0X+OgjoF+/6OZLEAQXojTn7/Tp09GzZ0+ccMIJaNCgARYv\nXow9e/Zg+vTpWLBgAWrWrIkDBw4AAPr27Yvhw4ejd+/eyM/PR0lJCbZt2xY0/QYNGmDJkiUAgP37\n9+POO+8EADz55JOYMGEC7rvvPgwZMgTnnnsupk6diuLiYmRnZ6Np06a45pprMHToUJSUlODTTz/F\nwoULI/Cj2PGkuCcnA9nZQHExoH//EP+DIAhHGZMnT8b9998PALjxxhsxefJkEBEGDhyImr5JqurX\nr49Dhw5h+/bt6N27NwAgKSkprPT79OlzZHvlypV48sknkZGRgezsbFxyySUAeKqDDz/8EAAQFxeH\n5ORkJCcno0GDBvjzzz+xe/dudOzYEQ0aNIhYuTWeFPe6dXmdnQ1U8zmWqqjbSxCEKMz5e+DAAcyZ\nMwcrVqyAUgrFxcVQSuH6668PO434+Hjb/DT5+fm247Vq1TqyPWDAAEybNg2pqamYOHEi5s2bFzTt\nO+64AxMnTsSuXbtw2223hZ2n0uBZnzvAfnct7gHmCBIE4Sjkyy+/xC233IItW7Zg8+bN2LZtG1q1\naoXk5GS8//77R3ziBw4cQJ06ddCsWTNMmzYNAHD48GHk5uaiZcuWWL16NQ4fPoyMjAzMnj074PUO\nHTqE4447DoWFhZg0adKR8B49euDNN98EwB2vmT5/cu/evfHdd99h0aJFR6z8SONpcc/M5EnEABF3\nQRAsJk+efMTNorn22muxc+dOXHnllejcuTM6dOiAcePGAQA++ugjvPrqq2jfvj26deuGXbt2oXnz\n5rjhhhtwyimn4IYbbkDHjh0DXu/ZZ59Fly5d0L17d5x00klHwl955RXMnTsXp556Kjp16oTVq1cD\nAKpXr47zzz8fN9xwA+K0iEUYRVEaZtK5c2dKS0sr07kzZgBXXQUsXswjZZ55BnjqKWDkyAhnUhCE\nMrFmzRqcfPLJ0c5GlaWkpOTISJu2bdsGjOf2OyqlFhNR51DX8KTlHu/rKSgsFJ+7IAjeYvXq1WjT\npg169OgRVNjLiyc7VBMSeG2Ku7hlBEHwAu3atcOmTZsq/DqetNy1uBcVic9dEKoq0XL5xgrl/f1C\nirtSqrlSaq5SarVSapVS6n6XOEop9apSaoNSarlS6rRy5SoEbm4ZEXdBqDokJSVh//79IvBlhIiw\nf//+sMfcuxGOW6YIwDAiWqKUqgNgsVLqRyJabcS5FEBb39IFwJu+dYUgbhlBqNo0a9YM6enp2Lt3\nb7Sz4lmSkpJsH/guLSHFnYh2Atjp2z6klFoD4HgAprhfBeBD4mr6D6VUPaXUcb5zI4623IuKpENV\nEKoiCQkJaNWqVbSzcVRTKp+7UioFQEcACxyHjgdgTgCQ7gurEEzLXXzugiAI/oQt7kqp2gC+AjCU\niMo04a5SapBSKk0plVae5pop7krxtoi7IAiCRVjirpRKAAv7JCKa4hJlO4Dmxn4zX5gNInqbiDoT\nUedGjRqVJb8A7G4Z7Y4RcRcEQbAIZ7SMAjABwBoiejFAtBkA+vtGzZwJILOi/O2A3XIvKuJtEXdB\nEASLcEbLdAdwC4AVSik9KfPjAFoAABGNBzALQC8AGwDkAhgY+axamOIulrsgCII/4YyWmQ9AhYhD\nAO6NVKZCIW4ZQRCE4Hj6DVWx3AVBENyJGXGXce6CIAgWnhR3N7dMYWH08iMIglDV8KS4u1nuIu6C\nIAgWnhR3/VaqiLsgCII7nhR3pdg1I24ZQRAEdzwp7gC7ZkzLvaAguvkRBEGoSnha3E3L/fDh6OZH\nEAShKuHJz+wB7JYpLAT0twBycqKbH0EQhKqEZ8Vdu2X0rJAi7oIgCBaeFnfzYx0i7oIgCBae9blr\nt4z2uYu4C4IgWHjacjeHP2ZnRy8vgiAIVQ1PW+7Oce4y1l0QBIHxrLg7x7kD4poRBEHQiLgLgiDE\nIJ4Vd6dbBhBxFwRB0HhW3MVyFwRBCIyIuyAIQgziWXF3c8vIaBlBEATGs+LuZrnLp/YEQRCYmBB3\nPb+MfCRbEASB8ay4m26Z6tU5TCx3QRAExrPiblru+puqYrkLgiAwMSHuYrkLgiDY8ay4m24ZsdwF\nQRDseFbcxXIXBEEIjKfFvaiIFy3uYrkLgiAwnhV382MdYrkLgiDY8ay4y2gZQRCEwHha3GWcuyAI\ngjueFXfTLSOWuyAIgh3PirsW9IICsdwFQRCchBR3pdR7Sqk9SqmVAY6fp5TKVEot9S1PRz6b/mhx\nz88Xy10QBMFJfBhxJgJ4HcCHQeL8SkSXRyRHYRLvy/nhw2K5C4IgOAlpuRPRLwAOVEJeSoVY7oIg\nCIGJlM+9q1JqmVLqW6XUPyOUZlC05S4+d0EQBH/CccuEYgmAlkSUrZTqBWAagLZuEZVSgwAMAoAW\nLVqU66LaWje3xXIXBEFgym25E1EWEWX7tmcBSFBKNQwQ920i6kxEnRs1alSu65riLpa7IAiCnXKL\nu1LqWKX4W0hKqTN8ae4vb7qhiDfaHGK5C4Ig2AnpllFKTQZwHoCGSql0AM8ASAAAIhoP4DoA/6eU\nKgKQB+BGIqIKy7EPsdwFQRACE1LcieimEMdfBw+VrFTE5y4IghAYz76harplxHIXBEGw41lxT0qy\ntmU+d0EQBDueFfcaNaxt7ZYRy10QBIHxrLiblnt8PKCUWO6CIAgaz4q7abnHxQHVqonlLgiCoIkZ\ncY+LE8tdEARB41lxN90yYrkLgiDY8ay4i+UuCIIQGM+Ku1jugiAIgfGsuIvlLgiCEBjPins1I+di\nuQuCINjxrLibiOUuCIJgJ2bEXSx3QRAEi5gRd7HcBUEQLGJG3MVyFwRBsPC0uOsJw7S4i+UuCILA\neFrc9Vj3+HgWeLHcBUEQGE+Le+3avBbLXRAEwY6nxb1WLV7rDlWx3AVBEJiYEXex3AVBECxiRtzF\nchcEQbCICXEnEstdEATBJCbEPSdHLHdBEASTmBF3sdwFQRAsYkbcZfoBQRAEC0+L+8MPAyeeCPTu\nLdMPCIIgmMRHOwPloU0bYO1a3hbLXRAEwcLTlruJWO6CIAgWMSPuYrkLgiBYxIy4JyQABQXRzoUg\nCELVIGbEPTEROHw42rkQBEGoGsSMuCclAfn50c6FIAhC1SBmxF0sd0EQBIuQ4q6Uek8ptUcptTLA\ncaWUelUptUEptVwpdVrksxkasdwFQRAswrHcJwLoGeT4pQDa+pZBAN4sf7ZKT1KSWO6CIAiakOJO\nRL8AOBAkylUAPiTmDwD1lFLHRSqD4ZKYKJZ7pbBuHbBlS2TT/PNPICMjsmlGk19+AQoLeXvPHmDp\nUmD+fJ4nw8nSpcDBg8Dy5cD+/Ry2ejWfF4xt24CvvuKXO4iAOXOsa5aVFSvs1127Ftixo3xpAsBv\nv7mX3SQvj3+3NWuAffvsxzZs4Hvuyy9522TrVutNRn2tggJOY6Wrs8GfpUutcq9YEbjMRMDcubwm\nAr7/HvjiCw4rKgLmzQNmzOCw//2Pw7/5BvjkE2DzZuDTT/l/W7IkvHyVFyIKuQBIAbAywLGZAM4y\n9mcD6Bwg7iAAaQDSWrRoQZHksceIEhIimmRsUFRE9NZbRPv2Ea1eTfTMM0Q7dvCxv/8mmjw5dBrf\nfkv055+8rW/tvDze//lnomefJcrNJSosJBozhuiHH+znL19ONHUq0bvvEv36K9GUKdax3FxOLyWF\nj5eUcPi+fURvvkn01VdEY8cSFRe75+3nn4nmznU/tmyZda1Vq4iefprTevZZog8+IJowgeidd4jS\n0/naU6cSrVtHtHcv0X/+QzRiBNHixfY058zhMuTnE736KlF2Nv/Gr79OdPAgUd++XJ7HHydautT6\nvQCi5GSibds4na1buXzm8VatuPwAUZ06fPy774iWLLHn4ccfrXPOOYfLDxC1acN5WLGC6Jtv+Hcf\nMYJo924u39y5/H9v3Ur06aec1o4dRB9+yOUBiNq2JZoxg8utrzFiBNH//mfPw+HDRKNHW799URHR\nCy9w3GnTrHh791rlGTHCKr/JlClErVtb12vShGj/fo6/cKH9N+rY0TpP5xng33rUKN5+4gmidu14\n+8svOe7EiUTPP89l37qV6L33+Lf+6y8rjccf53VqKtHMmUSLFhHl5BCNG8dlO+ssPj5wIFG/fvZ8\nnXKKfT/UkpXlfs+GAYA0Cke3w4oUIXE3l06dOpW5cG78619cmqKiiCZr5403iL7+Ory4hw8TDR1K\ntHOn+/GSEr6Zli3j/WeeIfrjj/DS3rOHaPBgvvGIiD75hB9QN8aN4x/m3HOtG2vcOD7WtCnvHzhA\n9O9/84O0bh3Ro49aYmo+QJmZ1vb33/Px5s15f8oUFj19/KKLiP77XxZ6t5v70Ue57H/8YQ/v14/F\nSz9oevn9d6tMe/cS3XQT0SWXWMffecc6PnMm0Q03WMdefjn4g3bZZfb9uDj7fq9eXJ4rrrD/hgDR\nrbcS/fILb8fHh36oH3uM//sWLdyPm2UylyFDuCIsKSFq2dJ+rEMHa3vsWKIaNXj7vPPc02rYkNfm\n/+Uss3NJSiLq35/oxRf5t2/UyDo2ejRR+/b+5Vi71n4NgOiYY4jefpsF+OmnuSJwu94DD/D6hBP8\nj914I/+///1v6N8bILrtNvt+kya8bt/eXg7nkpDA+XQ7Vq0a0VVXuR+7//7QeVq1Krxn3YXKFPe3\nANxk7K8DcFyoNCMt7s8/z6XRehdxDh2y/phw+Ppr60Z0MnWq9eAlJbGgAvxQFhYS9elD9PnnHLek\nhC2F5GSi+vXZQtTC9dprbLnpfJ1zDlsimZlEPXrww3X11f431mOPEU2fbu1Xr+4f59xzibp3Z0tP\nh5mC9NxzlqVkphvOw1aWpU4dojvusCoTt2XlSv7NunaNzDXr1Qt8TCn7OtRy112WUL36atny07Qp\n0T/+wdvvvMNCro81bsxi1aWL/ZxmzSruPwGIatYMfnzgQF537Uo0bFjwuB06EA0axNva8q6M5dFH\nWagHDCB6+GGi008PHv/cc/k5I/I/NmyY9Zw7j7Vta23PmlVWJaLKFPfLAHwLQAE4E8DCcNKMtLi/\n9BKX5sCBciRSXMzNQTc++MD9j968mY/Pn89WybJl7LL48EMrzg8/cBOzYUMWa21Z6WXECPe0H37Y\nno5etOV2wQVlu5nvvpuFMtz41auztXbTTXxuMMFITORWiBn2/fehr/H00/5hNWsSPfII/67Bzu3d\nm9f33kuUkUF02mnhl02LyIMP2sMXLmQXwk03Wa4W59KrF9H//Z9/uG6t3Hor0VNPWffIhRfa46Wn\nE118sbWvLcpgy3nn8X+XkcFpJiZy+FtvccvSjNu/P9GGDWw9jxvH7hlneuecw8bFiBHshtDhCQn2\neAMH2lsuesnMZEv1uuvYjTR8OLckb7rJfk/oJrXzvzz+eKJrrmELuaiIaPv2wGXv398/rHFjqxzf\nfed/vFo1azstzWqlffcdu94WLHB/3nfssFxFZsvIdCkS2a/18MPux+rX57VpDL35ZinFyUw2QuIO\nYDKAnQAKAaQDuB3A3QDu9h1XAN4AsBHAinBcMkSRF3ftvpwxoxyJ3HUXJ5Kfz/urVrGP9aefiE4+\n2d1q1H+2ru0vvZR9n2aca6+1tletIjrjjPDFJ5ilWrcur53NzlBLnz4sNGecwX7nUPFnzrT/TrNn\n2x8ac+nQgf2bev+RR7hCe/ddbi24XW/7dk43Odkevm4dh3frZoXpSikpyQojslpCZ5xh999qf93o\n0URnnmlP/6KLWFTi4/lh/uc/Ofyeeyzfv0Zb27fcYlVu48ZZPnLAcm2UlBB99JG/X3XzZvt/QMQu\nNh22enXo/yI7257mkiXsFiKyty6ffdb9Hv/iC7ZUdTxd8RBx2qZQAVxprFjBx/Pz+X+cP9/+2wfi\nlls4TmqqFaZ/I90KdFpjxcVW2k4X1ciRRL/9xpXYr79yq1L3N/z733y+6cZ58kl738HevVyh6lZx\nKLKz+RoFBVzZO/s+iLi1ePfdnL7pGiSy38czZ3KLXYcNHx5eHlyIqOVeEUukxf39913utxUriObN\ns0fcsIE7CDVffME3S3q6lcCgQexbdD5YTz1l78wC2KJ/5x2i444L/EDedpvlKnjpJcuVopS7S8S5\nmP5y55KQYBeYKVNCp3fRRdxEvP56/g3MY19+aX/AA1k2V17JcW69lcX599+583P9eisPjRu7d4Is\nWMB9Bvoh1+gWzIIF9hZUjx4c3r8/l3XLFr7m8cfz707E/9/NN/uXdcsWfsDz8tjKXLSIaM0avjdy\ncnjR/R5jxlgi4KSkhB9wIqvySkvj/RNOYIt0927upA6GrmzS062wp57isMxMFoLdu1lINm7kzj9d\nlpNOCp42kRX3k08Cx9ECeued7udfcgnHWbQocBo7drh3jpqsWMHp/fe/Vpj2pWdkWL+7k5Yt2Q23\naxf/BtoNOXase/xFi6w+on37+BlfupQrI11h1a7tX2FHkkWLuBIw0fnWmP0Pq1eX+VJHnbh/8omL\nuLtZF7q5ScQPto4Tjm/y44/ZGjPDTD9aoOXyy3kBuInfrh37wjMyrGZlnTqBz9+7N3DHU8uWXJa+\nfTlNU+idS2am3Q3w0EP230k/zHo/mF8wLY3dSxs2+B/buZPP/+mnwOdr6++YY6ywkhLOo5OePa2K\nxyQ/3xq1Q+T+GzkfuGCUlIQ/isG0OJ35CEZRkX8Zi4uDXzc7m8/RLcpg6HLv2RM83qFD7hVvTk7p\nfrNQHDhgH+lUVBT6N87O5gEJmrQ0LpP2c5eWPXvK6a8tI4WF9paW2TIrB+GKu6c/1mGSmBjkIBEP\ngu/TxxoLfMEFwL33WnHS0wOfrxSnceKJQJ069mPr11vbn38O3HCDtd+oEXDmmTw2vHlzDpsyhcf0\ndu8OJCcDdevyGNsOHYBff+VrLVwIPP88UK8e0LUr0LAhcNVVnIcmTTj+2WdzfJ2fjz+2rjt+PDBq\nFI+pBYDzzwdSU/lamzZZ8c46i9cNGvAY6zZteF9/bbxx48C/SadOQG6u+7Fjj+W8BuPEE3mtv5UI\ncNnr1vWP27Ahr6tXt4c7//Rzz/U/NyEheD5MlPL/fwNxzDGB8xGMuDj/MlarFvy65m8UiokTeax2\no0bB49Wu7R5es2b41woH83cCuPyhfmNneTt1Cn0/BSPUb1FRxMfzotH3cWURTg1QEUukLfePP7Yq\nxSOGgg7Yv5+tSKdV5+wVN/3b2ic4YQI3DR98kGtiM13nsno1W4/a1zhwIA/70sfj4y2/73XXcVqd\nOvH+jTdyB49u6gfizjs5/mef8XWC+Q/1dc0xyqeeymHaF07E/QCjRln7uuPP9MdGmpIS9pNqf24w\n9uxhF1E4FmVeHsf97DP2DwtCVaGwkJ+rf/yjXMngaHPLmKPLMtbuZEHTAStWuPvQna4Ys8MrJYXX\nzt5xInYpLFvmn56uVUpKuFLIybH3/l92mfXSxAMPcNzzz+f9wYPDK2huLotWoJd6TE48kdM2m9+b\nNoUeq3/wINGkSeHlRxCE8JkxI3RfRQjCFfeYcctcdhkwZAhv1+56CnBwv3UwPZ1f/XWiXTFTpwKt\nWgEtW/J+nz7AokW87WxWAuxSAYBmzaw06tXj5jXAzfvbbuNtY06EwyoJiW3b8uvH2i2hXQ3hNh1r\n1ABuvz28uL/8AmRmclNY06oVL8GoVw+4+ebwriEIQvhccUWlXSpmpvxt3RqYNo2340xhB3gOiIUL\ngaFDLR9Y69bW8aZN2ScNsBh+/LEl1G7irlm3juew2L8f2L7dPU6NGkc2l6zxbXfsaPk29ZwW2t8d\nSRo3Btq2jXy6giBUeWJG3AHW4UQYs4etXcudGDNm8P4VV3CHKpHdkjc7eOrW5QogOZn3g3WW1azJ\nnZH16wfuiEpKOrJJhtAfYedOXmtLXhAEIQLElLjXrAmcBt+Ma598woLZubM1QqRpUytyp07Wtlvv\n/eefA489BpxwQvkypRQKqnEFUat+kv/xJk14Xd7rCIIgGMSUuCcmAg/gJRyu0wDo6ZuC3hRxU9yr\nGUV3GxbWujUwerQ9Xhk5XI0t9uLqLpb711/zVKbhDsETBEEIg5jpUAW4b/IkrMWeE85Cc+0r79zZ\nihBIQAON+Y0QhT7LvTDOxXJv3twaAy8IghAhYsdyz89Hk9efQjusxqFjWlrh3bqBatRAYbdzeBSL\nyeOP+79oUAEQ+LqF8S6WuyAIQgUQO+L+2muo9/pziEMJMuqlWOGNG+OU5llI/G2u/zmjRpX/6zWl\nQMRdEITKInbcMsbnwQ7WaWE7tPqv6BZTEb867eqWEQRBqABix3LPzj6ymVWjSRQz4k9SMectp2aU\n5rgQBOGoI3bE3fgAb1ZckBePokDNEs5bVu2mIWIKgiBEhtgR98zMI5tVTdw1WbWOi3YWBEE4Sogd\ncc/IOLKZWa1qivuhWsdGOwuCIBwlxI64FxUd2cwpqZqjUgpUKeb9FgRBKAfeHi2zezePUW/QwDak\nsaDAPTqR/1D3yqDPScuQt3YzOpRU/rUFQTg68a7lnp3NX/zp1Yv3DXE/fNj9lJIoieva6u3xNa6M\n2vUFQTj68K64z5vH64ULee0T97/j2wS03CvxfSXX6xYXR+f6giAcfXhX3LOyeK39LEVFwA034NJ/\nrA9ouUdL3HV3gFjugiBUFt4Vd/3Sku/tTxQWAgkJSEwM7JYx+lwrFRF3QRAqG++Ku/HSEoiOiHv1\n6oE7VKPtlhFxFwShsogNcc/JYfM4Pr5KW+7icxcEobKIDXE/cEAsd0EQBIPYEPeDB4+Ie1ISkJ/v\nfop0qAqCcLTgXXE3ZoFEZuYRca9TBzh0yP2UaLtlRNwFQagsvCvupuWelXXE556cbJtDzCao0XbL\niM9dEITKwtvirr99mpV1xHKvW9cu7qagi+UuCMLRgrfF/TjfFLoHD/JwyIQEJCcDeXmWqJudq9Gw\n3EtKLFEXcRcEobKIDXHfv5/X8fGoW5c3ly/nl1enT7dOiYa4m60FccsIglBZeFfc8/OB+vWBuDhL\n3H2WOwDMmsXr99+3TnG6ZYYMqfhZIs1riuUuCEJlEZa4K6V6KqXWKaU2KKWGuxwfoJTaq5Ra6lvu\niHxWHfh87EhOtom7ttx1kJ6dQJ9i8tprFZ5L2zVF3AVBqCxCirtSKg7AGwAuBdAOwE1KqXYuUT8j\nog6+5d0I59MfLe516/JLTIDNctfibrpCAnWoVqTohrLct2+3u44EQRAiQTiW+xkANhDRJiIqAPAp\ngKsqNlthYIq74XN3irs5YjKQz70iffGhfO7vvgtcc4344wVBiCzhiPvxALYZ++m+MCfXKqWWK6W+\nVEo1d0vo3a3PAAAgAElEQVRIKTVIKZWmlErbu3dvGbJroMW9dm0eLQPY3DL79vHafKEpkIgHmq4g\nEoRyy+TlcXigt2oFQRDKQqQ6VL8GkEJE7QH8COADt0hE9DYRdSaizo0aNSrfFbW416hhKbiLW8YU\n90BumYq03EOJu85TXl7F5UEQhKOPcMR9OwDTEm/mCzsCEe0nIj0X47sAOkUme0HwvZGKpCT+lipg\nGwrpJu7RsNxNi9zN9aLzJOIuCEIkCUfcFwFoq5RqpZSqDuBGADPMCEqp44zdKwGsiVwWA6At96Qk\na0iMb+KwhATrLVVzChpTxJ3TEpijaiKJKdpulruIuyAIFUFIcSeiIgCDAXwPFu3PiWiVUmqkUupK\nX7QhSqlVSqllAIYAGFBRGT6CKe6ahAQohSOuGU1cHEdbtswK27PH2h46FKhWrWIE3rTcxS0jCEJl\nER9OJCKaBWCWI+xpY/sxAI9FNmshcBP3uDgA1shIzbHHAu3aAbNnAy+8APTtC2zZYh2fMoXXeXlA\nzZqRzaZY7oIgRANvvqFaXHxkLhnUqGGF+xztThFNTgZOPhlYuRJ49FHg7ruBTZv8kzWHTUYKLdpx\nce4+d7HcBUGoCMKy3Ksc2tx1Wu4BqFULaNjQ2p85E8jN9Y+XkwOUdxDPb7+xn//ii3lfi3atWmK5\nC4JQeXjTcncT98aNgX79AAAdO9qj165tF3cAmDPHP1nd+Tp2LM85E+ijH06mTLFcO927A5dcYh3T\nPveaNUXcBeFo5803gbVrK+da3rbc4+OB6tV5+447jvjc//gD2LAB+Oc/+ZDTcg+EdsvoOWf27wfq\n1Al+zo8/Atdey9tuHbKhLPeKdMt8/TXw11/AsGGRT1sQhNJBBNxzD3uS3TwHkcab4q4VMSHBUlRj\nesfq1bkDtVUr4O+/WVgbNAidrBZ3LcKhRs+ccAKwfn3wOFq0a9eu/HHuV/rGMom4C0L00bpSWa10\n77tltAJX8y+KNurDFffsbOCJJ3gyLwBo3dr+VScnwYQ9KwvYuzd8n3tl1OSCIESPyv6ehPfFXZvD\nPpeMSUICr2vXtr7rYVK/vn0/JwcYPdoetmNH2bKYksLdAFrca9TgBodzCgQZLSMIRwci7uFgirs2\nh10sdy3utWqx0GZk2I87xd15HLC8PYsXA5s3B8+WKdx6LrP8fCAxkbsHFiyw8uQsioi7IMQ2Iu7h\nEKa4a2rV4rXzzdVjjrHvm2+tag77Zszp3Jl9+G40bcrrrCz/Y3l5bLWbDQvTl19ay/3QodK7cI7G\n6YQLC6XCFKoWgSYurCi8L+5auVzEXc8lo8XdiRZujZu4hyMQugUQTNzN7JnxSmu5160L/OMf4cXV\nOMsZikOHgG++Kd05VYWSEuD114H27SP/trEglAex3MPBHAp5771Ahw7AgAF+0bS4167tnoxTjL/4\nwj9Obq7/qJkXXwQ+/tja18Ml3TpftbibAqtnrDSL4ibuH3wALFzoH75rl39YMEo7V/zAgcDll7u/\nxVvVmTYNuO++yhtLLAjhIuIeDuZQyBYtgD//dO0x1S8h6WmAnTjF3e37IT16WKNnNMOGAbfcYu3r\nSwcS96Qke9rmtumWUQq4/37r2IABQJcu7nlfupRbJOvWuR83McW9qMg+U6Ybq1fz2osjeEINTRWE\naCHiHg6mWyYI2sJt5/LF1/h44Nlnrf1TTw2czvLlwbPzwAO8dnujNT+fLXdz3pozz7Qsf+dQyFdf\nDX4tzZgxfM748aHjmuLevz+3NIKN4dfdGMarA54hPT3aORAEd0yfe0XMY+UkpsVdc+KJ1ra2hAsL\n7db3GWcEPt85y6TJv/5ldczqETIm2dks7k5r+dtvrXwA9pE6L70U+gMi8b7Xz/7+O3g8wC7ukyfz\n+r33AsfXwl+RHzGpKETchaqKabmPHFnx14tpcR88mK12M9qcOZZFn5hohZ9+euB0zErASWKi5dM3\nfema/fvdxb1NG17r2tysQB58MPS8Nnr8fTifojX9+fplrjvuCNyJW1lv0r31Fk8TEUmcw1mPxpFC\nQtXEFHf9gmVFEtPi/tprwKpV9rCaNYEmTXjb/IE7d7a2580LPyvVqwcX91Wr7OI+bx774LVw6qI4\nWwemuGuBMl0p27b5hwEszO+8Yxc503Jv1syeNze0uJfno91r1ri/kas5fJinXj777LJfww1nnks7\nUigWCPa7C9FDxD0cSumWCYeUFGu7devA8ZximphoDbUM5L4xvwTYpg3/sWPHsrjp4ZdmxVC9ul3c\nr7+e16ZQaXE3xWz7dmD6dGDQIHtLxIxz/PHWtvllKrcyllXc//6bJ20LNpxSV3bhtDzC5fBh/+Gs\n5amgvMi6dfxOxXffRTsnghPT5y7iHgjtVynv5OvgYXOA/W3VYOOjnT3e1auzwMfFuVvugP17InXr\nWp2nb71lhZsukIICHqetmTqV16ZQ6W3zvGbNgGuu4W3T3ZGRYVnySllpB5paobxumU2buILQ3y13\nQ1deQd49O0J2NvcRhHoJpFMn/+GbR5vlrmc0/eWX6OYjkvzyC9+3ehSXVxHLPRy2bGGr3W3CmFLy\n8ssspkoBV1zBYbVr81BDkxtv5LXTF56YyOfWru3+EpSOo6lVq2zfai0q4s8EOtEiH8wCvu46q9P3\n8GHOQ1JSYL9+ed0yuu4NNiJAW+7hjMj5+GPg9tuBUaMCx9mxw93NFKgMe/aUfWjali3AKadYQ2R7\n9w7eIe9k8WLuiK8I9NBY7XoMxOzZge/Xqsbnn/Pa7f4Ph2HDqsbIL/N+i6DTISDeFfcWLcIz+0JQ\nrZr1Q3/+OfuKExOB1FR7PO2Td7pedA1cu7b7B0AAuw+0WrWydfKNHs0i7URb140bh04jN9ea66Z2\n7cDj3cvrltm5k9fhiHtBAX+9Khg6P7NmBY5juptM3Cz3oiIWv9tvD37dQLz+OlckejjrtGnAokXh\nn9+5MzBiRHivo2/ezC+UPfkk8MYboePr3ypYq4sIuPBC/rBMRTJ4sL+oFhRwpZKdDaSlhZeOfszL\n2pfw4ou8LotRFUnELRMOW7YALVtGPNmkJOCkk6z96dN53aeP5ap55BH7OdoqN10vTgoLgbvuCuuL\ngDjtNPu+Hsb5zDPu8fPywr/pa9UC5s/nPNepY1nuc+bwQ6gUC612p+zbF166TsIRd7PVEEpkwv0i\nlhtuFZR+ee2jj8JPp6CAh5ESWWmG838GQ7vntm7l4a9ujBzJfRejRrFYhno7WRsOwcRdV3huI5We\nfz54JVoadGVk5mXQIK5Yr72W+4XcXpTLy7MbQLqCKG9HcbRddOKWCYdduyLikgnFlVfywzx5siXe\n06bZ42irQj8oH3zgn05BAb9sFI4P29mc7tMnePysLP7ikhuBhncmJdkt9x49rGPdu1s34fDhlpgs\nX87DSvVY/txctojcxsKHEvdZs+xWc6gGmBbjsrhRnA/0ffeFN7e/k1GjgJtvBmbMsMTddLeVhZwc\nFrHu3Xn4q/NNaMA/r3/+GTxNLZbB3i4Odh8+9hhw2WXBr1Fatmyxtr/6itc//MBrt7e6u3UDmjdn\nMc/Lsyze8op7ZU8kl5dnr4xF3MNh377wvpsXIZTyn0FS47QML7/cP06w5vcFF/DIGY1T3M2OVSfa\nnXT11e7H69RxnebeZrmHmr5g61ZeP/UUu6zmzuX9Rx9lX6Zu3cydy62eVauCi3tREYuHHu0D+N/o\nubmcnn5BS4u7acHv2sXXCeXacP4/r78ePH4gtEBdfbXl23dWNuE0+ydMsLZzcoCHHrJevHITL6e4\nh5rvR4t6MCELdCzSbgvd2jWnyq5Xzx7HbZrtpUv5v127ltP47385vKSEP1N3zz1W3L//5udTVxZO\nzBZAZYv7JZfYbVAR91AUFPBTXoniDgRuKOiH6fPPeUSHc454ILjFmZxsf4CdwzCDuSz0VMOBiItz\nn1fH9LmbI3bc0B21+sHQrgjddM/K4grgoou4ovj9d0vc333Xf8SM24gifaP/8QdXjrVqcaV38snW\nNQC7lXfccVx+8+1jgB/8Tp2s/VD9BuEKmhnv9995nZ1tF49nn7XnMTOThefLL3l/8mR+eUyTk2Of\ngC4/n90wkyaxoLnlLdQbybpCdZuhVBNI5MxWztdfc94DueaefZYr/GDowWwzZ1phTiMp2JfOnP1b\nJSX8gek337TC9H/x/vvuaZiVR2WL+6+/2vfF5x4KrQ5laVuXg2OPdQ/XM0Jefz3PpuhGMOsyN9d+\nw+vvnoa6LhC4E1ETF+c/hz1gt9znzPG3pky2bGF3wY8/8n5+PouObm7ecQd3f2iR27bNEnfAGmqq\ncXsXQLdAHnjAPjZei40Wqr17/YfDOS3ZwkK7uyQ/P3jl+t13bI2H6uR2E9pVq+wzjj7zDPvFNXoS\ns3//m9c332w/PyfH3uGYm8tp9OvHk50+8ID1u2t++SX418G0sfHRR+4Vd2GhvdVkutXMCuHee3kd\n6A3ip58GnnvO/djvvwMTJ1rPhtm3EUrczd/ZTdw12pp3nvfkk/YXEs3Wnhb3//wn8DseFYG+/8Ry\nD0UVEvfu3bljKBQPPRT42IEDdmv/pJOs+Do8kDiZ59WoweJ3223WzJLVqrlb7trnfvAg+9KdFYrJ\nvffa32rNzORO2UA+3bVr7SLhfEDd5t/RN7rbx1CaNrVcQwC/HOUUWtO6PPtsuw9/wABOP5CF3qsX\nu5a2beMK6803WYQ//JCPT53KrRS3ztdJk/xbBubbzc4vQDor45wce16dVvIrr/iPwFq0KHilbrrC\ntIX722+W6+/224Hzz7fimP01ptDqCkBXsD/9ZFnJJrt3W3Hz8nhEV7dubOhoYT10KPA3dZzibv6e\nzi+fmWXTlY9zNM6oUTzUVGPei3l53Np66CH7bxCIN94ApkwJHQ8I3gJ0vo0OiLi7o5+ASnbLuP0Z\nt93mPn42LY1HHQBs4Zx7buB0neKemMgPYlqa5dvVk4RptMVk/gQvv8z7EyawSwMIbbnv3Mk35Smn\n+McJNC1AZia/WRuIBQvcw4uK+EHr18//2M6dPPTUrX9g5077wwr492ssWcLrwYN5HiDzP9HN8sWL\nuYM4EOvXs5jecw+7T4YN4/BrrildB6NpXeoKUJfLfAsa8Bd3s+PRDdMNp8eob9zI/9+55/J/aVa6\ny5bx/9W9O4/yIvKvpKZPZ9HZtMndlaPDLrqIRRuwi1SLFrwA/O0B3WFqlsfMl7Mfxinu5nFnf5DZ\n4tDo39sprt9+y2mZZTrjDH5OADYyAg1dLiwEXniB76drr7XsyVmzrAn/TJYt4/8x0Itjuuwi7qGI\nkuUO8DDFfv3Y1zh0KNC3r3u8Tp24w/H331ncnfz5p/VCTsOG7n76Tp38WwtxcXwTP/EEPzh6KuMH\nH+QhZhrz41SBxN10xTRvzmtTeJ94wv3crCwWzI4d/UcONWzoL1Da8rv6ak4vkM94+XL/F8cC4Ryq\npz9ocsIJgc8580yeJjkQGzbYfc7Nmwd+4zgYBw/yea1aWVaxFnfdX/G///E6Lc0uZqE+MGJ2tutx\n9W3asBHwyy+cf2enrDmttdPFcvzx3NIYNoy/7rVxo/81s7LsInvqqcDbb1v72q2Tne3+RrJuOWor\n3vluxYgRwOOPW+JsHneKu9OSNysNIrvA9+rFRpKzwjL7CcxRYibPPcfPr0a7cC67jNN1oocp//yz\ne3qzZ/PzJD73ULRvzyZWBYxzD8XixWz5jBzJ45JDDYU780x3a7RDB76hP/mEm32BRuKYrFljt1xa\ntLCae87pErSINGrkPpVCUpL9Ja369fkh/eADqxOzQQN7hdGoEZc3M5PFvUcPu0Xbv7/7l6zWrOHW\nSaB5ZnTzGgBWrrS2nf7ps87yP1e/FaofWD3Hj9vQylA+9bVr2S3TujW/k7BtG+e9tOTlcaW3ebM1\ndl3nJyuLR1DoW3fUKLv4mKOm3DD/s/Xr/cf/u30LwKwwnZVfr15cTj1lgVt5s7KsliDA/5HZr6Cp\nU8ffD67PB7iVu3Qp57lLF8u42b6d+yT0KCazsnO+keoU90mTrJYZkb+LNC8v9DsSRNwZqxRXkhkZ\n9k5ugH8js5Pe5IorrBFjgYb09uvHLyEGGyFWIRBRVJZOnTqRYJGSQvTqq6U7Jy2N7ZUlS+zhxcVE\nY8cSZWYSPfIIx7nxRqI2bXj70UeJ/v5b2zpEixZZ555wAoetXk1UVER02228n5JCVKcOUaNGvP/8\n8xxfp/Hii0QZGdb+5s1EX3xh7Qdahg93Dx871r7/4YdETzxh7T/5pP36ANFnn3HYXXeFvm6gpWNH\nolGj3PNgLueea9+fO5do/HjevuYa/7hERCedRHTddUQHD5YuT0lJRD/9RFRQQPT++/w/3HMPUatW\nZS8nQDRlin3/+uv94/TpU7o069Uj2rnT2q9b1z/O3Xf7/3f6nluwoHTXq16d1xde6H/s/vuJLr44\n+PmjRxOlpgaP8+CD9n0ioquuIrr0Unv4sGH259CZzumnW9urVpXuWbenizSi0BobMkJFLSLulcPU\nqfwvDxpkVQYvv0xUUmLdaJs2WfHfeovDsrJ4/4cf3G/4CRP4uN5//337fnExL8EemmrViMaMsYcN\nGEC0YgXR7t328D/+IBo82NqfNImv9+efVtjcuRw2d25oUfjuO2v76qvtYjFtGm83a0bUuDHRhg1E\n3brZz9+4kahHD/sDr39rt6VfP6Ljj+fKsqAgcLz+/d3DTTp3tl870BIXF/z4338TnXKKta8rf7el\nTh37vnmeU8CIiPbv53vi888Dx4mPt4ePGUM0cyZvn3pq4Lzcfbd/WHJy6N/DbenZM/C1atUiatjQ\nP/y999zjDxxo/590eFKSf9y//ir7My3iLhARW9/PP0+0axfvb9nC4kJk3WgZGcHPB4guu4xoxgzr\nnOnT7WlMnWrf1zRpYp2vj+Xm8vqGG4i++sp+048fb537xhtWeE4OtwbOOYfoqaeICguteF26cJzi\nYits6VJ+ON0ewlatrDwARL//TnTTTbx99dVE2dmWMF51lZXma6/5ly8jg+jAAd7++Wfr+Pnn+183\nMZGtSfN3ci67drmHmwwaZBfbceOs7V692AKePTu0sO3eTbRmjb+gNW3qH7dxY/t+167W9scfE915\nJ2/372/P68KF/mnNmsXH7rkncN6crQq9xMcTrVvH29WqhS5jsCVYhdCzJ7dAAlVigZaLL7bKHize\n5s2Bn7lQRFTcAfQEsA7ABgDDXY4nAvjMd3wBgJRQaYq4R5++ffkOKCkJHi8jgygvz27t//YbH9MP\nubb+x40jeuAB69xNm4jmz+ft6dOJhg61wvPziVautNK85x6r4tEAbPEGIzubXVBOhgzh8w8cYJHW\n1+nRg8vSty/RN99Y8bdv50qEyBKrb7+1pzl/vt2NZbJli3WNgQPdH+qnnrLK5bYEsupNJk60wseP\nJ/ryS2v/lVeseC++SNSpE//W+vg551jbunX29NNWWKtW3HK64gr79ceNY+FKS+NWjFkp//GH1doZ\nMcKeV2flsXevdaywkGjrViKl/Mu7dKn779CgAZ9bUMBuTLc4114b+PdduZKofn3ePvbYwPE0+j4w\nl2rVWPwDnZufH/w/Boh27HC/h8IhYuIOIA7ARgCtAVQHsAxAO0ecewCM923fCOCzUOmKuEefwkL2\n/5aGt95in/3hw7y/eTO7KMpKfj7fhaee6n58716iQ4fKlnZxMVvoRFzONWtYzPftC31uYSG7fErL\n1q3cCli/nv2qzoda96uYYabgOo8NGOBfwWzebB2fPdsS1iZN7K0Xje4LGTCA95s3532z9fP11/7C\n9q9/WWGTJ9vTNCuhoiKuLKdOZSPAZNs2K57up3GjXTt7uYP1S2hM15q5mK1EgPMwYADRr7/yea1b\nc3gwgdZkZlqtpJYteT1mDPcBBTr355+JHnssuLiHcw8GIpLi3hXA98b+YwAec8T5HkBX33Y8gH0A\nVLB0RdwFzY8/ls+SqcqcdZb9odbW8oIF3MJZtIgfdFNUGjcm6t2bK9GiIvd0dfzCQv79AKLHHw+c\nj7/+sirkbdu4s9skL4/TaNfOHq77L9zcCNOmWX0fgcjK4vPvuy94PGfHLRGvTzyRhfnBB4lOPpkt\naU1GBgv06NHsQtFuvMsus6z3F17wv9Zff3Fn+cGDlqsxOZn/iylTuHViojuyCwqIPvmE/5Pp0+35\nbdAguJg7l2Cu0FBEUtyvA/CusX8LgNcdcVYCaGbsbwTQMFi6Iu7C0cDmzSyQb7wR3M/6xhvsnw6X\ndeu4JUJkWc1Ol1ZpWbSIXVORZufOwJWUJjOTK5xPPuE+ECKuGHTLi4jLGcyFWFjIrrgtW3jbPDcY\nOTmh8+ckPZ3dST/+yB3u+flEzz0XWMx1n45etPuvLIQr7orjBkYpdR2AnkR0h2//FgBdiGiwEWel\nL066b3+jL84+R1qDAAwCgBYtWnTaEuqVPEEQBA+xYwdPl1FQwG9Xb93KL48NHcpTWXTtyi+b9exZ\n9msopRYTUedQ8eJDRQCwHUBzY7+ZL8wtTrpSKh5AMgC/9/uI6G0AbwNA586dg9cqgiAIHqNp08Cz\nteoXBCuLcN5QXQSgrVKqlVKqOrjDdIYjzgwAt/q2rwMwh0I1CQRBEIQKI6TlTkRFSqnB4E7TOADv\nEdEqpdRIsO9nBoAJAD5SSm0AcABcAQiCIAhRIhy3DIhoFoBZjrCnje18ANdHNmuCIAhCWfHexGGC\nIAhCSETcBUEQYhARd0EQhBhExF0QBCEGEXEXBEGIQUK+oVphF1ZqL4CyvqLaEDx/TSwgZamaSFmq\nHrFSDqB8ZWlJRI1CRYqauJcHpVRaOK/fegEpS9VEylL1iJVyAJVTFnHLCIIgxCAi7oIgCDGIV8X9\n7WhnIIJIWaomUpaqR6yUA6iEsnjS5y4IgiAEx6uWuyAIghAEz4m7UqqnUmqdUmqDUmp4tPMTCqXU\ne0qpPb4Pmuiw+kqpH5VS633rY3zhSin1qq9sy5VSp0Uv53aUUs2VUnOVUquVUquUUvf7wr1YliSl\n1EKl1DJfWUb4wlsppRb48vyZb4prKKUSffsbfMdTopl/N5RScUqpP5VSM337niyLUmqzUmqFUmqp\nUirNF+a5ewwAlFL1lFJfKqXWKqXWKKW6VmZZPCXuSqk4AG8AuBRAOwA3KaXaRTdXIZkIwPndleEA\nZhNRWwCzffsAl6utbxkE4M1KymM4FAEYRkTtAJwJ4F7fb+/FshwGcAERpQLoAKCnUupMAGMAvERE\nbQAcBHC7L/7tAA76wl/yxatq3A9gjbHv5bKcT0QdjKGCXrzHAOAVAN8R0UkAUsH/T+WVJZxv8VWV\nBWF8rLsqLgBSAKw09tcBOM63fRyAdb7ttwDc5Bavqi0ApgO4yOtlAVATwBIAXcAvlcQ77zWU4QPw\nlVyGZj6huADATADKw2XZDMf3l714j4G/Rve387etzLJ4ynIHcDyAbcZ+ui/MazQhop2+7V0Amvi2\nPVE+X1O+I4AF8GhZfG6MpQD2APgR/FH3DCIq8kUx83ukLL7jmQAaVG6Og/IygEcAlPj2G8C7ZSEA\nPyilFvu+uQx48x5rBWAvgPd97rJ3lVK1UIll8Zq4xxzE1bRnhiwppWoD+ArAUCLKMo95qSxEVExE\nHcBW7xkATopylsqEUupyAHuIaHG08xIhziKi08BuinuVUueYBz10j8UDOA3Am0TUEUAOLBcMgIov\ni9fEPZyPdXuB3Uqp4wDAt97jC6/S5VNKJYCFfRIRTfEFe7IsGiLKADAX7Lqop/gD74A9v0fKooJ8\nAD5KdAdwpVJqM4BPwa6ZV+DNsoCItvvWewBMBVe8XrzH0gGkE9EC3/6XYLGvtLJ4TdzD+Vi3FzA/\nKH4r2H+tw/v7es7PBJBpNOGiilJKgb+Vu4aIXjQOebEsjZRS9XzbNcB9B2vAIn+dL5qzLFXyA/BE\n9BgRNSOiFPDzMIeI+sKDZVFK1VJK1dHbAC4GsBIevMeIaBeAbUqpE31BPQCsRmWWJdodD2XoqOgF\n4C+wj/SJaOcnjPxOBrATQCG4Nr8d7OOcDWA9gJ8A1PfFVeDRQBsBrADQOdr5N8pxFrgJuRzAUt/S\ny6NlaQ/gT19ZVgJ42hfeGsBCABsAfAEg0Ree5Nvf4DveOtplCFCu8wDM9GpZfHle5ltW6efbi/eY\nL38dAKT57rNpAI6pzLLIG6qCIAgxiNfcMoIgCEIYiLgLgiDEICLugiAIMYiIuyAIQgwi4i4IghCD\niLgLnkcple1bpyilbo5w2o879n+LZPqCUFGIuAuxRAqAUom78RZnIGziTkTdSpknQYgKIu5CLPE8\ngLN9c4E/4JscbKxSapFvjuy7AEApdZ5S6lel1AzwW4NQSk3zTVa1Sk9YpZR6HkANX3qTfGG6laB8\naa/0zT/ex0h7njGP9yTf272CUKmEsloEwUsMB/AQEV0OAD6RziSi05VSiQD+p5T6wRf3NACnENHf\nvv3biOiAbzqCRUqpr4houFJqMPEEY06uAb+BmAqgoe+cX3zHOgL4J4AdAP4Hnv9lfuSLKwiBEctd\niGUuBs/XsRQ8PXED8McQAGChIewAMEQptQzAH+AJnNoiOGcBmEw8u+RuAD8DON1IO52ISsDTNKRE\npDSCUArEchdiGQXgPiL63hao1HngKVjN/QvBH7HIVUrNA8/BUlYOG9vFkOdMiAJiuQuxxCEAdYz9\n7wH8n2+qYiilTvDNNugkGfzpuVyl1EngzwhqCvX5Dn4F0Mfn128E4BzwRFyCUCUQi0KIJZYDKPa5\nVyaC5zVPAbDE16m5F8DVLud9B+BupdQa8OfN/jCOvQ1guVJqCfFUupqp4Dngl4Fny3yEiHb5KgdB\niDoyK6QgCEIMIm4ZQRCEGETEXRAEIQYRcRcEQYhBRNwFQRBiEBF3QRCEGETEXRAEIQYRcRcEQYhB\nRMxKNXsAAAAMSURBVNwFQRBikP8HXbLU3AGL2QwAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f8f6c452e90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(loss, \"b\")\n",
"plt.plot(accuracy, \"r\")\n",
"plt.xlabel(\"Iteration\")\n",
"plt.legend((\"Loss\", \"Accuracy\"), loc=\"upper right\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Container object of 10 artists>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nNci4S1KD/h9jO29e2iR9agAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f8f6c2f94d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# バッチの最初の画像の分類確率を表示\n",
"plt.figure()\n",
"plt.xticks(range(10))\n",
"softmax = workspace.FetchBlob(\"softmax\")\n",
"plt.bar(np.arange(10), softmax[0])"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"TEST: accuracy=0.9793, loss=0.2675\n"
]
},
{
"data": {
"text/plain": [
"0.97930000722408295"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# テストデータでの正答率とロスを計算する関数\n",
"def validate(model, data_size=10000, batch_size=100):\n",
" batch_per_epoch = int(data_size / batch_size)\n",
" accuracy, loss = 0, 0\n",
" for i in range(batch_per_epoch):\n",
" workspace.RunNet(test_model.net)\n",
" accuracy += workspace.FetchBlob(\"accuracy\")\n",
" loss += workspace.FetchBlob(\"loss\")\n",
" accuracy /= batch_per_epoch # 平均を取ってテスト正答率を算出\n",
" loss /= batch_per_epoch # 平均ロスを算出\n",
" print(\"TEST: accuracy={:1.4f}, loss={:1.4f}\".format(accuracy, loss))\n",
" return accuracy\n",
"\n",
"workspace.RunNetOnce(test_model.param_init_net)\n",
"workspace.CreateNet(test_model.net, overwrite=True)\n",
"validate(test_model)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"TRAIN: accuracy=0.9900, loss=0.0849\n",
"TRAIN: accuracy=0.9600, loss=0.0940\n",
"TRAIN: accuracy=0.9600, loss=0.0847\n",
"TRAIN: accuracy=0.9800, loss=0.0478\n",
"TRAIN: accuracy=0.9800, loss=0.0759\n",
"TRAIN: accuracy=0.9900, loss=0.2394\n",
"TEST: accuracy=0.9802, loss=0.2394\n",
"TRAIN: accuracy=0.9900, loss=0.0170\n",
"TRAIN: accuracy=0.9800, loss=0.0335\n",
"TRAIN: accuracy=0.9900, loss=0.0217\n",
"TRAIN: accuracy=0.9900, loss=0.0149\n",
"TRAIN: accuracy=0.9800, loss=0.0512\n",
"TRAIN: accuracy=0.9900, loss=0.2017\n",
"TEST: accuracy=0.9857, loss=0.2017\n",
"TRAIN: accuracy=1.0000, loss=0.0092\n",
"TRAIN: accuracy=0.9900, loss=0.0153\n",
"TRAIN: accuracy=1.0000, loss=0.0135\n",
"TRAIN: accuracy=1.0000, loss=0.0066\n",
"TRAIN: accuracy=0.9900, loss=0.0428\n",
"TRAIN: accuracy=0.9900, loss=0.1865\n",
"TEST: accuracy=0.9881, loss=0.1865\n",
"TRAIN: accuracy=1.0000, loss=0.0072\n",
"TRAIN: accuracy=1.0000, loss=0.0090\n",
"TRAIN: accuracy=1.0000, loss=0.0095\n",
"TRAIN: accuracy=1.0000, loss=0.0044\n",
"TRAIN: accuracy=0.9900, loss=0.0389\n",
"TRAIN: accuracy=0.9900, loss=0.1781\n",
"TEST: accuracy=0.9898, loss=0.1781\n",
"TRAIN: accuracy=1.0000, loss=0.0076\n",
"TRAIN: accuracy=1.0000, loss=0.0074\n",
"TRAIN: accuracy=1.0000, loss=0.0084\n",
"TRAIN: accuracy=1.0000, loss=0.0036\n",
"TRAIN: accuracy=0.9900, loss=0.0364\n",
"TRAIN: accuracy=0.9900, loss=0.1731\n",
"TEST: accuracy=0.9895, loss=0.1731\n"
]
}
],
"source": [
"def train_epoch(model, data_size=60000, batch_size=100, print_freq=100):\n",
" for i in range(int(data_size / batch_size / print_freq)):\n",
" workspace.RunNet(model.net, num_iter=print_freq)\n",
" accuracy = float(workspace.FetchBlob(\"accuracy\"))\n",
" loss = float(workspace.FetchBlob(\"loss\"))\n",
" print(\"TRAIN: accuracy={:1.4f}, loss={:1.4f}\".format(accuracy, loss))\n",
"\n",
"workspace.ResetWorkspace()\n",
"workspace.RunNetOnce(train_model.param_init_net)\n",
"workspace.RunNetOnce(test_model.param_init_net)\n",
"workspace.CreateNet(train_model.net, overwrite=True)\n",
"workspace.CreateNet(test_model.net, overwrite=True)\n",
"\n",
"total_epochs = 5 # CPUでは計算時間がかかるため注意\n",
"test_accuracy = []\n",
"for epoch in range(total_epochs):\n",
" train_epoch(train_model)\n",
" accuracy = validate(test_model)\n",
" test_accuracy.append(accuracy)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7e8f34355510>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(test_accuracy)\n",
"plt.xticks(range(total_epochs))\n",
"plt.xlabel(\"epochs\")\n",
"plt.ylabel(\"Accuracy\")\n",
"plt.grid(\"on\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def AddBookkeepingOperators(model):\n",
" \"\"\" 学習時の進捗表示用Operator \"\"\"\n",
"\n",
" # Printオペレータはブロブの数値を表示\n",
" model.Print(\"accuracy\", [], to_file=1)\n",
" model.Print(\"loss\", [], to_file=1)\n",
"\n",
" # Summaryオペレータはモデルのパラメータの概要を記録\n",
" for param in model.params:\n",
" model.Summarize(param, [], to_file=1)\n",
" model.Summarize(model.param_to_grad[param], to_file=1)\n",
"\n",
" # Checkpointオペレータは一定間隔でモデルをファイルに保存\n",
" model.Checkpoint([\"optimizer_iteration\"] + model.params, [],\n",
" db=\"mnist_lenet_checkpoint_%05d.minidb\",\n",
" db_type=\"minidb\", every=100)\n",
"\n",
"\n",
"AddBookkeepingOperators(train_model)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment