{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "XXDeo-aGOAXF" }, "source": [ "##### Copyright 2019 The TensorFlow Authors.\n", "\n", "Licensed under the Apache License, Version 2.0 (the \"License\");" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "9XRGdjHNOE9D" }, "outputs": [], "source": [ "#@title ##### Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "KJihamFwOLUT" }, "source": [ "# Bayesian Neural Network\n", "\n", "\n", " \n", " \n", "
\n", " Run in Google Colab\n", " \n", " View source on GitHub\n", "
" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "B0HrNKbJw2bA" }, "source": [ "### 1 Imports" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "both", "colab": {}, "colab_type": "code", "id": "cttwhYKYGhPj" }, "outputs": [], "source": [ "from __future__ import absolute_import\n", "from __future__ import division\n", "from __future__ import print_function\n", "\n", "import sys\n", "import time\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "import tensorflow.compat.v2 as tf\n", "tf.enable_v2_behavior()\n", "\n", "import tensorflow_datasets as tfds\n", "import tensorflow_probability as tfp\n", "from discussion import nn as tfp_nn\n", "\n", "# Globally Enable XLA.\n", "# tf.config.optimizer.set_jit(True)\n", "\n", "try:\n", " physical_devices = tf.config.list_physical_devices('GPU')\n", " tf.config.experimental.set_memory_growth(physical_devices[0], True)\n", "except:\n", " # Invalid device or cannot modify virtual devices once initialized.\n", " pass\n", "\n", "tfb = tfp.bijectors\n", "tfd = tfp.distributions" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "nbQ3rcTowypZ" }, "source": [ "### 2 Load Dataset" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "both", "colab": { "height": 0 }, "colab_type": "code", "id": "rjgnFMxvG9Ab", "outputId": "956ba258-30f4-47b7-d0c9-250ab72d6592" }, "outputs": [ { "data": { "image/png": "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\niETa/wHsuOV605mu+QAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "[train_dataset, eval_dataset], datasets_info = tfds.load(\n", " name='mnist',\n", " split=['train', 'test'],\n", " with_info=True,\n", " as_supervised=True,\n", " shuffle_files=True)\n", "\n", "def _preprocess(image, label):\n", " image = tf.cast(image, dtype=tf.float32) / 255.\n", " label = tf.cast(label, dtype=tf.int32)\n", " return image, label\n", "\n", "train_size = datasets_info.splits['train'].num_examples\n", "batch_size = 32\n", "\n", "train_dataset = tfp_nn.util.tune_dataset(\n", " train_dataset,\n", " batch_size=batch_size,\n", " shuffle_size=int(train_size / 7),\n", " preprocess_fn=_preprocess)\n", "\n", "eval_dataset = tfp_nn.util.tune_dataset(\n", " eval_dataset,\n", " repeat_count=None,\n", " preprocess_fn=_preprocess)\n", "\n", "x, y = next(iter(eval_dataset.batch(10)))\n", "tfp_nn.util.display_imgs(x, y);" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "sbaPm7ABwvde" }, "source": [ "### 3 Define Model" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "both", "colab": { "height": 268 }, "colab_type": "code", "id": "nhnbpf7IYBD6", "outputId": "570f37d6-f2b2-42bb-f9a2-b9844a19ba8d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== BNN ==================================================\n", " SIZE SHAPE TRAIN NAME \n", " 200 [5, 5, 1, 8] True posterior_kernel_loc:0 \n", " 200 [5, 5, 1, 8] True posterior_kernel_scale:0 \n", " 8 [8] True posterior_bias_loc:0 \n", " 8 [8] True posterior_bias_scale:0 \n", " 3200 [5, 5, 8, 16] True posterior_kernel_loc:0 \n", " 3200 [5, 5, 8, 16] True posterior_kernel_scale:0 \n", " 16 [16] True posterior_bias_loc:0 \n", " 16 [16] True posterior_bias_scale:0 \n", " 7840 [784, 10] True posterior_kernel_loc:0 \n", " 7840 [784, 10] True posterior_kernel_scale:0 \n", " 10 [10] True posterior_bias_loc:0 \n", " 10 [10] True posterior_bias_scale:0 \n", "trainable size: 22548 / 0.086 MiB / {float32: 22548}\n" ] } ], "source": [ "max_pool = tf.keras.layers.MaxPooling2D( # Has no tf.Variables.\n", " pool_size=(2, 2),\n", " strides=(2, 2),\n", " padding='SAME',\n", " data_format='channels_last')\n", "\n", "bnn = tfp_nn.Sequential([\n", " tfp_nn.ConvolutionVariationalFlipout(\n", " input_size=1,\n", " output_size=8,\n", " filter_shape=5,\n", " padding='SAME',\n", " penalty_weight=1. / train_size,\n", " name='conv1'),\n", " tf.nn.leaky_relu,\n", " max_pool, # [28, 28, 8] -> [14, 14, 8]\n", " tfp_nn.ConvolutionVariationalFlipout(\n", " input_size=8,\n", " output_size=16,\n", " filter_shape=5,\n", " padding='SAME',\n", " penalty_weight = 1. / train_size,\n", " name='conv2'),\n", " tf.nn.leaky_relu,\n", " max_pool, # [14, 14, 16] -> [7, 7, 16]\n", " tfp_nn.util.flatten_rightmost,\n", " tfp_nn.AffineVariationalReparameterizationLocal(\n", " input_size=7 * 7 * 16,\n", " output_size=10,\n", " penalty_weight = 1. / train_size,\n", " name='affine1'),\n", " lambda x: tfd.Categorical(logits=x, dtype=tf.int32), \n", "], name='BNN')\n", "\n", "print(bnn.summary())" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "J9XuHd6Iw7_a" }, "source": [ "### 4 Train" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "code", "colab": {}, "colab_type": "code", "id": "iUmS-7IATIcI" }, "outputs": [], "source": [ "train_iter = iter(train_dataset)\n", "eval_iter = iter(eval_dataset.batch(2000).repeat())\n", "\n", "def loss():\n", " x, y = next(train_iter)\n", " nll = -tf.reduce_mean(bnn(x).log_prob(y), axis=-1)\n", " kl = bnn.extra_loss\n", " return nll + kl, (nll, kl)\n", "\n", "opt = tf.optimizers.Adam(learning_rate=1e-2)\n", " \n", "fit = tfp_nn.util.make_fit_op(\n", " loss,\n", " opt,\n", " bnn.trainable_variables,\n", " grad_summary_fn=lambda gs: tf.nest.map_structure(tf.norm, gs))\n", "\n", "@tf.function(autograph=False)\n", "def eval():\n", " with tf.xla.experimental.jit_scope(compile_ops=True):\n", " x, y = next(eval_iter)\n", " yhat = bnn(x)\n", " nll = -tf.reduce_mean(yhat.log_prob(y))\n", " kl = bnn.extra_loss\n", " loss = nll + kl\n", " acc = tf.reduce_mean(tf.cast(tf.equal(y, yhat.mode()), tf.float32), axis=-1)\n", " return loss, acc, nll, kl" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "code", "colab": { "height": 1000 }, "colab_type": "code", "id": "ba5W_N6oTNbo", "outputId": "1149360f-3ed7-469b-bede-0f424917200f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "it: 1 ms/it:15928.3569 tst_acc:0.0960 trn_loss:1867.5190 tst_loss:1572.2639 tst_nll:1572.1337 tst_kl:0.1303 sum_norm_grad:1348.1011\n", "it: 101 ms/it:3.9539 tst_acc:0.1085 trn_loss:141.2893 tst_loss:110.9031 tst_nll:110.7626 tst_kl:0.1405 sum_norm_grad:164.9449\n", "it: 201 ms/it:3.9313 tst_acc:0.1215 trn_loss:77.2260 tst_loss:60.6951 tst_nll:60.5451 tst_kl:0.1500 sum_norm_grad:142.0284\n", "it: 301 ms/it:3.8703 tst_acc:0.1155 trn_loss:51.5968 tst_loss:83.7521 tst_nll:83.5882 tst_kl:0.1640 sum_norm_grad:67.0755\n", "it: 401 ms/it:3.8302 tst_acc:0.1625 trn_loss:47.8995 tst_loss:32.7923 tst_nll:32.6151 tst_kl:0.1771 sum_norm_grad:145.9635\n", "it: 501 ms/it:3.7184 tst_acc:0.2150 trn_loss:41.3301 tst_loss:39.1208 tst_nll:38.9311 tst_kl:0.1897 sum_norm_grad:57.5402\n", "it: 601 ms/it:4.1285 tst_acc:0.2480 trn_loss:23.3938 tst_loss:19.6674 tst_nll:19.4679 tst_kl:0.1995 sum_norm_grad:40.7257\n", "it: 701 ms/it:3.8126 tst_acc:0.2775 trn_loss:19.2859 tst_loss:18.2370 tst_nll:18.0254 tst_kl:0.2116 sum_norm_grad:54.5467\n", "it: 801 ms/it:3.7836 tst_acc:0.3325 trn_loss:8.0900 tst_loss:13.7760 tst_nll:13.5559 tst_kl:0.2201 sum_norm_grad:33.2975\n", "it: 901 ms/it:3.8657 tst_acc:0.4215 trn_loss:7.8182 tst_loss:10.4693 tst_nll:10.2390 tst_kl:0.2303 sum_norm_grad:19.9062\n", "it: 1001 ms/it:3.8200 tst_acc:0.3955 trn_loss:15.5580 tst_loss:9.7859 tst_nll:9.5479 tst_kl:0.2381 sum_norm_grad:41.5614\n", "it: 1101 ms/it:3.9202 tst_acc:0.5750 trn_loss:7.6126 tst_loss:6.6138 tst_nll:6.3675 tst_kl:0.2463 sum_norm_grad:29.4877\n", "it: 1201 ms/it:3.8557 tst_acc:0.4725 trn_loss:8.7019 tst_loss:7.1943 tst_nll:6.9418 tst_kl:0.2525 sum_norm_grad:45.5732\n", "it: 1301 ms/it:3.8773 tst_acc:0.5930 trn_loss:8.4221 tst_loss:5.7505 tst_nll:5.4909 tst_kl:0.2595 sum_norm_grad:23.3249\n", "it: 1401 ms/it:3.8556 tst_acc:0.6755 trn_loss:6.1047 tst_loss:4.1688 tst_nll:3.9022 tst_kl:0.2665 sum_norm_grad:20.6842\n", "it: 1501 ms/it:3.8319 tst_acc:0.6690 trn_loss:2.4749 tst_loss:3.8920 tst_nll:3.6198 tst_kl:0.2722 sum_norm_grad:11.9391\n", "it: 1601 ms/it:3.8669 tst_acc:0.6750 trn_loss:3.2286 tst_loss:3.8155 tst_nll:3.5400 tst_kl:0.2755 sum_norm_grad:14.1307\n", "it: 1701 ms/it:3.9143 tst_acc:0.7065 trn_loss:1.5178 tst_loss:3.1960 tst_nll:2.9166 tst_kl:0.2794 sum_norm_grad:7.7101\n", "it: 1801 ms/it:4.0725 tst_acc:0.7675 trn_loss:2.8735 tst_loss:3.4984 tst_nll:3.2174 tst_kl:0.2809 sum_norm_grad:15.7313\n", "it: 1901 ms/it:4.1345 tst_acc:0.7825 trn_loss:2.0038 tst_loss:2.5639 tst_nll:2.2759 tst_kl:0.2879 sum_norm_grad:9.2704\n", "it: 2001 ms/it:4.0296 tst_acc:0.7815 trn_loss:1.4074 tst_loss:2.5748 tst_nll:2.2832 tst_kl:0.2916 sum_norm_grad:9.1460\n", "it: 2101 ms/it:3.8173 tst_acc:0.8030 trn_loss:2.5845 tst_loss:2.1998 tst_nll:1.9072 tst_kl:0.2926 sum_norm_grad:8.6494\n", "it: 2201 ms/it:3.9169 tst_acc:0.7925 trn_loss:1.4358 tst_loss:2.0969 tst_nll:1.8011 tst_kl:0.2959 sum_norm_grad:8.2437\n", "it: 2301 ms/it:4.0515 tst_acc:0.7965 trn_loss:1.1560 tst_loss:1.8291 tst_nll:1.5286 tst_kl:0.3005 sum_norm_grad:7.8903\n", "it: 2401 ms/it:3.8685 tst_acc:0.8605 trn_loss:3.1983 tst_loss:1.5584 tst_nll:1.2568 tst_kl:0.3016 sum_norm_grad:18.2812\n", "it: 2501 ms/it:4.0031 tst_acc:0.8610 trn_loss:2.8698 tst_loss:1.4478 tst_nll:1.1429 tst_kl:0.3049 sum_norm_grad:12.8738\n", "it: 2601 ms/it:3.8913 tst_acc:0.8395 trn_loss:1.6629 tst_loss:1.5258 tst_nll:1.2204 tst_kl:0.3054 sum_norm_grad:7.3639\n", "it: 2701 ms/it:3.8980 tst_acc:0.8655 trn_loss:1.0928 tst_loss:1.4976 tst_nll:1.1868 tst_kl:0.3108 sum_norm_grad:6.4518\n", "it: 2801 ms/it:3.9551 tst_acc:0.8525 trn_loss:1.4046 tst_loss:1.5539 tst_nll:1.2425 tst_kl:0.3114 sum_norm_grad:8.3178\n", "it: 2901 ms/it:3.8766 tst_acc:0.8735 trn_loss:1.1183 tst_loss:1.3143 tst_nll:0.9988 tst_kl:0.3155 sum_norm_grad:7.0501\n", "it: 3001 ms/it:3.8854 tst_acc:0.8670 trn_loss:1.7738 tst_loss:1.3476 tst_nll:1.0324 tst_kl:0.3152 sum_norm_grad:12.6129\n", "it: 3101 ms/it:4.0011 tst_acc:0.8825 trn_loss:0.7332 tst_loss:1.2051 tst_nll:0.8894 tst_kl:0.3157 sum_norm_grad:4.8421\n", "it: 3201 ms/it:3.9724 tst_acc:0.8675 trn_loss:1.2539 tst_loss:1.3021 tst_nll:0.9816 tst_kl:0.3205 sum_norm_grad:7.0985\n", "it: 3301 ms/it:4.1110 tst_acc:0.8570 trn_loss:0.8448 tst_loss:1.1390 tst_nll:0.8192 tst_kl:0.3198 sum_norm_grad:6.2651\n", "it: 3401 ms/it:3.9468 tst_acc:0.8725 trn_loss:2.2540 tst_loss:1.0749 tst_nll:0.7523 tst_kl:0.3226 sum_norm_grad:10.1086\n", "it: 3501 ms/it:4.0869 tst_acc:0.8835 trn_loss:0.6078 tst_loss:1.0931 tst_nll:0.7682 tst_kl:0.3248 sum_norm_grad:4.0761\n", "it: 3601 ms/it:3.9498 tst_acc:0.8800 trn_loss:0.9377 tst_loss:1.0535 tst_nll:0.7263 tst_kl:0.3272 sum_norm_grad:7.7651\n", "it: 3701 ms/it:3.9123 tst_acc:0.8770 trn_loss:1.5083 tst_loss:1.0264 tst_nll:0.6982 tst_kl:0.3281 sum_norm_grad:6.2144\n", "it: 3801 ms/it:3.9928 tst_acc:0.8855 trn_loss:0.4369 tst_loss:0.9467 tst_nll:0.6162 tst_kl:0.3305 sum_norm_grad:2.8031\n", "it: 3901 ms/it:3.9239 tst_acc:0.8925 trn_loss:0.7663 tst_loss:1.0723 tst_nll:0.7410 tst_kl:0.3312 sum_norm_grad:5.9763\n", "it: 4001 ms/it:4.0469 tst_acc:0.8925 trn_loss:0.5692 tst_loss:0.9270 tst_nll:0.5935 tst_kl:0.3334 sum_norm_grad:2.8922\n", "it: 4101 ms/it:3.7619 tst_acc:0.9060 trn_loss:0.8710 tst_loss:0.8875 tst_nll:0.5505 tst_kl:0.3369 sum_norm_grad:6.1845\n", "it: 4201 ms/it:4.1047 tst_acc:0.8965 trn_loss:0.4071 tst_loss:0.9123 tst_nll:0.5755 tst_kl:0.3368 sum_norm_grad:2.1311\n", "it: 4301 ms/it:3.9728 tst_acc:0.8850 trn_loss:0.9103 tst_loss:0.9304 tst_nll:0.5917 tst_kl:0.3387 sum_norm_grad:4.9114\n", "it: 4401 ms/it:3.9363 tst_acc:0.9130 trn_loss:1.7282 tst_loss:0.7744 tst_nll:0.4357 tst_kl:0.3387 sum_norm_grad:6.8361\n", "it: 4501 ms/it:3.8017 tst_acc:0.9155 trn_loss:1.2034 tst_loss:0.8359 tst_nll:0.4951 tst_kl:0.3408 sum_norm_grad:7.6702\n", "it: 4601 ms/it:4.0642 tst_acc:0.9120 trn_loss:0.9882 tst_loss:0.8646 tst_nll:0.5207 tst_kl:0.3439 sum_norm_grad:9.5124\n", "it: 4701 ms/it:3.8952 tst_acc:0.9100 trn_loss:1.1729 tst_loss:0.8813 tst_nll:0.5387 tst_kl:0.3426 sum_norm_grad:4.8135\n", "it: 4801 ms/it:3.7730 tst_acc:0.9160 trn_loss:0.4045 tst_loss:0.7455 tst_nll:0.4022 tst_kl:0.3433 sum_norm_grad:2.2956\n", "it: 4901 ms/it:3.6960 tst_acc:0.9075 trn_loss:0.7228 tst_loss:0.8334 tst_nll:0.4903 tst_kl:0.3431 sum_norm_grad:5.9699\n", "it: 5001 ms/it:3.7376 tst_acc:0.9210 trn_loss:0.5268 tst_loss:0.7140 tst_nll:0.3685 tst_kl:0.3455 sum_norm_grad:4.6464\n", "it: 5101 ms/it:3.8780 tst_acc:0.9370 trn_loss:0.8155 tst_loss:0.7131 tst_nll:0.3670 tst_kl:0.3461 sum_norm_grad:5.6356\n", "it: 5201 ms/it:3.6609 tst_acc:0.9345 trn_loss:0.7713 tst_loss:0.7443 tst_nll:0.3966 tst_kl:0.3477 sum_norm_grad:4.9599\n", "it: 5301 ms/it:3.9859 tst_acc:0.9215 trn_loss:1.0918 tst_loss:0.7639 tst_nll:0.4144 tst_kl:0.3496 sum_norm_grad:6.9639\n", "it: 5401 ms/it:3.8696 tst_acc:0.9305 trn_loss:0.7758 tst_loss:0.6449 tst_nll:0.2954 tst_kl:0.3495 sum_norm_grad:5.4554\n", "it: 5501 ms/it:3.8664 tst_acc:0.9115 trn_loss:1.4699 tst_loss:0.7773 tst_nll:0.4255 tst_kl:0.3518 sum_norm_grad:5.8081\n", "it: 5601 ms/it:3.9588 tst_acc:0.9150 trn_loss:1.1072 tst_loss:0.7865 tst_nll:0.4364 tst_kl:0.3501 sum_norm_grad:6.9779\n", "it: 5701 ms/it:3.9183 tst_acc:0.9170 trn_loss:0.7125 tst_loss:0.7487 tst_nll:0.3958 tst_kl:0.3530 sum_norm_grad:3.6534\n", "it: 5801 ms/it:3.9031 tst_acc:0.9360 trn_loss:0.3692 tst_loss:0.7300 tst_nll:0.3763 tst_kl:0.3538 sum_norm_grad:0.9757\n", "it: 5901 ms/it:4.0894 tst_acc:0.9205 trn_loss:0.5741 tst_loss:0.7402 tst_nll:0.3861 tst_kl:0.3542 sum_norm_grad:5.3837\n", "it: 6001 ms/it:4.0470 tst_acc:0.9160 trn_loss:0.4374 tst_loss:0.7195 tst_nll:0.3669 tst_kl:0.3527 sum_norm_grad:3.5918\n", "it: 6101 ms/it:3.8831 tst_acc:0.9325 trn_loss:0.4947 tst_loss:0.7233 tst_nll:0.3692 tst_kl:0.3541 sum_norm_grad:2.9750\n", "it: 6201 ms/it:4.0328 tst_acc:0.9400 trn_loss:1.2672 tst_loss:0.6815 tst_nll:0.3261 tst_kl:0.3553 sum_norm_grad:6.6143\n", "it: 6301 ms/it:3.8980 tst_acc:0.9380 trn_loss:0.5253 tst_loss:0.6950 tst_nll:0.3414 tst_kl:0.3536 sum_norm_grad:5.1917\n", "it: 6401 ms/it:3.8323 tst_acc:0.9415 trn_loss:1.1518 tst_loss:0.5930 tst_nll:0.2386 tst_kl:0.3544 sum_norm_grad:3.3670\n", "it: 6501 ms/it:4.0591 tst_acc:0.9255 trn_loss:1.2271 tst_loss:0.7223 tst_nll:0.3683 tst_kl:0.3541 sum_norm_grad:4.4156\n", "it: 6601 ms/it:4.0571 tst_acc:0.9345 trn_loss:0.4177 tst_loss:0.6636 tst_nll:0.3090 tst_kl:0.3546 sum_norm_grad:1.8167\n", "it: 6701 ms/it:3.8964 tst_acc:0.9510 trn_loss:1.6205 tst_loss:0.6293 tst_nll:0.2762 tst_kl:0.3531 sum_norm_grad:4.6092\n", "it: 6801 ms/it:4.0024 tst_acc:0.9370 trn_loss:0.7933 tst_loss:0.6722 tst_nll:0.3198 tst_kl:0.3524 sum_norm_grad:5.5259\n", "it: 6901 ms/it:3.9365 tst_acc:0.9400 trn_loss:0.4914 tst_loss:0.6975 tst_nll:0.3438 tst_kl:0.3538 sum_norm_grad:3.1655\n", "it: 7001 ms/it:3.9592 tst_acc:0.9215 trn_loss:0.5987 tst_loss:0.7676 tst_nll:0.4150 tst_kl:0.3525 sum_norm_grad:3.5757\n", "it: 7101 ms/it:3.8877 tst_acc:0.9335 trn_loss:1.0931 tst_loss:0.6915 tst_nll:0.3364 tst_kl:0.3551 sum_norm_grad:4.8359\n", "it: 7201 ms/it:3.9275 tst_acc:0.9505 trn_loss:1.0986 tst_loss:0.5902 tst_nll:0.2369 tst_kl:0.3533 sum_norm_grad:6.8004\n", "it: 7301 ms/it:4.0631 tst_acc:0.9575 trn_loss:0.5730 tst_loss:0.5933 tst_nll:0.2381 tst_kl:0.3551 sum_norm_grad:3.5288\n", "it: 7401 ms/it:3.9955 tst_acc:0.9440 trn_loss:0.3934 tst_loss:0.6002 tst_nll:0.2470 tst_kl:0.3532 sum_norm_grad:1.1933\n", "it: 7501 ms/it:3.8963 tst_acc:0.9455 trn_loss:0.8857 tst_loss:0.6165 tst_nll:0.2613 tst_kl:0.3553 sum_norm_grad:6.5109\n", "it: 7601 ms/it:4.0886 tst_acc:0.9425 trn_loss:0.5190 tst_loss:0.6719 tst_nll:0.3193 tst_kl:0.3525 sum_norm_grad:4.7453\n", "it: 7701 ms/it:3.7783 tst_acc:0.9530 trn_loss:0.9799 tst_loss:0.5732 tst_nll:0.2224 tst_kl:0.3509 sum_norm_grad:8.2814\n", "it: 7801 ms/it:3.8785 tst_acc:0.9540 trn_loss:0.6683 tst_loss:0.6285 tst_nll:0.2801 tst_kl:0.3484 sum_norm_grad:4.8551\n", "it: 7901 ms/it:4.0093 tst_acc:0.9555 trn_loss:0.5054 tst_loss:0.5828 tst_nll:0.2363 tst_kl:0.3465 sum_norm_grad:2.4672\n", "it: 8001 ms/it:3.9008 tst_acc:0.9440 trn_loss:0.5357 tst_loss:0.6174 tst_nll:0.2674 tst_kl:0.3500 sum_norm_grad:4.9554\n", "it: 8101 ms/it:4.0858 tst_acc:0.9560 trn_loss:0.7299 tst_loss:0.5604 tst_nll:0.2145 tst_kl:0.3459 sum_norm_grad:1.9412\n", "it: 8201 ms/it:3.9650 tst_acc:0.9520 trn_loss:0.4379 tst_loss:0.6517 tst_nll:0.3039 tst_kl:0.3478 sum_norm_grad:3.0030\n", "it: 8301 ms/it:4.0518 tst_acc:0.9520 trn_loss:1.3436 tst_loss:0.6454 tst_nll:0.2974 tst_kl:0.3480 sum_norm_grad:5.6112\n", "it: 8401 ms/it:3.9783 tst_acc:0.9625 trn_loss:0.3490 tst_loss:0.5599 tst_nll:0.2135 tst_kl:0.3464 sum_norm_grad:0.2034\n", "it: 8501 ms/it:3.9764 tst_acc:0.9540 trn_loss:0.6815 tst_loss:0.5576 tst_nll:0.2129 tst_kl:0.3447 sum_norm_grad:3.7303\n", "it: 8601 ms/it:3.9883 tst_acc:0.9560 trn_loss:0.5182 tst_loss:0.5690 tst_nll:0.2242 tst_kl:0.3448 sum_norm_grad:3.3792\n", "it: 8701 ms/it:3.8798 tst_acc:0.9315 trn_loss:0.8600 tst_loss:0.7801 tst_nll:0.4356 tst_kl:0.3445 sum_norm_grad:3.5876\n", "it: 8801 ms/it:4.0914 tst_acc:0.9575 trn_loss:0.7861 tst_loss:0.5740 tst_nll:0.2328 tst_kl:0.3413 sum_norm_grad:3.4349\n", "it: 8901 ms/it:3.9658 tst_acc:0.9500 trn_loss:0.4085 tst_loss:0.5710 tst_nll:0.2302 tst_kl:0.3407 sum_norm_grad:2.1678\n", "it: 9001 ms/it:4.0408 tst_acc:0.9530 trn_loss:0.5396 tst_loss:0.5652 tst_nll:0.2243 tst_kl:0.3408 sum_norm_grad:3.5100\n", "it: 9101 ms/it:3.9666 tst_acc:0.9515 trn_loss:0.3412 tst_loss:0.5904 tst_nll:0.2523 tst_kl:0.3381 sum_norm_grad:0.1454\n", "it: 9201 ms/it:3.9417 tst_acc:0.9515 trn_loss:0.5546 tst_loss:0.5627 tst_nll:0.2242 tst_kl:0.3385 sum_norm_grad:4.2297\n", "it: 9301 ms/it:3.8457 tst_acc:0.9535 trn_loss:0.6075 tst_loss:0.5458 tst_nll:0.2080 tst_kl:0.3378 sum_norm_grad:4.9227\n", "it: 9401 ms/it:3.9689 tst_acc:0.9375 trn_loss:0.4993 tst_loss:0.6201 tst_nll:0.2855 tst_kl:0.3346 sum_norm_grad:2.9346\n", "it: 9501 ms/it:4.0548 tst_acc:0.9510 trn_loss:1.0234 tst_loss:0.5534 tst_nll:0.2223 tst_kl:0.3312 sum_norm_grad:5.5114\n", "it: 9601 ms/it:3.9514 tst_acc:0.9580 trn_loss:0.6258 tst_loss:0.5995 tst_nll:0.2681 tst_kl:0.3314 sum_norm_grad:6.6073\n", "it: 9701 ms/it:3.8920 tst_acc:0.9400 trn_loss:0.4452 tst_loss:0.6250 tst_nll:0.2959 tst_kl:0.3291 sum_norm_grad:3.0340\n", "it: 9801 ms/it:4.0399 tst_acc:0.9580 trn_loss:0.5026 tst_loss:0.5449 tst_nll:0.2179 tst_kl:0.3270 sum_norm_grad:3.2578\n", "it: 9901 ms/it:4.0137 tst_acc:0.9585 trn_loss:0.3263 tst_loss:0.5291 tst_nll:0.2014 tst_kl:0.3277 sum_norm_grad:0.0510\n", "it:10001 ms/it:4.0287 tst_acc:0.9605 trn_loss:0.5603 tst_loss:0.5282 tst_nll:0.2026 tst_kl:0.3256 sum_norm_grad:2.9182\n", "it:10101 ms/it:4.0722 tst_acc:0.9515 trn_loss:0.7266 tst_loss:0.6692 tst_nll:0.3464 tst_kl:0.3229 sum_norm_grad:5.5061\n", "it:10201 ms/it:4.1431 tst_acc:0.9615 trn_loss:0.5190 tst_loss:0.5144 tst_nll:0.1918 tst_kl:0.3226 sum_norm_grad:3.6430\n", "it:10301 ms/it:4.1492 tst_acc:0.9635 trn_loss:0.3812 tst_loss:0.4837 tst_nll:0.1635 tst_kl:0.3202 sum_norm_grad:3.0847\n", "it:10401 ms/it:3.9624 tst_acc:0.9610 trn_loss:0.4839 tst_loss:0.5172 tst_nll:0.1983 tst_kl:0.3189 sum_norm_grad:3.1248\n", "it:10501 ms/it:4.0594 tst_acc:0.9665 trn_loss:0.6110 tst_loss:0.4930 tst_nll:0.1716 tst_kl:0.3214 sum_norm_grad:5.1827\n", "it:10601 ms/it:4.1912 tst_acc:0.9530 trn_loss:0.4877 tst_loss:0.5494 tst_nll:0.2295 tst_kl:0.3199 sum_norm_grad:6.0416\n", "it:10701 ms/it:3.9832 tst_acc:0.9645 trn_loss:0.3775 tst_loss:0.5252 tst_nll:0.2038 tst_kl:0.3215 sum_norm_grad:2.7238\n", "it:10801 ms/it:4.0256 tst_acc:0.9725 trn_loss:0.3877 tst_loss:0.4734 tst_nll:0.1526 tst_kl:0.3208 sum_norm_grad:2.9169\n", "it:10901 ms/it:4.0747 tst_acc:0.9580 trn_loss:0.3180 tst_loss:0.6106 tst_nll:0.2944 tst_kl:0.3162 sum_norm_grad:0.1334\n", "it:11001 ms/it:3.9968 tst_acc:0.9455 trn_loss:0.3194 tst_loss:0.5343 tst_nll:0.2152 tst_kl:0.3191 sum_norm_grad:0.0178\n", "it:11101 ms/it:3.9972 tst_acc:0.9515 trn_loss:0.3889 tst_loss:0.5569 tst_nll:0.2421 tst_kl:0.3147 sum_norm_grad:2.8468\n", "it:11201 ms/it:4.0366 tst_acc:0.9610 trn_loss:0.6569 tst_loss:0.4738 tst_nll:0.1589 tst_kl:0.3149 sum_norm_grad:3.3640\n", "it:11301 ms/it:4.1191 tst_acc:0.9580 trn_loss:0.3132 tst_loss:0.4906 tst_nll:0.1786 tst_kl:0.3120 sum_norm_grad:0.0134\n", "it:11401 ms/it:4.0271 tst_acc:0.9610 trn_loss:0.3254 tst_loss:0.5107 tst_nll:0.2023 tst_kl:0.3084 sum_norm_grad:1.3171\n", "it:11501 ms/it:3.9839 tst_acc:0.9590 trn_loss:0.3049 tst_loss:0.4978 tst_nll:0.1914 tst_kl:0.3064 sum_norm_grad:0.0171\n", "it:11601 ms/it:4.1491 tst_acc:0.9555 trn_loss:0.7551 tst_loss:0.5123 tst_nll:0.2050 tst_kl:0.3073 sum_norm_grad:3.4431\n", "it:11701 ms/it:4.0772 tst_acc:0.9590 trn_loss:0.3967 tst_loss:0.4841 tst_nll:0.1806 tst_kl:0.3036 sum_norm_grad:3.3256\n", "it:11801 ms/it:4.0272 tst_acc:0.9640 trn_loss:0.3794 tst_loss:0.4489 tst_nll:0.1470 tst_kl:0.3020 sum_norm_grad:2.0461\n", "it:11901 ms/it:4.0927 tst_acc:0.9645 trn_loss:0.5983 tst_loss:0.5148 tst_nll:0.2124 tst_kl:0.3024 sum_norm_grad:2.4591\n", "it:12001 ms/it:4.1528 tst_acc:0.9585 trn_loss:0.4211 tst_loss:0.4888 tst_nll:0.1880 tst_kl:0.3008 sum_norm_grad:3.2418\n", "it:12101 ms/it:3.9710 tst_acc:0.9545 trn_loss:0.3040 tst_loss:0.5454 tst_nll:0.2443 tst_kl:0.3011 sum_norm_grad:0.0830\n", "it:12201 ms/it:4.0374 tst_acc:0.9645 trn_loss:0.5958 tst_loss:0.4543 tst_nll:0.1528 tst_kl:0.3015 sum_norm_grad:3.9811\n", "it:12301 ms/it:4.1819 tst_acc:0.9655 trn_loss:0.3156 tst_loss:0.5346 tst_nll:0.2348 tst_kl:0.2998 sum_norm_grad:1.6105\n", "it:12401 ms/it:3.9935 tst_acc:0.9635 trn_loss:0.3303 tst_loss:0.4585 tst_nll:0.1592 tst_kl:0.2993 sum_norm_grad:2.2599\n", "it:12501 ms/it:4.0487 tst_acc:0.9645 trn_loss:0.3004 tst_loss:0.5061 tst_nll:0.2083 tst_kl:0.2978 sum_norm_grad:0.0668\n", "it:12601 ms/it:3.9198 tst_acc:0.9625 trn_loss:1.6642 tst_loss:0.4656 tst_nll:0.1650 tst_kl:0.3005 sum_norm_grad:6.9393\n", "it:12701 ms/it:3.7626 tst_acc:0.9560 trn_loss:0.5358 tst_loss:0.4966 tst_nll:0.1965 tst_kl:0.3000 sum_norm_grad:7.2128\n", "it:12801 ms/it:3.7579 tst_acc:0.9680 trn_loss:0.3825 tst_loss:0.4433 tst_nll:0.1396 tst_kl:0.3038 sum_norm_grad:2.9145\n", "it:12901 ms/it:3.7854 tst_acc:0.9720 trn_loss:0.3692 tst_loss:0.4615 tst_nll:0.1624 tst_kl:0.2991 sum_norm_grad:2.2373\n", "it:13001 ms/it:3.9328 tst_acc:0.9580 trn_loss:0.3034 tst_loss:0.4807 tst_nll:0.1820 tst_kl:0.2987 sum_norm_grad:0.2544\n", "it:13101 ms/it:4.0091 tst_acc:0.9625 trn_loss:0.4843 tst_loss:0.4470 tst_nll:0.1499 tst_kl:0.2971 sum_norm_grad:2.6624\n", "it:13201 ms/it:4.1551 tst_acc:0.9605 trn_loss:0.3185 tst_loss:0.4487 tst_nll:0.1522 tst_kl:0.2966 sum_norm_grad:0.9811\n", "it:13301 ms/it:3.8945 tst_acc:0.9640 trn_loss:0.5640 tst_loss:0.4398 tst_nll:0.1449 tst_kl:0.2950 sum_norm_grad:2.3270\n", "it:13401 ms/it:4.0474 tst_acc:0.9715 trn_loss:0.7745 tst_loss:0.4601 tst_nll:0.1676 tst_kl:0.2925 sum_norm_grad:4.6689\n", "it:13501 ms/it:4.1910 tst_acc:0.9535 trn_loss:0.3593 tst_loss:0.5454 tst_nll:0.2533 tst_kl:0.2921 sum_norm_grad:1.9409\n", "it:13601 ms/it:3.9952 tst_acc:0.9635 trn_loss:0.4736 tst_loss:0.4601 tst_nll:0.1676 tst_kl:0.2924 sum_norm_grad:3.5644\n", "it:13701 ms/it:4.0719 tst_acc:0.9710 trn_loss:0.2986 tst_loss:0.4606 tst_nll:0.1661 tst_kl:0.2946 sum_norm_grad:0.6279\n", "it:13801 ms/it:4.0196 tst_acc:0.9660 trn_loss:0.9478 tst_loss:0.4852 tst_nll:0.1958 tst_kl:0.2893 sum_norm_grad:5.0802\n", "it:13901 ms/it:4.0258 tst_acc:0.9695 trn_loss:0.4310 tst_loss:0.4311 tst_nll:0.1410 tst_kl:0.2901 sum_norm_grad:5.7558\n", "it:14001 ms/it:3.9523 tst_acc:0.9630 trn_loss:0.3845 tst_loss:0.4306 tst_nll:0.1413 tst_kl:0.2893 sum_norm_grad:3.2005\n", "it:14101 ms/it:4.0503 tst_acc:0.9605 trn_loss:0.3007 tst_loss:0.4851 tst_nll:0.1945 tst_kl:0.2906 sum_norm_grad:0.8452\n", "it:14201 ms/it:4.1792 tst_acc:0.9670 trn_loss:0.3004 tst_loss:0.4574 tst_nll:0.1676 tst_kl:0.2898 sum_norm_grad:0.5864\n", "it:14301 ms/it:4.0907 tst_acc:0.9610 trn_loss:0.3002 tst_loss:0.4524 tst_nll:0.1630 tst_kl:0.2894 sum_norm_grad:0.6309\n", "it:14401 ms/it:4.0256 tst_acc:0.9725 trn_loss:0.3457 tst_loss:0.4301 tst_nll:0.1397 tst_kl:0.2904 sum_norm_grad:2.7863\n", "it:14501 ms/it:4.1129 tst_acc:0.9680 trn_loss:0.6517 tst_loss:0.4271 tst_nll:0.1370 tst_kl:0.2901 sum_norm_grad:5.5336\n", "it:14601 ms/it:4.1169 tst_acc:0.9605 trn_loss:0.6168 tst_loss:0.4444 tst_nll:0.1557 tst_kl:0.2887 sum_norm_grad:6.3000\n", "it:14701 ms/it:4.0285 tst_acc:0.9600 trn_loss:0.5961 tst_loss:0.4503 tst_nll:0.1622 tst_kl:0.2881 sum_norm_grad:6.2231\n", "it:14801 ms/it:3.9670 tst_acc:0.9640 trn_loss:0.3150 tst_loss:0.4470 tst_nll:0.1587 tst_kl:0.2883 sum_norm_grad:1.6966\n", "it:14901 ms/it:4.0100 tst_acc:0.9755 trn_loss:0.3967 tst_loss:0.4127 tst_nll:0.1235 tst_kl:0.2892 sum_norm_grad:3.2471\n", "it:15001 ms/it:3.9892 tst_acc:0.9695 trn_loss:0.3209 tst_loss:0.4563 tst_nll:0.1675 tst_kl:0.2888 sum_norm_grad:3.6252\n", "it:15101 ms/it:4.1697 tst_acc:0.9565 trn_loss:0.4164 tst_loss:0.5404 tst_nll:0.2558 tst_kl:0.2846 sum_norm_grad:6.1996\n", "it:15201 ms/it:3.8684 tst_acc:0.9700 trn_loss:0.6764 tst_loss:0.4735 tst_nll:0.1879 tst_kl:0.2856 sum_norm_grad:4.1625\n", "it:15301 ms/it:3.8755 tst_acc:0.9675 trn_loss:0.7920 tst_loss:0.4526 tst_nll:0.1680 tst_kl:0.2847 sum_norm_grad:5.0280\n", "it:15401 ms/it:3.9478 tst_acc:0.9690 trn_loss:0.5737 tst_loss:0.4505 tst_nll:0.1667 tst_kl:0.2838 sum_norm_grad:4.9883\n", "it:15501 ms/it:4.0127 tst_acc:0.9505 trn_loss:0.3146 tst_loss:0.4777 tst_nll:0.1902 tst_kl:0.2875 sum_norm_grad:1.1997\n", "it:15601 ms/it:4.1600 tst_acc:0.9640 trn_loss:0.2892 tst_loss:0.4651 tst_nll:0.1764 tst_kl:0.2887 sum_norm_grad:0.0423\n", "it:15701 ms/it:4.0222 tst_acc:0.9645 trn_loss:0.4415 tst_loss:0.4608 tst_nll:0.1754 tst_kl:0.2854 sum_norm_grad:4.5139\n", "it:15801 ms/it:3.9192 tst_acc:0.9685 trn_loss:0.3805 tst_loss:0.4093 tst_nll:0.1281 tst_kl:0.2812 sum_norm_grad:5.8602\n", "it:15901 ms/it:3.6926 tst_acc:0.9760 trn_loss:0.2826 tst_loss:0.4172 tst_nll:0.1363 tst_kl:0.2808 sum_norm_grad:0.0702\n", "it:16001 ms/it:4.0114 tst_acc:0.9655 trn_loss:0.5406 tst_loss:0.4407 tst_nll:0.1565 tst_kl:0.2842 sum_norm_grad:7.7410\n", "it:16101 ms/it:3.9677 tst_acc:0.9705 trn_loss:0.2867 tst_loss:0.4966 tst_nll:0.2131 tst_kl:0.2834 sum_norm_grad:0.4872\n", "it:16201 ms/it:3.9714 tst_acc:0.9705 trn_loss:0.5924 tst_loss:0.4186 tst_nll:0.1330 tst_kl:0.2856 sum_norm_grad:4.3815\n", "it:16301 ms/it:3.9763 tst_acc:0.9730 trn_loss:0.4129 tst_loss:0.4093 tst_nll:0.1237 tst_kl:0.2856 sum_norm_grad:3.9573\n", "it:16401 ms/it:3.9081 tst_acc:0.9530 trn_loss:0.2875 tst_loss:0.4477 tst_nll:0.1610 tst_kl:0.2867 sum_norm_grad:0.1167\n", "it:16501 ms/it:4.0766 tst_acc:0.9725 trn_loss:0.3180 tst_loss:0.4415 tst_nll:0.1535 tst_kl:0.2881 sum_norm_grad:2.1457\n", "it:16601 ms/it:4.0789 tst_acc:0.9595 trn_loss:0.4518 tst_loss:0.4384 tst_nll:0.1529 tst_kl:0.2856 sum_norm_grad:3.7270\n", "it:16701 ms/it:4.0770 tst_acc:0.9540 trn_loss:0.4883 tst_loss:0.5747 tst_nll:0.2888 tst_kl:0.2859 sum_norm_grad:6.3127\n", "it:16801 ms/it:3.9686 tst_acc:0.9470 trn_loss:0.7660 tst_loss:0.5449 tst_nll:0.2607 tst_kl:0.2841 sum_norm_grad:6.8640\n", "it:16901 ms/it:4.0843 tst_acc:0.9720 trn_loss:0.6791 tst_loss:0.4385 tst_nll:0.1543 tst_kl:0.2842 sum_norm_grad:5.0611\n", "it:17001 ms/it:4.0326 tst_acc:0.9485 trn_loss:0.3662 tst_loss:0.6400 tst_nll:0.3543 tst_kl:0.2857 sum_norm_grad:5.5587\n", "it:17101 ms/it:3.9873 tst_acc:0.9550 trn_loss:1.0070 tst_loss:0.6144 tst_nll:0.3246 tst_kl:0.2898 sum_norm_grad:11.7100\n", "it:17201 ms/it:3.9656 tst_acc:0.9695 trn_loss:0.2885 tst_loss:0.4724 tst_nll:0.1841 tst_kl:0.2883 sum_norm_grad:0.0180\n", "it:17301 ms/it:4.0687 tst_acc:0.9645 trn_loss:0.2902 tst_loss:0.4296 tst_nll:0.1415 tst_kl:0.2881 sum_norm_grad:0.0060\n", "it:17401 ms/it:4.0105 tst_acc:0.9755 trn_loss:0.4903 tst_loss:0.4250 tst_nll:0.1388 tst_kl:0.2861 sum_norm_grad:5.6156\n", "it:17501 ms/it:4.0767 tst_acc:0.9665 trn_loss:0.5377 tst_loss:0.4181 tst_nll:0.1331 tst_kl:0.2850 sum_norm_grad:4.3493\n", "it:17601 ms/it:3.8058 tst_acc:0.9630 trn_loss:0.3337 tst_loss:0.4663 tst_nll:0.1846 tst_kl:0.2817 sum_norm_grad:2.6130\n", "it:17701 ms/it:3.9994 tst_acc:0.9630 trn_loss:0.2957 tst_loss:0.4675 tst_nll:0.1863 tst_kl:0.2811 sum_norm_grad:0.9803\n", "it:17801 ms/it:4.0825 tst_acc:0.9715 trn_loss:0.3633 tst_loss:0.4168 tst_nll:0.1360 tst_kl:0.2808 sum_norm_grad:4.0092\n", "it:17901 ms/it:4.0679 tst_acc:0.9810 trn_loss:0.2838 tst_loss:0.3677 tst_nll:0.0852 tst_kl:0.2825 sum_norm_grad:0.1164\n", "it:18001 ms/it:4.1126 tst_acc:0.9640 trn_loss:0.4023 tst_loss:0.4335 tst_nll:0.1508 tst_kl:0.2827 sum_norm_grad:2.9085\n", "it:18101 ms/it:4.0763 tst_acc:0.9635 trn_loss:0.3012 tst_loss:0.4868 tst_nll:0.2053 tst_kl:0.2815 sum_norm_grad:1.4692\n", "it:18201 ms/it:4.0795 tst_acc:0.9625 trn_loss:0.2843 tst_loss:0.4739 tst_nll:0.1924 tst_kl:0.2815 sum_norm_grad:0.2426\n", "it:18301 ms/it:3.9620 tst_acc:0.9580 trn_loss:0.4541 tst_loss:0.4786 tst_nll:0.1970 tst_kl:0.2816 sum_norm_grad:3.2329\n", "it:18401 ms/it:4.0137 tst_acc:0.9665 trn_loss:0.4026 tst_loss:0.4390 tst_nll:0.1543 tst_kl:0.2847 sum_norm_grad:3.5079\n", "it:18501 ms/it:4.0719 tst_acc:0.9545 trn_loss:0.5524 tst_loss:0.5126 tst_nll:0.2262 tst_kl:0.2864 sum_norm_grad:3.8132\n", "it:18601 ms/it:3.9031 tst_acc:0.9670 trn_loss:0.2877 tst_loss:0.4704 tst_nll:0.1829 tst_kl:0.2875 sum_norm_grad:0.0500\n", "it:18701 ms/it:3.9321 tst_acc:0.9685 trn_loss:0.2878 tst_loss:0.4687 tst_nll:0.1828 tst_kl:0.2860 sum_norm_grad:0.0418\n", "it:18801 ms/it:4.0339 tst_acc:0.9740 trn_loss:0.4590 tst_loss:0.4106 tst_nll:0.1223 tst_kl:0.2883 sum_norm_grad:3.0058\n", "it:18901 ms/it:4.1064 tst_acc:0.9515 trn_loss:0.4362 tst_loss:0.4768 tst_nll:0.1898 tst_kl:0.2870 sum_norm_grad:4.9499\n", "it:19001 ms/it:4.1348 tst_acc:0.9645 trn_loss:0.2843 tst_loss:0.4390 tst_nll:0.1531 tst_kl:0.2859 sum_norm_grad:0.0411\n", "it:19101 ms/it:3.8992 tst_acc:0.9665 trn_loss:0.2848 tst_loss:0.4721 tst_nll:0.1884 tst_kl:0.2837 sum_norm_grad:0.0044\n", "it:19201 ms/it:4.0857 tst_acc:0.9695 trn_loss:0.5177 tst_loss:0.4461 tst_nll:0.1582 tst_kl:0.2878 sum_norm_grad:4.7725\n", "it:19301 ms/it:3.9766 tst_acc:0.9710 trn_loss:0.2896 tst_loss:0.3844 tst_nll:0.1000 tst_kl:0.2844 sum_norm_grad:0.2153\n", "it:19401 ms/it:3.9142 tst_acc:0.9725 trn_loss:0.3389 tst_loss:0.4276 tst_nll:0.1438 tst_kl:0.2838 sum_norm_grad:3.5745\n", "it:19501 ms/it:3.8347 tst_acc:0.9680 trn_loss:0.5121 tst_loss:0.4608 tst_nll:0.1741 tst_kl:0.2867 sum_norm_grad:5.2784\n", "it:19601 ms/it:4.0078 tst_acc:0.9660 trn_loss:0.6609 tst_loss:0.4748 tst_nll:0.1863 tst_kl:0.2886 sum_norm_grad:4.7520\n", "it:19701 ms/it:4.0738 tst_acc:0.9670 trn_loss:0.4750 tst_loss:0.5153 tst_nll:0.2284 tst_kl:0.2869 sum_norm_grad:6.4839\n", "it:19801 ms/it:4.0431 tst_acc:0.9700 trn_loss:0.3464 tst_loss:0.4074 tst_nll:0.1198 tst_kl:0.2876 sum_norm_grad:2.0778\n", "it:19901 ms/it:4.0963 tst_acc:0.9705 trn_loss:0.3211 tst_loss:0.4235 tst_nll:0.1377 tst_kl:0.2858 sum_norm_grad:1.9506\n", "it:20000 ms/it:3.8401 tst_acc:0.9710 trn_loss:0.3530 tst_loss:0.4541 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.1883\n" ] } ], "source": [ "num_train_steps = 20e3 # @param { isTemplate: true}\n", "num_train_steps = int(num_train_steps) # Enforce correct type when overridden.\n", "dur_sec = dur_num = 0\n", "\n", "for i in range(num_train_steps):\n", " start = time.time()\n", " trn_loss, (trn_nll, trn_kl), g = fit()\n", " stop = time.time()\n", " dur_sec += stop - start\n", " dur_num += 1\n", " if i % 100 == 0 or i == num_train_steps - 1:\n", " tst_loss, tst_acc, tst_nll, tst_kl = eval()\n", " f, x = zip(*[\n", " ('it:{:5}', opt.iterations),\n", " ('ms/it:{:6.4f}', dur_sec / max(1., dur_num) * 1000.),\n", " ('tst_acc:{:6.4f}', tst_acc),\n", " ('trn_loss:{:6.4f}', trn_loss),\n", " ('tst_loss:{:6.4f}', tst_loss),\n", " ('tst_nll:{:6.4f}', tst_nll),\n", " ('tst_kl:{:6.4f}', tst_kl),\n", " ('sum_norm_grad:{:6.4f}', sum(g)),\n", "\n", " ])\n", " print(' '.join(f).format(*[getattr(x_, 'numpy', lambda: x_)()\n", " for x_ in x]))\n", " sys.stdout.flush()\n", " dur_sec = dur_num = 0\n", " # if i % 1000 == 0 or i == maxiter - 1:\n", " # bnn.save('/tmp/bnn.npz')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "G1ImqkK7xAv1" }, "source": [ "### 5 Evaluate" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "code", "colab": {}, "colab_type": "code", "id": "e4hGx4OUdRTt" }, "outputs": [], "source": [ "# Run inference multiple times...\n", "num_inferences = 10 # @param { isTemplate: true}\n", "\n", "@tf.function(autograph=False)\n", "def predicted_log_prob(x):\n", " with tf.xla.experimental.jit_scope(compile_ops=True):\n", " return tf.math.log_softmax(bnn(x).logits, axis=-1)\n", " \n", "eval_iter = iter(eval_dataset.batch(2000).repeat(int(num_inferences)))\n", "\n", "before_avg_predicted_log_probs = tf.reshape(\n", " tf.stack([predicted_log_prob(x) for x, _ in eval_iter], axis=0),\n", " shape=[int(num_inferences), datasets_info.splits['test'].num_examples, -1])\n", "\n", "bnn_predicted_log_probs = tfp.math.reduce_logmeanexp(\n", " before_avg_predicted_log_probs, axis=0)" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "height": 205 }, "colab_type": "code", "id": "GruYULWneKq0", "outputId": "5e1eafe7-8085-4326-837a-efaf437dc544" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of examples undecided: 705\n", "Accurary after excluding undecided ones: 0.995266258717\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAADgQAAACHCAYAAABjo9MOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcjeX/x/E3jZGliGRLm+zCzFiyteArIUpaVKQshZKU\nSkVSSUWLRAlFSYusJaWvrUVkiSKFSmjRYo8MM78/fo/Pda7znTPLmfWc8Xr+4/KZ+9znOve5l+u6\n7vtcnwLJycnJAgAAAAAAAAAAAAAAAAAAAAAAAAAAEa1gXlcAAAAAAAAAAAAAAAAAAAAAAAAAAACk\njx8EAgAAAAAAAAAAAAAAAAAAAAAAAAAQBfhBIAAAAAAAAAAAAAAAAAAAAAAAAAAAUYAfBAIAAAAA\nAAAAAAAAAAAAAAAAAAAAEAX4QSAAAAAAAAAAAAAAAAAAAAAAAAAAAFGAHwQCAAAAAAAAAAAAAAAA\nAAAAAAAAABAF+EEgAAAAAAAAAAAAAAAAAAAAAAAAAABRgB8EAgAAAAAAAACAqFW9enXFxcXp2Wef\nzeuqAAAAAAAAAAAAAACQ4/hBIAAAAAAAAAAAiFoFChTQ3LlzNWDAABdLSkrSM888o+bNmys+Pl6d\nOnXSgQMHQr5+//79uu+++9SkSRM1bdpUY8eOTfP97AeIcXFxio+P15AhQ1JdtlevXm65+Ph41a5d\nWx06dMiWdU+aNEmXXXaZ4uPj1apVK02aNCnVZX/66Sf17dtXjRs3VqNGjdSzZ0/9+OOPqS4fzjZZ\ntWpV0GeMi4tT9erVtXDhwizXO9x1r1ixQt26dVP9+vXVsmXLVNcrSbt371aXLl3UqFEjNWzYUNde\ne63WrFmT6vJjx45V7dq1XT3i4+O1Y8eOVJdftGiR+5xdunTR1q1b06yPJCUmJqpNmza66KKL0lzu\n22+/VadOnVSvXj1deeWV2rRpU6rLhrt/h3PsHDlyREOHDlXTpk3VqFEj9enTR7t27cqWdYdbbzNr\n1ixVr15dM2bMSHWZcNcdzneZk8d8uOsOZz8Jd/82Gdne4e4nObnucL7LcLdJON8lAAAAAAAAAABA\nVsXkdQUAAAAAAAAAAAAyKzk5OUXsueee07p16/TOO++oXLly2rJli2JjY0O+fsSIETp8+LCWLFmi\nP/74Q927d1fFihV1xRVXhFzefoBYqVKldOv28ssvB/2/a9euatKkSarLh7NuSXryySdVrVo1bdu2\n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\n379fM2bMCLkNt23bpp07d+q6666TJCUmJmr//v1q1qyZ3n77bVWoUCFo+SpVqujVV18Nin3//fe6\n4YYbQtYjnO8y3GPn+++/15133uky0XXt2lVjxozRnj17VLJkySytO5x6f/HFF1q1apX7ceGePXu0\nadMmbdq0SQ8++GCW1i1l/Lv05dQxn9F1h7uf/K+09u9wt3c4+0lOrlvK3Hdp0jvmfRn9LgEAAAAA\nAAAAADKLDIEAAAAAAAAAACDfqFSpkurXr6/x48fryJEj2rp1q+bPn6+LL7445PLbt2/Xnj17lJSU\npKVLl+rtt99W3759Qy67ZcsWbdq0SUlJSTp48KBGjhypcuXKqXLlyqnW599//9WCBQvUqVOnNOsd\n7rrnzp2rZ599VpMnT1bFihXTXPeBAwd08803KyEhQXfeeWeay0rhbRMze/ZsxcfHq1KlSmkuF069\nw113cnKyjhw5oiNHjrhyYmJiyGXXrVun1atXKzExUf/++68mTJigv/76S3Xr1g25/H//+1/t27dP\nkrR+/Xq99tpratmyZap12bBhg5KSkvT3339r6NChatmypc4+++wUy1WtWlVLly7VnDlzNGfOHD36\n6KM69dRTNXfuXJUvXz7F8g0bNlTBggX12muv6ciRI3r99dclSeeff37IeoTzXYZ77NSuXVuzZ8/W\ngQMHlJiYqGnTpqls2bIhf4iVk8flE088ofnz57ttWLt2bfXr108DBgzI8rqljH+XJqeO+XDWHe5+\nEs7+He72Dmc/ycl1S+F9l+Fsk8x8lwAAAAAAAAAAAFlBhkAAAAAAAAAAAJCvjB49Wvfff78aNWqk\nU089VXfeeacaNWoUctlvvvlGI0aM0IEDB3TWWWdp9OjRqf6I488//9SwYcP0+++/q2jRooqLi9NL\nL72kE044IdW6fPzxxzrppJPUsGHDNOsc7rqfe+457dmzR507d1ZycrIKFCigDh06aNiwYSHrsGHD\nBm3dulXvvvuupP/PdjV//nyVK1cuS9vEzJ07Vz179kxzmXDrHe66v/zyS3Xr1s1l8qpbt64aNGig\nqVOnplj2yJEjevTRR7Vjxw7FxMSoatWqmjBhgsqUKRNy3fPnz9f999+vxMRElStXTrfccos6duyY\nal0ee+wxbdq0SYUKFdKll16q++67L+RyBQsWVOnSpd3/S5QooYIFC6pUqVIhly9UqJDGjRun+++/\nX6NHj9Y555yjcePGKSYm9C2/cL/LcI6de++9V48++qhat26to0ePqkqVKho7dmy2rDucehcvXlzF\nixd3/4+NjU0Ry+y6pYx/lyanjvlw1h3ufhLO/h3u9g5nP8nJdUvhfZfhbJPMfJcAAAAAAAAAAABZ\nUSA5OTk5rysBAAAAAAAAAACQGXXr1lVsbKy6du2q/v3753V1AAAAAAAAAAAAAADIUfwgEAAAAAAA\nAAAAAAAAAAAAAAAAAACAKFAwrysAAAAAAAAAAAAAAAAAAAAAAAAAAADSxw8CAQAAAAAAAAAAAAAA\nAAAAAAAAAACIAvwgEAAAAAAAAAAAAAAAAAAAAAAAAACAKMAPAgEAAAAAAAAAAAAgA5YvX664uDjV\nqFFDy5cvz+vqAAAAAAAAAAAA4DjEDwIBAAAAAAAAAABwXFm5cqWqV6+u5557LtVl5s+frzZt2qh+\n/fpq2rSpBg8erIMHD6a6/KZNm3T99derfv36uuiii/TCCy+kuuysWbNUs2ZNxcfHKy4uTvHx8fry\nyy+zpd6StH37dt16662Kj49X48aNNWrUqGyptyQ988wzuuCCC9SgQQN169ZNW7ZsSXXZFi1aqG7d\nuoqPj1d8fLx69OiRbeveuXOnunXrpnr16qlt27Zp/jjvyJEjGjFihJo3b65GjRpp+PDhOnbsWKrL\nr1mzRldddZXi4+PVsWNHrV692v2tcePGWrt2rSpUqJDmZwEAAAAAAAAAAAByCj8IBAAAAAAAAAAA\nwHHj6NGjGjFihOrVq5fmcgkJCXrzzTe1atUqffzxx0pMTNSzzz6b6vJ33XWXGjZsqFWrVum1117T\n9OnTtXjx4lSXj4uL05o1a7R27VqtWbNGDRo0yJZ6JyYm6uabb1bjxo21fPlyLV26VB06dMiWes+f\nP1+zZs3S9OnTtXLlStWrV0/33HNPmvV56aWXtGbNGq1Zs0aTJk1Kdblw133XXXepVq1aWrlypQYM\nGKD+/ftr9+7dIZedMGGCNm7cqPnz52vBggXasGGDxo8fH3LZvXv3qm/fvurVq5dWr16tHj16qE+f\nPtq/f3/QcsnJyWl+bgAAAAAAAAAAACCn8INAAAAAAAAAAAAAHDcmT56sZs2a6eyzz05zubJly6pk\nyZKSpKSkJJ1wwgn6+eefU13+l19+Ufv27SVJlSpVUkJCgjZv3pzr9Z41a5bKli2rG2+8UYULF1Zs\nbKyqVq2aLfXeuXOnEhISVLFiRRUoUEAdOnTQ1q1b06xPRn84F866f/rpJ23cuFG33367YmNj1bp1\na1WtWlUfffRRyOUXL16srl276qSTTtIpp5yirl276t133w257Nq1a1WmTBm1bt3a1eOUU05Jdd0A\nAAAAAAAAAABAbuMHgQAAAAAAAAAAADgu7Ny5UzNnzlS/fv0ytPzq1atVv359JSQk6KOPPlL37t1T\nXbZbt26aPXu2jh49qh9++EHr1q1T06ZNU11+48aNaty4sdq0aaNx48YpKSkpW+r91VdfqUKFCurV\nq5fOP/98devWTd9//3221Ltdu3batm2bfvrpJyUmJmrmzJm64IIL0qzPoEGD1KRJE/Xo0UObNm1K\ndblw1r1lyxZVqlRJRYsWdbHq1aun+kPG5OTkoB8mJiUl6bffftOBAwfSXdZk5487AQAAAAAAAAAA\ngKyIyesKAAAAAAAAAAAAALnhscce04ABA1SkSJEMLZ+QkKBVq1Zp165devvtt1W+fPlUl73ooot0\n7733avLkyUpKSlK/fv1Uq1atkMs2aNBA7733nipWrKjNmzdrwIABiomJUe/evbNc799//10rVqzQ\niy++qPPPP19TpkxR3759tWDBAsXEpLw1GE69y5Qpo4SEBLVp00YxMTEqV66cpkyZkmpdRo8erVq1\naik5OVlTpkxRz549tWDBAhUvXjxL6z548KBOOumkoFjx4sW1a9eukMtfcMEFmjp1qho2bKhjx47p\n9ddflyQdPnw4RV3i4uK0a9cuzZ8/X61bt9a8efP0888/69ChQ6l+TgAAAAAAAAAAACA3kSEQAAAA\nAAAAAAAA+d6iRYt08OBBtWnTJuzXnnbaaWrevLkGDhwY8u979+5Vz549ddttt+nrr7/WkiVL9Mkn\nn2j69Okhlz/99NNVsWJFSVKVKlXUr18/ffjhh9lS78KFCyshIUHNmjVTTEyMevTooT179mjr1q1Z\nrvfYsWP1zTffaNmyZVq/fr369eunbt266d9//w25fFxcnGJjY1W4cGH17t1bJ510klatWpXldRcr\nVixFdr+DBw+qWLFiIdfdp08f1axZU5dffrmuu+46tWrVSjExMSpdunSKZUuWLKlx48Zp8uTJatq0\nqT799FM1adJE5cqVC7luAAAAAAAAAAAAILfxg0AAAAAAAAAAAADke1988YU2bNigZs2aqVmzZpo/\nf76mTJmifv36Zej1iYmJ2r59e8i/bd++XTExMerQoYMKFiyosmXLqm3btlq6dGmG65ecnJwt9a5W\nrZoKFCiQofcMt97fffed2rZtq9NOO00FCxbUFVdcoX379mnLli0Zer8CBQqk+jnDWfe5556r7du3\n659//nGxTZs2qUqVKiHXXbhwYT344INatmyZFi5cqBIlSqhWrVqpbqf69etrxowZWrFihZ588kn9\n+OOPqlOnToY+IwAAAAAAAAAAAJDT+EEgAAAAAAAAAAAA8r0BAwboww8/1Jw5czRnzhy1aNFCV199\ntR5//PGQy8+bN0+//vqrJGnnzp167rnn1Lhx45DLnnXWWUpOTtb777+v5ORk/fHHH/rggw9Uo0aN\nkMsvW7ZMf/31lyRp69atGj9+vFq1apUt9e7QoYPWrVun5cuXKykpSa+++qpKlSqlypUrZ7netWvX\n1oIFC/TXX38pOTlZs2fP1tGjR3XmmWemWPbXX3/VmjVrlJiYqCNHjmjixInas2eP4uPjs7zus846\nSzVq1NDYsWN15MgRLVy4UN9//71at24dct2///67du3aJUn66quvNH78eN1xxx0hl5Wkb7/9VkeP\nHtWBAwc0cuRIlStXTk2bNk11eQAAAAAAAAAAACA3xeR1BQAAAAAAAAAAAICcVrRoURUtWtT9/8QT\nT1SRIkV08sknh1x+y5YtGjVqlPbt26cSJUrowgsv1MCBA0MuW7x4cT3//PN66qmnNGzYMBUuXFgt\nWrTQrbfeGnL55cuXa/Dgwfrnn3906qmnqmPHjrrllluypd5nn322nnrqKT300EP6+++/VbNmTY0f\nP14xMSlvC4Zb7969e2v37t3q2LGjDh8+rDPOOENjx45V8eLFUyx78OBBDRs2TNu3b1fhwoVVo0YN\nTZw4USVKlMjyuiXp6aef1r333qsGDRqoQoUKGjNmjE455ZSQy27fvl333HOPdu/erXLlymnQoEGp\n/rhTkiZOnKilS5eqQIECat68ucaOHZvqsgAAAAAAAAAAAEBuK5CcnJyc15UAAAAAAAAAAAAAgEi3\nfPly9e/fX0ePHtVLL72khg0b5nWVAAAAAAAAAAAAcJzhB4EAAAAAAAAAAAAAAAAAAAAAAAAAAESB\ngnldAQAAAAAAAAAAAAAAAAAAAAAAAAAAkD5+EAgAAAAAAAAAAAAAAAAAAAAAAAAAQBSIycs3T0hI\n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\n4X9me37fb5fYuLI9Y348sOPHf/bannf094dQ46RZeT7HX489z/TPP/+EtY5QuDMNAAAAAAAAAAAA\nAAAAAAAAAAAAAEAU4AeBAAAAAAAAAAAAAAAAAAAAAAAAAABEgQLJeZhPOiEhIVtSsVaoUEGS1K9f\nPxcbOHCgKxcqVCjV1/of/91335Uk1apVy8Vq1KiRYrnXX39dknTTTTdlpdo5pnTp0q48ceJESVK7\ndu1c7IQTTgh7nfb5Dx8+7GKWZvnpp5/OVD0jRcGCBUOWLe37yJEjXcxSgx49etTFLCXzBx98kKP1\nzCm2P/hpT6+++mpJwfuNHWeStH79eknS33//7WLvv/++pOB0xeecc44kaezYsS5m+9JHH33kYpde\nemkWP0X0KVy4sKTg48dSM//6668u1rJlS0nS5s2bc7F22efiiy92ZUtb76eZtti///6b6ffwz/EL\nFiyQFEhhLAXvX5bqOlK9+eabrty5c2dJodML+9ckS908bNgwF7PX3HXXXS5Wt27dFK+97LLLXNm2\nXV7p0aOHK/vfWZcuXSRJiYmJKV7jp2a2tOl2fspvypcvL0l65ZVXXKxVq1apLr9v3z5X/v333zP0\nHqGahBUrVpQkFStWLORrtm/fLkk6++yzM/QeecnSfE+bNs3FOnbsKEkaPny4iz388MO5W7EIcMst\nt0iSxowZ42IffvihJGnDhg0uNnjw4NytWISyNt9//vMfFxs9erQk6cknn3Sxv/76K3crls3sM0lS\ngwYNJAW3F01MTIwrz5w5U5J08OBBF7PzeH5QvXp1SdI333zjYnbunDNnjotVrVpVUnD7xl7rX7uS\nkpIkSUOGDHExv+9xvGjUqJGk4HPxvffeK0n66quv8qROucX6BJI0b948SYH2f2psn7O+viTdeuut\nOVC7yNawYUNJ0qBBg1zsoosukiSVKlUqxfK//fabK5crV05ScL/k888/d+WdO3dKkr744ovsq3Am\n+Z9l2bJlkgLnEyl0XyE7+O1Cv1yyZElJwef5SHXNNddICm6/1K5dO8Vyv/zyiySpdevWLmZ98r17\n92b4/UqUKCEp+LjetWtXGDVO39y5cyUF95eOHTvmylZvO4dK0gMPPCAp0F+SpNjYWEnB+4+VU/vu\n/5cdJ5L0yCOPSJJmzZrlYv54UV7xr7nWP0qvf23X+G3btrnY4sWLU7zWzjf+a5966ilJ0meffZbV\nquc5O27su5UCx1TNmjVd7JlnnpEkHThwIBdrl/vuvPNOV7Y2sn+NaNy4saTg/cEfY0awNm3aSJLe\neOMNFzv55JMlBR9n1la2v0nSoUOHcqOKecbGOKtVq+Zi1sf0r1MvvPCCJOmOO+7IxdplH79fOXv2\nbEnB33Ooa9IPP/wgSfrzzz9dzMY6/WuvmTBhgivffvvtruxfN/PaiSee6Moff/yxpEDfSApsh6VL\nl7rYH3/8kWI9lStXliTFxcW5mG27jRs3utiMGTMkBZ/bo9X5558vKXAsSKHHvk16138rz58/38X6\n9Onjyv79mkjk37uzseNLLrnExWxc2W/Dd+3aVVLwPjdixAhJ0qZNm1ws1PH1/fffu7JtO3+MLJLu\nZdm1RMq5vpPP369sjDkaxprtvHD//fen+Jv/mayd699/i3aVKlVy5VWrVkkKfs7C+Nvh0UcflRR8\nn9vGtPx7ohnlr3vHjh2SouN+C/6ftW398QYbq7J7UlJw/zQtodpBofh9bjvnr127NkPvEans+i5J\nn376aarL+edz205+Gy/UWMfpp5/uYhm9Z5rd/Guq3b+/4YYbXMzuKWT08b1Q28Fn133/GSZ/DDmc\nMa+8Zs8u+ePhoY6prFzr/W24e/duSVKzZs1c7Lvvvsv0urPbE0884cr2XGR67d1rr71WUuCZyMyy\ndqd//TR+GzASxgVDsfOyXz87Nv12o41x+sdoVp5nym0///yzK9v5L6PjVP6+NGrUKEnSgAEDXOzM\nM8+UFGizHA/s/sFpp50W9mszel33n0H177ubFStWSAp+zuXFF1+UFLzv5ga7DyIFxpD9+3TG/8w3\n33yzJGnq1KkplvPHwKpUqeLKNj7/9ddfZ7HGkeeKK65wZetb+NvBzjd2X0KSevbs6cr+/c7jgT8u\n1qRJE0nBz+HY/WIp+PwXzfzndGz81z+m7PO3bdvWxawvsHLlShfzX+Nvp0hnx8g777zjYvZZ/O/e\nPr8fs21nz/NLgfFUe77RX58UPDaW1+655x5XfuyxxyRJS5YscTF79sofI88ouyb5bWobH/SfH7Zn\nBfOrXr16SQo+zmyc3v89kF1z/fuD/r5i7eto0LRpU0nSf//7XxezZwX8Y8GeV/KPn/zIfwbafrtg\nfU5fTo4l+9vd7o39888/Yb/2f3FnGgAAAAAAAAAAAAAAAAAAAAAAAACAKJByWoko9Pzzz0uSOnTo\n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\nMWu/+bV9cfNSVdGll14aytbXiVvX7K8d1o71a47r1KkjKXpOxf2tzQn7ebEksUy7np8vilubaJmn\n/HyXjWH4TNyWaciPnSaVX69p4toZFvP366SvFfDv3frD/hywdTJ+zGrOnDlZPfebb76ZFrNrmZ8D\n84o1m6udKwMGDAixa6+9VlL08/D9zkzsGPLrDWx9ZPfu3UPs7rvvDmW/ZimJ2rdvLymaIdD88MMP\noWxjGS+//HKIWV//vPPOCzG/hrYY5rczOeaYY0LZrqP++x1xmQHt2PCZEOO+J5L09Y6WlV6SlixZ\nIimV9VBKfcfDt/Osz+3nZeyz8d+pSkJmQOOzhdvxYMe9JK222mol/q2/X1lGSb8GIFv+2l/Za22K\n80oPAAAAAAAAAAAAAAAAAAAAAAAAAAAi+EIgAAAAAAAAAAAAAAAAAAAAAAAAAAAJ8K//VnYOwgya\nNGkSUh9nq2bNmpJS6SklaauttpIUTafoUy9bKu+dd945xOJS59rfZ0oDWRqfbtanV910000lpVJo\nStLqq69e7teJs+uuu0qSnnzyyRCLS73sPydLB7ps2bKsXsPX2adNN3FpneP4Olia38GDB4dYPlKu\nrrrqqpKkzz77LMQs5b0knXrqqZKiaWRzrXnz5pKkl156KcTGjBkTyqeffnqlvXYmliZ63XXXDbGj\njjoqlNdee21JUtOmTUOsUaNGkqQGDRqEWNzxEHfJsf9BXDrZLbbYIpR//fXXUO7Xr5+kyv3/VCZ7\nX/74s+uDXdMk6ZtvvslvxbJ07733SpIOOeSQEOvcubMk6dlnn620173xxhtD+aSTTpIkrbHGGiH2\n+eefS4qmfL7gggtC+bXXXqu0upn1119fUvRzaNiwoSRp0qRJIWbnvySttdZaac9j19i4tO3jx48P\n5a5du0qSTjvttBC75ppr0v7G0qI/9dRTWbyLqsVfi+yes99++4VYy5YtJUWvMcXG7r/WppGkcePG\nSZL22GOPjH9r79+3QX777TdJ0XPq5ptvliR9+eWXOahx/vXp0yeU7RywlPeSdNhhh+W9TiXx90q7\nzi9evLhQ1QnX0RNOOCHEzjzzTEnSLrvskvb40roP7777rqT/t/XN33//XeF6FlL//v1D+aOPPpIk\nTZw4sVDVSbzttttOkjRt2rQQmzFjhiSpQ4cOBalTWYwePTqU/f3XLFq0SFL0ml0Rr7/+uqTo+di7\nd+9Qvu6663LyOvmw5pprSpIeeOCBELNrypFHHhlif/zxR34rlmOtW7cOZWv/xbXpKsJfi7///ntJ\nUqtWrULsvffey+nrVYZ27dpJkoYNGxZi22yzjaTo+7PxFDu3JKlWrVqSpBdeeCHEdtxxx7TXsPNw\n4cKFuap2XvkxmH322UdS6h5dmtq1a4ey73uYuPu5tRv97y655JJQvvLKKyXl/77+yCOPhHLbtm0l\nST/99FOIbb/99pKkH374IcSsrn379s343EuXLpUkzZw5M8R8X2FF/rPxn8OECRMkSWPHjg2x5557\nLuNr55Pvi7Zo0UJSdJwnrp948MEHS5Ief/zxELP3P2TIkBC79NJLc1vZStS4ceNQfuihhyRFx3Lt\n/dl4qSRddNFFkqJ9Jxsv831v65t79nx+jPjAAw8M5bhxsCTZcMMNJUmvvPJKiNWtW1eS1KNHjxC7\n5ZZb8luxHOvSpUso23iMvxZYu8zGxSRpzz33LNNr2DVEiraJks7Gonzbz+41e+21V4j5azCibZrL\nL79ckjRixIgQmzp1at7rlE/VqlWTJD3//PMhZm2ZV199NS2G8rv++utD2a7pRx99dKGqk3M29uDv\nU+utt56k6HXc5pqGDh2ax9qVj7/X2ByNny8v6/0nTr169ULZxgrjxj6kVB907ty5FX7dJPDzDHaN\nsrmFFdlYvM1FF5LNT0mptrvdo3PFn1N2zl1xxRUh9uKLL4Zy0sd8rO3nrxmZxsv9PK/1BZJwzli/\nUUrNHdl1VYqfd7L/vf889t5777SY9d39OoOkzkuVVfXq1UPZ5qx32GGHELPPya/dsXUZVZXN2/bs\n2TPE4sanrE/evXv3PNYud/w4ip1Ljz32WIjZfT1XrE1t46qS9Oijj4ayre3xbJzLz3/4/0sSWVvG\nj9cZf3x16tQplP3nVCi2hsivlSoU/znZ2P0XX3xRqOpk5I/3W2+9VZL04YcfhtiAAQMkxY/H+Tab\njQP99ddfIWbHRT7WMhYLuxZPnz49xKy/4Y8Lu4f7fkQSXHjhhZKi8x927fRzD7YuwLdhbRzv7rvv\nDjGbZ6gKrL3i1+LZ+jx/Dtj798eDjdvstNNOIWa/9+09O5YWLFiQy6pXOvtM/JzJ/vvvL0k644wz\nQsyv/V2R71fadcZ/hh9//LGkaD8uqWz+188V2HXZzi0ptZbLH1/Wn7zqqqsqvZ6Vwa/5vummmyRF\n+052z7I5/vKwuVFJuuyyyyRF18X5Y83GmAcNGlTu18sXG6OsyGfj+1B2XfLn1O677x7Ks2bNKvfr\nFIpfJ/r0009Liu83+jb/nDlz0n5va7P8Neudd94JZVsXXqztn4cffjiUbX2iXy8TN/Zi7Ww/N3zM\nMcdIiq7HropsTbuUWrfl78N2PPi1kDZf7r9HknT++w7WHvTjUxX5/pjx93W/Hvg///mPpOga1Io8\n94rIEAgAAAAAAAAAAAAAAAAAAAAAAAAAQAJUK3QFyuqXX36RJA0cODDE7Bvu/lu7PjOe7Zxgu72U\nxu+27nc/yobfCXCDDTYIZftWZlmfryws2+Ipp5wSYvaNUr9zkP/2v30zPNudxbLNAFiW57GMPv4b\n2/nI4mU7XN1zzz0h5r/x7+uTS36Hf8tc5ncluvjiiyvldUtiO+keeuihIWY70VnGhrIo7RiJ+339\n+vWzem6fRc0ySiY1Q6DfAdDYjkJJyKJkO4r4HbwrMzOg8Tvy247p/piy3UFuuOGGEMvH9cSzLCV+\nxyPb7cauySXx78WyUvjz8OSTT5YU3S3edijwmSWN37VvZcwMaPzOCNYWsAxmUure7XdiLDa2M5TP\nVtKsWTNJ0WuG7Vbisx3aceUzS9luNz6D5tlnny0puqt0t27dJKXaUsXM79houxv5e27cjqL54HdJ\nOe+88yRFsxna9eG2227LS30sE4zfGcraAnXq1MnqOUrLAGzZDGz3Xym6C3SSWIZx2/VSSu57qYht\nt91WUu6uBdZP8v0l69MlweTJk0O5TZs2kqL9LcvK5TOXWaYq67NJmXc18/0zazfGtXmSxjIv+Gwe\nlmkg6TvEez4bYK760Maut37XaMtQlYSsgJbZT5KuvvpqSdLWW28dYvb+jjvuuBD77rvvJEk1atQI\nMctqEJcV0O9i57MKJtHy5ctDecqUKZGfJbH2ou1KKsVn0Ml0P7///vtDzK5fUn77qv48isuq4Xdy\ntuwCTz75ZIhZ5gX/Pu39+Ta17RTesWPHtNfw7Rvbnd/vGOzHI+w4LTbWh/SZuOzzKq2PaFnt/P3M\n+k5J3Qnw7bffDuUDDjhAkvTJJ5+EmB0v/j5sx9J9990XYrZLtO9zb7zxxpKk9u3bpz2fPwdznTG2\nkOz9+fdkWUGSnhWwNP7aMnz48BJ/H7dD9uabbx5ivlwV2ZiW/7zsnPPnHqJsfEZKHSNVPSugV7Nm\nTUnRe5fJdeaUlZGfY7F2ghTN5JlkPoPBuHHjJKWyAkqpe5bv1ychM2Amud69etSoUaHsd0w2Pgth\nobOc7bvvvrHxyrpm+vu69bf8Dv9erscCKsLPQVvGG9/Hsrr6zOw23uXZ+/fj2NY/8tna7TNJwlxn\neWQ7v2CP8xnCC33OlIXPcm59aNst3vNZKb766itJ0Xkny5bj112ceOKJua1sAtg558esqkLWl/Jq\n3bp1KFvGobjxGz8GXpnrrPLBMitIqWx0fixq1113lSTNnj07xHzmqbKyLEUjR44MsdLm9uwzTnpW\nwPLwmYuKIUPgwQcfLEmaNm1aiPn5tEIp1syAZv78+aHctm3bMv2tb7d07dpVUrRP2qBBA0mprDIr\nA7s++CxEFvOZ5W3MdN68eSGWhGyBNj9l/1spNVfgM+j4929sjNzWLUqptca+TZ1U1n7zWQ9HjBhR\n4uP98WBzdv7+YnM5PtNb0jIDmrp160qKzr+ZuOxbcUrrTxRTX7I8DjrooFC2+6t/T3Yc+DE+m9vz\nbUSbB/afaxLOL8tS5rNDWzvQz7eWda2H/y6EZRz0/bO4+QifDdDW0BWrY489Ni1m43rl4dveNuft\nM40nda3NbrvtJim6LtrmM7/99tsQO+eccySVfl2yc8rP8VmWZSl17ff9g2JY07PPPvtIio5b2piD\nH3ex7yT4a4d9x8iv4X7wwQcrr7JFxGdAjuPXkVZlfj2JrZWw/peUWisdNy4ex1937dpjmTulaBvK\n5okrS9VZgQAAAAAAAAAAAAAAAAAAAAAAAAAAQBXGFwIBAAAAAAAAAAAAAAAAAAAAAAAAAEiAaoWu\nQHlZKlcplapy8803D7Fq1VJvbeutt5Yk3XPPPRmf01LnWlpwKZU29cMPP0x7nKX4lVIpIy0F+Ios\nVaqlmKxMPqXl7NmzJUlbbLFF7GPLmmbaPz4uhbXFXn755bS/adGiRU7qkGv9+/fP6+vtsMMOoXzo\noYdKiqbaXbRoUaXXYaeddgplS5dbo0aNEPvhhx8kSXfffXfa4yRp1qxZkqL/u2233VaSNHny5BCL\nS0d99tlnS5LefvvtEPv5558lRdNbt2rVSlL0eJ4/f34oL168OON7LHYDBgyQFP1sJk2aJElasGBB\nQepUmmbNmoXyaqutJkmaNm1aXl7bjo2JEyeG2HrrrSdJatu2bYjl4xobp3HjxqHcoEEDSdLy5ctD\n7Iknnsjqefzx8Pzzz0d+StKLL74oSXrooYdCbKuttkp7nquuukqSNGbMmKxed2WydOlSSdF04E2b\nNpUkPfbYYwWpUzYsDbW/X5gePXqE8k033VTic6y77rppz3f00UeHmN2fWrZsGWIffPCBpOg94N57\n7w1l/zkW2ieffBLKb731liSpdevWIdapUydJ0etIru23336h3KtXL0nS7rvvHmK1a9dOq0NlfoZ2\nb7/55ptDrEuXLpLi21+ltcnsGvXCCy+EmL3nBx54IMSsbNesJLN733HHHRdit912W6Gqk1fWVpFS\n7fg2bdpU2uv5dl6x89fE77//XlL88b733nuHsn2GX331VdrfxqlevXoob7fddpLi+19JUL9+/VC2\nvsCll14aYv7zrCqsHy5JU6ZMkZS6B3i+TzNhwgRJ0pAhQ0LM37tXdOqpp4byn3/+Wf7K5pm/16yy\nyippsbgxBXPCCSeE8hlnnJH2t++8844k6YILLkh7vqqqVq1akqTTTz89xC666CJJ0etIJv4zsn7G\nxRdfHGJ///13hetZHptttlkox40n+fPjlltukSTtsssuIZaprePbMnYc/vPPPyFmn8kbb7wRYsce\ne6wk6dNPPy3Duyi8QYMGSZLWWWedEBs1alRWf/vbb7+lPd73FZLOxt98f93GF/zx065dO0nSyJEj\nQ+yss86SJC1ZsiTE/BjAigo99llZ7B5fr169EBs7dmyBalN57B4tSUcccYQkqXPnzmmP8+08O15G\njBgRYnYcjB8/Pu35qpLtt98+lK0f7s+Pvn37SpJ+/PHH/FYsAWyMxto5UnTcc2VhY6tx18777rsv\n39WpcqytKEX7pL4NnWQ25imlxux9e9f6DF27ds1vxXLEt3eN7xv69ko2/NiwzZX667h9dnPnzg2x\njz/+uEyvURmsTernTjyrt+9f27jN1KlTc1KHfffdNyfPk2/W7/H9HzNjxoxQtjFAf/4sW7ZMUnRs\ntFjnMyuTja9nO95QFcYlrO9kfe+S2Bi6jVVIqTUFJ554YiXVLhnOOeccSdF+RFXtJ2ZiYz2+TVez\nZs0SH9+zZ89QtvnKpLrmmmtC2daZWX9Jknr37i0pen3O1L8ubd1W3ON82V7H908L1Z/34+Z16tSR\nlLp2VFS3bt3SYvZ5/frrryE2evTonLxernz00UeSpH79+oWYje3ZGhkpOoZr7LMbN25ciNnfxD0e\n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\nBbN06dJQtrbfH3/8EWIdOnSQFP0catWqVeLzffnll6F88MEHS5LmzJmTm8rmifXJ7biQpEcffbRQ\n1UGR8OfKwoULJUX7kJtssknkp+fPKbuO3HXXXZVSz3zx7z1XrM3j2y2XX365pOh1JEn39QULFoTy\npZdeGvmJzM444wxJ0bEHuzf7/nrfvn0lSU888USI+XPOVPVxnmuuuUZSasxGknr37i0p1W+XpEaN\nGklKjWmUxvdB/vzzzwrXs1j4voKxPutVV12V7+okxldffZXx9998802eapJbdj5sscUWab+rSu3+\nXFljjTUkSQMHDgyxN998U1JxzSUVkr/n1KxZU1L0uvv333/nvU6V5cQTT5QkDR8+PMRsPLki1lxz\nzVAeNmyYpOi8X1L7Z9WrV5cUvTfbuIWNCUrS9OnTJUn33XdfiO26666SpLfeeqvS65krP/74Yyj7\nOegNNthAkvTvf/87xKyN4nXq1CktNmPGDEnSCy+8EGLWZ1i+fHkFa5w/vv5x7VQ/vh4nF/0x/7p+\nnDiJfP8gjn1eTZs2zfg462smtT1o/SVJuvjii9N+b//zH374IcRGjRolSRoyZEja46q6ww47LJTt\nc+jTp0+hqlMwe+65ZygfddRRab8v6/XmnnvuqXCdipk/P+w+d/bZZ4fY77//nvc6Fdqrr75art8l\nzYEHHhjKdt7ErS+67rrrQszGk+vWrZvVa8Q9nx/j6t69u6Sq9bmWxrchTab7lG8rP/3005VSp0Ly\n83QdO3aUlFrPJ1WtsbuK+PrrryVJm2++ecbH2bnpj6kknV+vv/56KLdp00ZS9D7cokWLyM+SPP74\n45VQu+JWv379rB43fvx4San+uCR99tlnlVKnymZjdoMHDw4xW7/n++N+vfCK/Brsq6++WlLVGjvd\nb7/9Qvnwww+XFJ3P23vvvSVJ++yzT4jZ9aO0Ncf2ez/X+fLLL+ei2jlj9fHXjJtvvllSdMzK3ot/\nn3Hvb/LkyZKi34X4/vvvc13tomJrs+z7HZJ04YUXSkpdp6XUNcWvCbXPOC7m19rOmjUr19WuNCNH\njgxlu+fa2mTPryFt2LChJOnUU08NsVNOOSWr1yvWtf9+rdo666wjKbWOWkqtn/Zjc88991x+KldF\n2JrRuDm+YnX00UeHsj/e42Qal/HHuq0p92u0bV1TXL+qmJAhEAAAAAAAAAAAAAAAAAAAAAAAAACA\n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\nAAAAAAAAAAAAAAAAAACQAHwhEAAAAAAAAAAAAAAAAAAAAAAAAACABOALgQAAAAAAAAAAAAAAAAAA\nAAAAAAAAJABfCAQAAAAAAAAAAAAAAAAAAAAAAAAAIAH4QiAAAAAAAAAAAAAAAAAAAAAAAAAAAAnA\nFwIBAAAAAAAAAAAAAAAAAAAAAAAAAEgAvhAIAAAAAAAAAAAAAAAAAAAAAAAAAEAC8IVAAAAAAAAA\nAAAAAAAAAAAAAAAAAAASgC8EAgAAAAAAAAAAAAAAAAAAAAAAAACQAHwhEAAAAAAAAAAAAAAAAAAA\nAAAAAACABOALgQAAAAAAAAAAAAAAAAAAAAAAAAAAJABfCAQAAAAAAAAAAAAAAAAAAAAAAAAAIAH4\nQiAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAFwIBAAAAAAAAAAAAAAAAAAAAAAAAAEgAvhAIAAAAAAAA\nAAAAAAAAAAAAAAAAAEAC8IVAAAAAAAAAAAAAAAAAAAAAAAAAAAASgC8EAgAAAAAAAAAAAAAAAAAA\nAAAAAACQAHwhEAAAAAAAAAAAAAAAAAAAAAAAAACABOALgQAAAAAAAAAAAAAAAAAAAAAAAAAAJABf\nCAQAAAAAAAAAAAAAAAAAAAAAAAAAIAH4QiAAAAAAAAAAAAAAAAAAAAAAAAAAAAnwP6JPopE1l8ED\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "decision = tf.argmax(bnn_predicted_log_probs, axis=-1, output_type=tf.int32)\n", "confidence = tf.reduce_max(bnn_predicted_log_probs, axis=-1)\n", "threshold = 0.95\n", "\n", "decided_idx = tf.where(confidence > np.log(threshold))\n", "ordered = tf.argsort(confidence)\n", "\n", "n = datasets_info.splits['test'].num_examples\n", "x_final, y_final = next(iter(eval_dataset.batch(n)))\n", "\n", "print('Number of examples undecided: {}'.format(n - tf.size(decided_idx)))\n", "\n", "accurary = tf.reduce_mean(\n", " tf.cast(tf.equal(tf.gather(y_final, decided_idx),\n", " tf.gather(decision, decided_idx)),\n", " tf.float32))\n", "print('Accurary after excluding undecided ones: {}'.format(accurary))\n", "\n", "tfp_nn.util.display_imgs(\n", " tf.gather(x_final, ordered[0:50]),\n", " tf.gather(y_final, ordered[0:50]));" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "height": 201 }, "colab_type": "code", "id": "zedk947YWucS", "outputId": "8b402bee-2cfc-4834-d265-f5b4d914c089" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Per class AUC:\n", "[[0.99994366]\n", " [0.99992725]\n", " [0.99974284]\n", " [0.99959576]\n", " [0.99985348]\n", " [0.99967074]\n", " [0.99962562]\n", " [0.99963218]\n", " [0.99862774]\n", " [0.99943871]]\n" ] } ], "source": [ "from sklearn import metrics\n", "bnn_auc = np.array([\n", " metrics.roc_auc_score(tf.equal(y_final, i), bnn_predicted_log_probs[:, i])\n", " for i in range(10)])\n", "print('Per class AUC:\\n{}'.format(bnn_auc[:, np.newaxis]))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "a_LR5N47a1ce" }, "source": [ "### 6 Appendix: Compare against DNN" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "height": 168 }, "colab_type": "code", "id": "xaE5mdj5a4Xj", "outputId": "ff109c96-a8f3-4efa-e65f-5bb20c70c9f9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== DNN ==================================================\n", " SIZE SHAPE TRAIN NAME \n", " 8 [8] True bias:0 \n", " 200 [5, 5, 1, 8] True kernel:0 \n", " 16 [16] True bias:0 \n", " 3200 [5, 5, 8, 16] True kernel:0 \n", " 10 [10] True bias:0 \n", " 7840 [784, 10] True kernel:0 \n", "trainable size: 11274 / 0.043 MiB / {float32: 11274}\n" ] } ], "source": [ "max_pool = tf.keras.layers.MaxPooling2D( # Has no tf.Variables.\n", " pool_size=(2, 2),\n", " strides=(2, 2),\n", " padding='SAME',\n", " data_format='channels_last')\n", "\n", "dnn = tfp_nn.Sequential([\n", " tfp_nn.Convolution(\n", " input_size=1,\n", " output_size=8,\n", " filter_shape=5,\n", " padding='SAME',\n", " name='conv1'),\n", " tf.nn.leaky_relu,\n", " max_pool, # [28, 28, 8] -> [14, 14, 8]\n", " tfp_nn.Convolution(\n", " input_size=8,\n", " output_size=16,\n", " filter_shape=5,\n", " padding='SAME',\n", " name='conv2'),\n", " tf.nn.leaky_relu,\n", " max_pool, # [14, 14, 16] -> [7, 7, 16]\n", " tfp_nn.util.flatten_rightmost,\n", " tfp_nn.Affine(\n", " input_size=7 * 7 * 16,\n", " output_size=10,\n", " name='affine1'),\n", " lambda x: tfd.Categorical(logits=x, dtype=tf.int32), \n", "], name='DNN')\n", "\n", "print(dnn.summary())" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "9RWP0V2KbMdP" }, "outputs": [], "source": [ "train_iter = iter(train_dataset)\n", "eval_iter = iter(eval_dataset.batch(2000).repeat())\n", "\n", "def loss():\n", " x, y = next(train_iter)\n", " return -tf.reduce_mean(dnn(x).log_prob(y), axis=-1), None\n", "\n", "opt = tf.optimizers.Adam(learning_rate=1e-2)\n", " \n", "fit = tfp_nn.util.make_fit_op(\n", " loss,\n", " opt,\n", " dnn.trainable_variables,\n", " grad_summary_fn=lambda gs: tf.nest.map_structure(tf.norm, gs))\n", "\n", "@tf.function(autograph=False)\n", "def eval():\n", " with tf.xla.experimental.jit_scope(compile_ops=True):\n", " x, y = next(eval_iter)\n", " yhat = dnn(x)\n", " nll = -tf.reduce_mean(yhat.log_prob(y), axis=-1)\n", " acc = tf.reduce_mean(tf.cast(tf.equal(y, yhat.mode()), tf.float32), axis=-1)\n", " return nll, acc" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "code", "colab": { "height": 1000 }, "colab_type": "code", "id": "i5CCUIKXbQ0n", "outputId": "3bb4bd3b-4565-435a-9f71-0257d3101aa9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "it: 1 ms/it:947.1798 tst_acc:0.2020 trn_loss:2.4360 tst_loss:2.2867 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.2128\n", "it: 101 ms/it:1.8313 tst_acc:0.9485 trn_loss:0.0494 tst_loss:0.1961 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.5276\n", "it: 201 ms/it:1.8815 tst_acc:0.9515 trn_loss:0.0971 tst_loss:0.1553 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.6970\n", "it: 301 ms/it:1.8873 tst_acc:0.9595 trn_loss:0.0675 tst_loss:0.1329 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.6763\n", "it: 401 ms/it:1.9162 tst_acc:0.9590 trn_loss:0.0372 tst_loss:0.1261 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.1034\n", "it: 501 ms/it:1.8792 tst_acc:0.9565 trn_loss:0.2008 tst_loss:0.1358 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.5304\n", "it: 601 ms/it:1.8019 tst_acc:0.9670 trn_loss:0.1382 tst_loss:0.0962 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.8372\n", "it: 701 ms/it:1.8842 tst_acc:0.9595 trn_loss:0.1764 tst_loss:0.1383 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.3745\n", "it: 801 ms/it:1.7390 tst_acc:0.9735 trn_loss:0.1286 tst_loss:0.0840 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.1147\n", "it: 901 ms/it:1.9072 tst_acc:0.9845 trn_loss:0.0826 tst_loss:0.0450 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.0499\n", "it: 1001 ms/it:1.9544 tst_acc:0.9670 trn_loss:0.3418 tst_loss:0.1032 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.6575\n", "it: 1101 ms/it:1.9279 tst_acc:0.9745 trn_loss:0.2445 tst_loss:0.0854 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.6256\n", "it: 1201 ms/it:1.8666 tst_acc:0.9740 trn_loss:0.1481 tst_loss:0.0832 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.9186\n", "it: 1301 ms/it:1.9622 tst_acc:0.9770 trn_loss:0.1692 tst_loss:0.0729 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.6448\n", "it: 1401 ms/it:1.8534 tst_acc:0.9785 trn_loss:0.0597 tst_loss:0.1007 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.5306\n", "it: 1501 ms/it:1.9520 tst_acc:0.9700 trn_loss:0.3685 tst_loss:0.0880 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.7521\n", "it: 1601 ms/it:1.9009 tst_acc:0.9775 trn_loss:0.4346 tst_loss:0.0606 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.2722\n", "it: 1701 ms/it:1.9912 tst_acc:0.9780 trn_loss:0.1151 tst_loss:0.0710 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.3924\n", "it: 1801 ms/it:1.8722 tst_acc:0.9755 trn_loss:0.0110 tst_loss:0.0782 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.3810\n", "it: 1901 ms/it:1.9005 tst_acc:0.9795 trn_loss:0.0059 tst_loss:0.0759 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2433\n", "it: 2001 ms/it:1.8488 tst_acc:0.9750 trn_loss:0.0583 tst_loss:0.0659 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.1850\n", "it: 2101 ms/it:1.9041 tst_acc:0.9670 trn_loss:0.0043 tst_loss:0.1234 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2029\n", "it: 2201 ms/it:1.8319 tst_acc:0.9645 trn_loss:0.0655 tst_loss:0.1298 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.9481\n", "it: 2301 ms/it:1.9331 tst_acc:0.9660 trn_loss:0.0004 tst_loss:0.1582 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0237\n", "it: 2401 ms/it:1.9130 tst_acc:0.9685 trn_loss:0.6777 tst_loss:0.1454 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.7664\n", "it: 2501 ms/it:1.9730 tst_acc:0.9660 trn_loss:0.1712 tst_loss:0.1015 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.4604\n", "it: 2601 ms/it:1.8234 tst_acc:0.9745 trn_loss:0.0069 tst_loss:0.1264 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.3191\n", "it: 2701 ms/it:1.8260 tst_acc:0.9625 trn_loss:0.0064 tst_loss:0.1271 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2002\n", "it: 2801 ms/it:1.8385 tst_acc:0.9750 trn_loss:0.2281 tst_loss:0.0854 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.8069\n", "it: 2901 ms/it:1.8029 tst_acc:0.9815 trn_loss:0.0291 tst_loss:0.0668 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.6005\n", "it: 3001 ms/it:1.8537 tst_acc:0.9610 trn_loss:0.2334 tst_loss:0.1418 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.1746\n", "it: 3101 ms/it:1.8889 tst_acc:0.9740 trn_loss:0.0018 tst_loss:0.1433 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0881\n", "it: 3201 ms/it:1.8358 tst_acc:0.9735 trn_loss:0.1684 tst_loss:0.1178 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.3806\n", "it: 3301 ms/it:1.9122 tst_acc:0.9745 trn_loss:0.0497 tst_loss:0.1153 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.1474\n", "it: 3401 ms/it:1.9089 tst_acc:0.9720 trn_loss:0.0006 tst_loss:0.0930 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0316\n", "it: 3501 ms/it:1.9271 tst_acc:0.9770 trn_loss:0.3862 tst_loss:0.0926 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.2212\n", "it: 3601 ms/it:1.8609 tst_acc:0.9780 trn_loss:0.0328 tst_loss:0.0887 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.1865\n", "it: 3701 ms/it:1.9096 tst_acc:0.9720 trn_loss:0.2323 tst_loss:0.1357 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.7994\n", "it: 3801 ms/it:1.8436 tst_acc:0.9785 trn_loss:0.0211 tst_loss:0.1066 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.2262\n", "it: 3901 ms/it:1.9345 tst_acc:0.9815 trn_loss:0.2188 tst_loss:0.0651 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.5738\n", "it: 4001 ms/it:1.9165 tst_acc:0.9730 trn_loss:0.1181 tst_loss:0.0939 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.1097\n", "it: 4101 ms/it:1.8918 tst_acc:0.9765 trn_loss:0.0021 tst_loss:0.1239 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2101\n", "it: 4201 ms/it:1.8934 tst_acc:0.9780 trn_loss:0.1797 tst_loss:0.1366 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.6820\n", "it: 4301 ms/it:1.9533 tst_acc:0.9760 trn_loss:0.0326 tst_loss:0.1189 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.5648\n", "it: 4401 ms/it:1.9542 tst_acc:0.9755 trn_loss:0.0188 tst_loss:0.0899 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.4059\n", "it: 4501 ms/it:1.9615 tst_acc:0.9770 trn_loss:0.0020 tst_loss:0.0911 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1239\n", "it: 4601 ms/it:1.8829 tst_acc:0.9740 trn_loss:0.0258 tst_loss:0.1248 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.3504\n", "it: 4701 ms/it:1.9402 tst_acc:0.9695 trn_loss:0.0004 tst_loss:0.1254 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0192\n", "it: 4801 ms/it:1.9671 tst_acc:0.9795 trn_loss:0.0648 tst_loss:0.1293 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.5944\n", "it: 4901 ms/it:1.9212 tst_acc:0.9795 trn_loss:0.0717 tst_loss:0.0998 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.1639\n", "it: 5001 ms/it:1.8767 tst_acc:0.9630 trn_loss:0.0079 tst_loss:0.1598 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.8263\n", "it: 5101 ms/it:1.8408 tst_acc:0.9730 trn_loss:0.1447 tst_loss:0.1446 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.1445\n", "it: 5201 ms/it:1.8568 tst_acc:0.9830 trn_loss:0.0450 tst_loss:0.0646 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.0922\n", "it: 5301 ms/it:1.8645 tst_acc:0.9810 trn_loss:0.0002 tst_loss:0.0877 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0133\n", "it: 5401 ms/it:2.0107 tst_acc:0.9715 trn_loss:0.0026 tst_loss:0.0888 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1400\n", "it: 5501 ms/it:1.9240 tst_acc:0.9740 trn_loss:0.0513 tst_loss:0.1046 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.0739\n", "it: 5601 ms/it:1.9938 tst_acc:0.9755 trn_loss:0.0002 tst_loss:0.0968 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0092\n", "it: 5701 ms/it:1.8752 tst_acc:0.9775 trn_loss:0.0002 tst_loss:0.0956 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0181\n", "it: 5801 ms/it:1.9496 tst_acc:0.9655 trn_loss:0.0488 tst_loss:0.1383 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.2051\n", "it: 5901 ms/it:1.9216 tst_acc:0.9385 trn_loss:0.0019 tst_loss:0.3988 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2937\n", "it: 6001 ms/it:1.9092 tst_acc:0.9735 trn_loss:0.3313 tst_loss:0.1342 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.1321\n", "it: 6101 ms/it:1.8636 tst_acc:0.9705 trn_loss:0.3192 tst_loss:0.2283 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.3080\n", "it: 6201 ms/it:1.9832 tst_acc:0.9725 trn_loss:0.5824 tst_loss:0.2525 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:7.1433\n", "it: 6301 ms/it:1.9989 tst_acc:0.9790 trn_loss:0.0720 tst_loss:0.0891 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.1926\n", "it: 6401 ms/it:2.0012 tst_acc:0.9745 trn_loss:0.0110 tst_loss:0.1168 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.1464\n", "it: 6501 ms/it:1.9625 tst_acc:0.9715 trn_loss:0.2354 tst_loss:0.1131 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.7642\n", "it: 6601 ms/it:1.8740 tst_acc:0.9795 trn_loss:0.0018 tst_loss:0.1038 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1598\n", "it: 6701 ms/it:1.9265 tst_acc:0.9785 trn_loss:0.0911 tst_loss:0.1080 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.6253\n", "it: 6801 ms/it:1.9781 tst_acc:0.9655 trn_loss:0.0008 tst_loss:0.1389 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0917\n", "it: 6901 ms/it:1.9172 tst_acc:0.9855 trn_loss:0.1280 tst_loss:0.0714 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.6832\n", "it: 7001 ms/it:1.8954 tst_acc:0.9725 trn_loss:0.0057 tst_loss:0.1199 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.5952\n", "it: 7101 ms/it:1.9048 tst_acc:0.9830 trn_loss:0.0526 tst_loss:0.0875 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.1944\n", "it: 7201 ms/it:1.9000 tst_acc:0.9795 trn_loss:0.0036 tst_loss:0.1177 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2082\n", "it: 7301 ms/it:1.8918 tst_acc:0.9855 trn_loss:0.1575 tst_loss:0.0595 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.4531\n", "it: 7401 ms/it:1.8148 tst_acc:0.9770 trn_loss:0.0023 tst_loss:0.0912 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2389\n", "it: 7501 ms/it:1.8609 tst_acc:0.9615 trn_loss:0.1333 tst_loss:0.1984 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.0536\n", "it: 7601 ms/it:1.8783 tst_acc:0.9625 trn_loss:0.1348 tst_loss:0.1635 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.3381\n", "it: 7701 ms/it:1.9814 tst_acc:0.9670 trn_loss:0.0914 tst_loss:0.2154 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.3460\n", "it: 7801 ms/it:1.8573 tst_acc:0.9790 trn_loss:0.5642 tst_loss:0.1225 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.2740\n", "it: 7901 ms/it:1.9789 tst_acc:0.9825 trn_loss:0.0746 tst_loss:0.0923 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.0229\n", "it: 8001 ms/it:1.9607 tst_acc:0.9765 trn_loss:0.0647 tst_loss:0.1554 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.3073\n", "it: 8101 ms/it:1.7003 tst_acc:0.9775 trn_loss:0.0000 tst_loss:0.1622 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0052\n", "it: 8201 ms/it:1.9164 tst_acc:0.9740 trn_loss:0.1375 tst_loss:0.1565 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.1471\n", "it: 8301 ms/it:2.0367 tst_acc:0.9825 trn_loss:0.0443 tst_loss:0.0957 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.6082\n", "it: 8401 ms/it:1.9045 tst_acc:0.9780 trn_loss:0.4172 tst_loss:0.1610 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.2836\n", "it: 8501 ms/it:1.8642 tst_acc:0.9680 trn_loss:0.1343 tst_loss:0.1856 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.9268\n", "it: 8601 ms/it:1.9150 tst_acc:0.9760 trn_loss:0.1492 tst_loss:0.1116 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.3113\n", "it: 8701 ms/it:1.8917 tst_acc:0.9840 trn_loss:0.0010 tst_loss:0.1036 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1165\n", "it: 8801 ms/it:1.9829 tst_acc:0.9760 trn_loss:0.0072 tst_loss:0.0998 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.7192\n", "it: 8901 ms/it:1.8685 tst_acc:0.9835 trn_loss:0.0003 tst_loss:0.0713 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0218\n", "it: 9001 ms/it:1.8986 tst_acc:0.9755 trn_loss:0.5329 tst_loss:0.1177 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.3075\n", "it: 9101 ms/it:1.8849 tst_acc:0.9745 trn_loss:0.0001 tst_loss:0.1427 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0074\n", "it: 9201 ms/it:1.9143 tst_acc:0.9740 trn_loss:0.0064 tst_loss:0.1286 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.6379\n", "it: 9301 ms/it:1.9335 tst_acc:0.9770 trn_loss:0.0049 tst_loss:0.0912 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.3331\n", "it: 9401 ms/it:1.8829 tst_acc:0.9820 trn_loss:0.1389 tst_loss:0.0869 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.7373\n", "it: 9501 ms/it:1.8093 tst_acc:0.9800 trn_loss:0.0000 tst_loss:0.0994 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0026\n", "it: 9601 ms/it:1.8548 tst_acc:0.9775 trn_loss:0.1294 tst_loss:0.1379 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.6775\n", "it: 9701 ms/it:1.8653 tst_acc:0.9690 trn_loss:0.2082 tst_loss:0.1807 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.6929\n", "it: 9801 ms/it:1.8750 tst_acc:0.9790 trn_loss:0.0000 tst_loss:0.1341 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0016\n", "it: 9901 ms/it:1.8391 tst_acc:0.9840 trn_loss:0.0005 tst_loss:0.1072 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0553\n", "it:10001 ms/it:1.8475 tst_acc:0.9740 trn_loss:0.0170 tst_loss:0.1504 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.6424\n", "it:10101 ms/it:1.8375 tst_acc:0.9790 trn_loss:0.0000 tst_loss:0.1647 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0001\n", "it:10201 ms/it:1.8481 tst_acc:0.9715 trn_loss:0.0693 tst_loss:0.1810 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.2210\n", "it:10301 ms/it:1.9360 tst_acc:0.9710 trn_loss:0.2064 tst_loss:0.1916 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.9218\n", "it:10401 ms/it:1.7590 tst_acc:0.9795 trn_loss:0.0003 tst_loss:0.1485 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0427\n", "it:10501 ms/it:1.9131 tst_acc:0.9600 trn_loss:0.0003 tst_loss:0.2860 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0428\n", "it:10601 ms/it:1.8459 tst_acc:0.9820 trn_loss:0.0566 tst_loss:0.1933 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.4583\n", "it:10701 ms/it:1.9201 tst_acc:0.9780 trn_loss:0.0000 tst_loss:0.1731 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0001\n", "it:10801 ms/it:1.8856 tst_acc:0.9760 trn_loss:0.2365 tst_loss:0.2043 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.9638\n", "it:10901 ms/it:1.9326 tst_acc:0.9810 trn_loss:0.0040 tst_loss:0.1054 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.5333\n", "it:11001 ms/it:1.8518 tst_acc:0.9750 trn_loss:0.8869 tst_loss:0.1666 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:7.3510\n", "it:11101 ms/it:1.8174 tst_acc:0.9800 trn_loss:0.0000 tst_loss:0.1264 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0013\n", "it:11201 ms/it:1.9216 tst_acc:0.9795 trn_loss:0.2843 tst_loss:0.1280 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.0041\n", "it:11301 ms/it:1.8474 tst_acc:0.9800 trn_loss:0.0000 tst_loss:0.1312 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:11401 ms/it:1.9509 tst_acc:0.9860 trn_loss:0.0717 tst_loss:0.0760 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.2902\n", "it:11501 ms/it:1.9183 tst_acc:0.9835 trn_loss:0.0720 tst_loss:0.0706 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.8035\n", "it:11601 ms/it:1.8588 tst_acc:0.9810 trn_loss:0.0000 tst_loss:0.1667 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:11701 ms/it:1.9243 tst_acc:0.9780 trn_loss:0.0000 tst_loss:0.1288 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0002\n", "it:11801 ms/it:2.0181 tst_acc:0.9800 trn_loss:0.0015 tst_loss:0.1283 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1053\n", "it:11901 ms/it:1.9545 tst_acc:0.9825 trn_loss:0.0000 tst_loss:0.1035 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0013\n", "it:12001 ms/it:1.8887 tst_acc:0.9790 trn_loss:0.0000 tst_loss:0.1556 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0020\n", "it:12101 ms/it:1.7490 tst_acc:0.9795 trn_loss:0.0061 tst_loss:0.1599 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.5866\n", "it:12201 ms/it:1.9567 tst_acc:0.9840 trn_loss:0.0086 tst_loss:0.1277 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.0934\n", "it:12301 ms/it:1.8599 tst_acc:0.9850 trn_loss:0.0163 tst_loss:0.1061 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.7902\n", "it:12401 ms/it:1.9244 tst_acc:0.9800 trn_loss:0.0166 tst_loss:0.1223 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.7924\n", "it:12501 ms/it:1.8721 tst_acc:0.9780 trn_loss:0.6067 tst_loss:0.1491 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:11.0514\n", "it:12601 ms/it:1.8351 tst_acc:0.9735 trn_loss:0.0553 tst_loss:0.2212 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.6150\n", "it:12701 ms/it:1.8683 tst_acc:0.9770 trn_loss:0.0578 tst_loss:0.1618 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.5222\n", "it:12801 ms/it:1.8916 tst_acc:0.9780 trn_loss:0.1388 tst_loss:0.1443 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.4016\n", "it:12901 ms/it:1.8777 tst_acc:0.9795 trn_loss:0.3753 tst_loss:0.0841 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.2822\n", "it:13001 ms/it:1.9720 tst_acc:0.9800 trn_loss:0.0006 tst_loss:0.1374 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1209\n", "it:13101 ms/it:1.9213 tst_acc:0.9760 trn_loss:1.0306 tst_loss:0.1779 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:7.6652\n", "it:13201 ms/it:1.9153 tst_acc:0.9760 trn_loss:0.0217 tst_loss:0.2003 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.4286\n", "it:13301 ms/it:1.9395 tst_acc:0.9820 trn_loss:0.3963 tst_loss:0.1308 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.9430\n", "it:13401 ms/it:1.9037 tst_acc:0.9815 trn_loss:0.0000 tst_loss:0.1967 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:13501 ms/it:1.9530 tst_acc:0.9780 trn_loss:0.1648 tst_loss:0.1603 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.8833\n", "it:13601 ms/it:1.9008 tst_acc:0.9745 trn_loss:0.0000 tst_loss:0.2226 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0014\n", "it:13701 ms/it:1.9314 tst_acc:0.9800 trn_loss:0.3639 tst_loss:0.1396 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.0991\n", "it:13801 ms/it:1.9677 tst_acc:0.9825 trn_loss:0.0000 tst_loss:0.1507 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0003\n", "it:13901 ms/it:1.7624 tst_acc:0.9835 trn_loss:0.0634 tst_loss:0.1499 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.6273\n", "it:14001 ms/it:1.6495 tst_acc:0.9755 trn_loss:0.0000 tst_loss:0.1899 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:14101 ms/it:1.6304 tst_acc:0.9745 trn_loss:0.0000 tst_loss:0.2126 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:14201 ms/it:1.6777 tst_acc:0.9800 trn_loss:0.0026 tst_loss:0.1826 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2822\n", "it:14301 ms/it:1.8394 tst_acc:0.9785 trn_loss:0.0000 tst_loss:0.1636 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0018\n", "it:14401 ms/it:1.8427 tst_acc:0.9770 trn_loss:0.5020 tst_loss:0.1936 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:7.6895\n", "it:14501 ms/it:1.7796 tst_acc:0.9830 trn_loss:0.0012 tst_loss:0.1847 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1890\n", "it:14601 ms/it:1.7793 tst_acc:0.9780 trn_loss:1.4099 tst_loss:0.2085 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.8055\n", "it:14701 ms/it:1.5060 tst_acc:0.9790 trn_loss:0.0023 tst_loss:0.1367 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.2968\n", "it:14801 ms/it:2.0035 tst_acc:0.9760 trn_loss:1.0047 tst_loss:0.2220 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:10.6048\n", "it:14901 ms/it:1.6726 tst_acc:0.9760 trn_loss:0.9350 tst_loss:0.2156 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.9722\n", "it:15001 ms/it:1.9433 tst_acc:0.9810 trn_loss:0.0089 tst_loss:0.1182 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.2063\n", "it:15101 ms/it:1.8444 tst_acc:0.9750 trn_loss:0.0584 tst_loss:0.2196 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.6017\n", "it:15201 ms/it:1.9109 tst_acc:0.9795 trn_loss:0.0000 tst_loss:0.1789 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0005\n", "it:15301 ms/it:1.8718 tst_acc:0.9810 trn_loss:0.0000 tst_loss:0.1174 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0003\n", "it:15401 ms/it:1.8953 tst_acc:0.9785 trn_loss:0.0000 tst_loss:0.1475 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0001\n", "it:15501 ms/it:1.8311 tst_acc:0.9765 trn_loss:0.0001 tst_loss:0.1564 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0073\n", "it:15601 ms/it:1.7217 tst_acc:0.9750 trn_loss:0.3296 tst_loss:0.1664 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.9605\n", "it:15701 ms/it:1.9053 tst_acc:0.9855 trn_loss:0.0009 tst_loss:0.1667 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.1999\n", "it:15801 ms/it:1.7717 tst_acc:0.9825 trn_loss:0.0000 tst_loss:0.1057 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:15901 ms/it:1.8217 tst_acc:0.9830 trn_loss:0.3892 tst_loss:0.1688 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.3087\n", "it:16001 ms/it:1.9229 tst_acc:0.9745 trn_loss:0.1859 tst_loss:0.2158 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:4.9582\n", "it:16101 ms/it:1.8082 tst_acc:0.9795 trn_loss:-0.0000 tst_loss:0.2029 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:16201 ms/it:1.9254 tst_acc:0.9775 trn_loss:0.2363 tst_loss:0.2955 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:8.8553\n", "it:16301 ms/it:1.8827 tst_acc:0.9750 trn_loss:0.8202 tst_loss:0.2255 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:10.0281\n", "it:16401 ms/it:1.9574 tst_acc:0.9645 trn_loss:0.0000 tst_loss:0.3707 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:16501 ms/it:1.9046 tst_acc:0.9820 trn_loss:0.0359 tst_loss:0.1896 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.8955\n", "it:16601 ms/it:1.8141 tst_acc:0.9775 trn_loss:0.0399 tst_loss:0.1710 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:2.4733\n", "it:16701 ms/it:1.9342 tst_acc:0.9835 trn_loss:0.0000 tst_loss:0.1501 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:16801 ms/it:1.9684 tst_acc:0.9760 trn_loss:0.0001 tst_loss:0.1900 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0106\n", "it:16901 ms/it:1.8685 tst_acc:0.9820 trn_loss:0.7164 tst_loss:0.1348 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:8.9684\n", "it:17001 ms/it:1.8551 tst_acc:0.9840 trn_loss:0.0000 tst_loss:0.1458 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:17101 ms/it:1.9224 tst_acc:0.9760 trn_loss:0.0006 tst_loss:0.2259 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0942\n", "it:17201 ms/it:1.9630 tst_acc:0.9735 trn_loss:0.0003 tst_loss:0.3040 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0378\n", "it:17301 ms/it:1.9050 tst_acc:0.9840 trn_loss:0.0033 tst_loss:0.1675 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.4517\n", "it:17401 ms/it:1.8947 tst_acc:0.9800 trn_loss:0.0000 tst_loss:0.1678 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:17501 ms/it:1.9690 tst_acc:0.9815 trn_loss:0.0000 tst_loss:0.1366 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:17601 ms/it:1.8694 tst_acc:0.9770 trn_loss:0.9932 tst_loss:0.2249 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.7315\n", "it:17701 ms/it:1.8724 tst_acc:0.9775 trn_loss:0.0000 tst_loss:0.1323 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0002\n", "it:17801 ms/it:1.8554 tst_acc:0.9740 trn_loss:0.0519 tst_loss:0.1686 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.2556\n", "it:17901 ms/it:1.8612 tst_acc:0.9740 trn_loss:0.0001 tst_loss:0.1772 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0100\n", "it:18001 ms/it:1.9047 tst_acc:0.9805 trn_loss:0.6135 tst_loss:0.1413 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:7.8780\n", "it:18101 ms/it:1.8002 tst_acc:0.9820 trn_loss:0.0053 tst_loss:0.2359 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.9542\n", "it:18201 ms/it:1.8813 tst_acc:0.9775 trn_loss:0.0003 tst_loss:0.2230 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0574\n", "it:18301 ms/it:1.8955 tst_acc:0.9865 trn_loss:-0.0000 tst_loss:0.1916 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:18401 ms/it:1.9161 tst_acc:0.9735 trn_loss:0.0001 tst_loss:0.1726 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0062\n", "it:18501 ms/it:1.9954 tst_acc:0.9870 trn_loss:0.5568 tst_loss:0.1441 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:13.3536\n", "it:18601 ms/it:1.8806 tst_acc:0.9735 trn_loss:0.1310 tst_loss:0.3379 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.4664\n", "it:18701 ms/it:1.8249 tst_acc:0.9680 trn_loss:0.1082 tst_loss:0.3077 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:5.1476\n", "it:18801 ms/it:1.8865 tst_acc:0.9810 trn_loss:-0.0000 tst_loss:0.1839 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:18901 ms/it:1.8765 tst_acc:0.9825 trn_loss:0.0060 tst_loss:0.2067 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.9773\n", "it:19001 ms/it:2.0174 tst_acc:0.9795 trn_loss:0.0072 tst_loss:0.2197 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.6490\n", "it:19101 ms/it:1.8839 tst_acc:0.9760 trn_loss:0.4187 tst_loss:0.3126 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.0084\n", "it:19201 ms/it:1.9739 tst_acc:0.9865 trn_loss:0.2705 tst_loss:0.1166 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:7.4380\n", "it:19301 ms/it:1.8977 tst_acc:0.9805 trn_loss:0.3683 tst_loss:0.1763 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:6.3306\n", "it:19401 ms/it:1.8479 tst_acc:0.9790 trn_loss:0.0000 tst_loss:0.1369 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0001\n", "it:19501 ms/it:1.8434 tst_acc:0.9820 trn_loss:0.0000 tst_loss:0.1748 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0064\n", "it:19601 ms/it:1.8677 tst_acc:0.9775 trn_loss:0.0005 tst_loss:0.3086 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0919\n", "it:19701 ms/it:1.9377 tst_acc:0.9685 trn_loss:0.0092 tst_loss:0.3331 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:1.5948\n", "it:19801 ms/it:1.8509 tst_acc:0.9825 trn_loss:-0.0000 tst_loss:0.1835 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:19901 ms/it:1.9325 tst_acc:0.9780 trn_loss:-0.0000 tst_loss:0.1955 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:0.0000\n", "it:20000 ms/it:1.8418 tst_acc:0.9750 trn_loss:0.0257 tst_loss:0.2688 tst_nll:0.1681 tst_kl:0.2860 sum_norm_grad:3.1025\n" ] } ], "source": [ "num_train_steps = 20e3 # @param { isTemplate: true}\n", "num_train_steps = int(num_train_steps) # Enforce correct type when overridden.\n", "dur_sec = dur_num = 0\n", "\n", "for i in range(num_train_steps):\n", " start = time.time()\n", " trn_loss, _, g = fit()\n", " stop = time.time()\n", " dur_sec += stop - start\n", " dur_num += 1\n", " if i % 100 == 0 or i == num_train_steps - 1:\n", " tst_loss, tst_acc= eval()\n", " f, x = zip(*[\n", " ('it:{:5}', opt.iterations),\n", " ('ms/it:{:6.4f}', dur_sec / max(1., dur_num) * 1000.),\n", " ('tst_acc:{:6.4f}', tst_acc),\n", " ('trn_loss:{:6.4f}', trn_loss),\n", " ('tst_loss:{:6.4f}', tst_loss),\n", " ('tst_nll:{:6.4f}', tst_nll),\n", " ('tst_kl:{:6.4f}', tst_kl),\n", " ('sum_norm_grad:{:6.4f}', sum(g)),\n", "\n", " ])\n", " print(' '.join(f).format(*[getattr(x_, 'numpy', lambda: x_)()\n", " for x_ in x]))\n", " sys.stdout.flush()\n", " dur_sec = dur_num = 0\n", " # if i % 1000 == 0 or i == maxiter - 1:\n", " # dnn.save('/tmp/vae.npz')" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "code", "colab": {}, "colab_type": "code", "id": "_c1Y_Y7LkR2W" }, "outputs": [], "source": [ "@tf.function(autograph=False)\n", "def dnn_predicted_log_prob(x):\n", " with tf.xla.experimental.jit_scope(compile_ops=True):\n", " return tf.math.log_softmax(dnn(x).logits, axis=-1)\n", " \n", "eval_iter = iter(eval_dataset.batch(2000))\n", "\n", "dnn_predicted_log_probs = tf.reshape(\n", " tf.stack([dnn_predicted_log_prob(x) for x, _ in eval_iter], axis=0),\n", " shape=[datasets_info.splits['test'].num_examples, -1])" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "height": 205 }, "colab_type": "code", "id": "5aVSiYt4lT2R", "outputId": "f339d207-a67d-43e2-8a40-62dba2e20dab" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of examples undecided: 127\n", "Accurary after excluding undecided ones: 0.98480707407\n" ] }, { "data": { "image/png": "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\n8ccslwcAAAAAAAAAAMiJovldAQAAAAAAAAAAgLxSs2bNiJdPSEgIif37/74///xT/fr1U9u2bTVg\nwIBM133cccfpsccec/9/8sknVb9+/bDLVq9eXZMmTQqJrV69Wr169cr1uiOtt5k2bZratWuno48+\nOtPl2rVrp3bt2kmS/vrrL02ZMiXTuvjS0tK0adOmTJf59ddftWjRIo0cOTJb68zOutesWaMqVaqo\nWbNmkv5/1riWLVvqs88+U8uWLcO+Z8qUKZo4caJee+01nXLKKZl+dqTbJFrrjnQ/iWTdkRw7kW7v\naK579erVuuWWW1xGzt69e+uZZ57Rrl27dMIJJ6RbPifHjsmrffDnn3/Wli1bdOWVV7r1/vXXXzrn\nnHP09ttvq0KFCmE/I5JjJ5J9MNJtEs11+zI7d0u5O1dlte5/O3jwoDZt2hTxNQkAAAAAAAAAACA7\nyBAIAAAAAAAAAAAKjUqVKqlBgwYaP368Dhw4oLVr12rmzJlq3bp12OW7d++ujz76SKtWrVJaWprG\njRunlJSUsJn59uzZo2uuuUYpKSm65ZZbsqzLpk2btGvXLh0+fFgLFizQ22+/rUGDBoVdtlGjRipS\npIheffVVHThwQJMnT5YkNWnSJNfrjrTekrR//37NmjVL3bt3z3LZFStW6PDhw9q5c6fuuecetWnT\nRmeccUbYZd955x3t3LlTkvTTTz/phRdeUNOmTTNdf2pqqpKTk1WpUqVMl4tk3XXq1NGGDRv01Vdf\nSZI2btyo+fPnq1atWmGXnz59up566im99NJLqlixYqb1kCLbJtFcdyT7SaTrjuTYiXR7R3Pd9erV\nU2pqqvbs2aO0tDS99tprKlu2bNgfA0Z67ERrH6xRo4YWLFigadOmadq0aXrggQdUpkwZTZ8+XeXL\nl8+wPtk9diLZByPdJtFc98cff6w///xTkvTdd9/p1VdfVZs2bTJcPpL9O5J1f/vtt1qyZInS0tK0\nf/9+TZgwQTt27NBZZ52V5XcAAAAAAAAAAADIiYRAIBDI70oAAAAAAAAAAADkRK1atTR37tyQH7xs\n375dd955p5YsWaIyZcpowIABuvTSSzNcx5tvvqlx48Zp//79Sk5O1r333quyZcumWy41NVXDhw9X\niRIlXCwhIUEzZ85UuXLl0i3/4YcfatSoUdqzZ48qV66s2267zWUDC2fVqlW68847tW7dOlWpUkWj\nRo3K8EdNkaw70npL0gcffKDHH39cn3zySYb1NVdeeaVWrVqlYsWK6YILLtAdd9wR8lm+4cOH69NP\nP9Xff/+t0qVL64ILLtCQIUOUmJiY4fo7duyoa6+9NssfJ0a67lmzZunZZ5/VL7/8olKlSqlLly66\n9dZbwy7bpk0bbdu2TYmJiQoEAkpISFCXLl1077335nqbRHPdke6Dkaxbyv6xI0W2vaO57l27dumB\nBx7Ql19+qYMHD6p69eq64447wmaKi/TYieY+6Fu0aJGGDRum+fPnZ7pcdo+dSPbBSLdJNNc9dOhQ\nff7550pLS1O5cuXUs2dP9ezZM8PvGcn+Hcm6Fy9erAceeECbN29W0aJFVaNGDd18881KSUnJsC4A\nAAAAAAAAAAC5wQ8CAQAAAAAAAABA3DrrrLOUmJio3r17a8iQIfldHQAAAAAAAAAAAAAAooofBAIA\nAAAAAAAAAAAAAAAAAAAAAAAAEAeK5HcFAAAAAAAAAAAAAAAAAAAAAAAAAABA1vhBIAAAAAAAAAAA\nAAAAAAAAAAAAAAAAcYAfBAIAAAAAAAAAAAAAAAAAAAAAAAAAEAf4QSAAAAAAAAAAAAAAZMPChQuV\nlJSk2rVra+HChfldHQAAAAAAAAAAAByB+EEgAAAAAAAAAAAACr2tW7cqKSlJycnJSk5OVlJSkmrV\nqqVJkyaFXX7q1KmqU6eOWzY5OVmLFy8Ou+zOnTs1dOhQtWjRQg0bNtSVV16p7777LsO6jBgxIqQu\n9evXV0pKSobLb9myRX369NHZZ5+tjh07ZvpDtAMHDmjUqFFq0aKFGjdurJEjR+rQoUN5sk0kadOm\nTbr++uuVnJyspk2b6rHHHgu7XKTbJDU1Vd27d1dKSopatWql0aNH6/Dhwxkuv2rVKvXs2VMNGjRQ\nq1at9Oyzz2a47Jo1a9SvXz81adJEtWvXznA5s3TpUl166aVKTk5W165dtWTJEvda06ZNtWzZMlWo\nUCHL9QAAAAAAAAAAAADRwA8CAQAAAAAAAAAAUOiVL19ey5Yt09KlS7V06VK9//77Ouqoo9S+ffsM\n35OUlKSlS5e69zVs2DDscnv37lX9+vWVmpqqRYsWqVu3bhowYID27dsXdvn77rsvpC6dO3dWhw4d\nMqzH0KFDVbduXS1atEg333yzhgwZoj/++CPsshMmTNDKlSs1c+ZMzZo1SytWrND48ePzZJukpaXp\nmmuuUdOmTbVw4UItWLBAXbp0yZNt8s8//+iuu+7S119/rbffflsLFy7Uiy++mOk2adSokb755hu9\n+uqreuONNzRv3rywyxYtWlQdO3bUqFGjMlyf2b17twYNGqT+/ftryZIl6tevnwYOHKi//vorZLlA\nIJDlugAAAAAAAAAAAIBo4AeBAAAAAAAAAAAAOOKkpqaqQYMGKl++fK7XValSJV111VU66aSTlJCQ\noMsuu0xpaWlav359lu/9+++/NXv2bF100UVhX9+wYYNWrlypG2+8UYmJiWrXrp1q1KihOXPmhF1+\n3rx56t27t0qVKqUTTzxRvXv31rvvvput75HVNpk6darKli2rvn37qnjx4kpMTFSNGjXCLhvpNunR\no4dSUlJUtGhRnXLKKerSpYuWLl2aYV1/+eUXde7c2X1WSkqK1qxZE3bZM844QxdffLGqVauW2deX\nJC1btkwnn3yy2rVrp4SEBHXp0kUnnnhihtsbAAAAAAAAAAAAiDV+EAgAAAAAAAAAAIAjzrRp0zL8\nEZ5ZuXKlmjZtqg4dOmjcuHE6fPhwttb9ww8/6ODBgzrttNOyXHbOnDk66aST1KBBg7Cv//TTT6pU\nqZKOOeYYF6tVq1aGP34LBAIh2esOHz6sX3/9VXv27MmyLlltk+XLl6tChQrq37+/mjRpoj59+mj1\n6tVZrleKbJtI0uLFi1W9evUMX+/Tp49SU1N18OBBrVu3Tt9++62aN2+erXVn5t/bz2S0vQEAAAAA\nAAAAAIBY4weBAAAAAAAAAAAAOKJ888032rFjh9q3b5/hMg0bNtSMGTO0cOFCjRkzRh988IEmTpyY\n5br37NmjYcOGafDgwSpZsmSWy6empqpr164Zvr53716VKlUqJFayZEnt3bs37PLnnnuuXnnlFe3c\nuVO//fabJk+eLEn6559/Mq1HdrbJtm3bNHPmTPXt21eff/65WrZsqUGDBungwYOZrjvSbfLuu+9q\nxYoVuuaaazJcplWrVpo9e7bOOussderUSZdcconq1q2b5bqzkpSUpO3bt2vmzJk6ePCgpk6dqo0b\nN2rfvn25XjcAAAAAAAAAAACQF/hBIAAAAAAAAAAAAI4oqampat++vY4++ugMlzn11FNVsWJFSVL1\n6tV1ww03aPbs2Zmud//+/Ro4cKCSkpLUv3//LOuxdetWLV68WN26dctwmWOPPTZddr+9e/fq2GOP\n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\ni1zM+hGBI4G1++3YkqRLLrlEUuhxZvxnK5aV279neP755yVJn3zyiYtNmTIlD2uMgsDGoPuZ2e35\nG1nYI2Oo2W/HAAAgAElEQVTZayXpqKOOkhQc/yhJb7zxhqTguGwpOOZLOvLuY/0MgX42QOOfj+x1\nMgUiHL/t51+nbOylfx1D3snsJ39kCAQAAAAAAAAAAAAAAAAAAAAAAAAAIA7wg0AAAAAAAAAAAAAA\nAAAAAAAAAAAAAOJA0fyuQH5r2rRputgLL7zgylu2bIlldfLE/fff78rly5dP9/pDDz3kysuWLYtJ\nneKR7QdXX321i1nq4LS0NBfbvXu3JKlMmTIu1rp1a0lSr169XGzy5MnRq2wBUKlSJUlSkyZNXOzN\nN9+UFJqm1FKlP/bYYy52++23x6KKMWXbQ5IaN26c7nXbDv62CZfO9dFHH033WpcuXSRJc+bMyZvK\nxkhKSookacSIES7WsWNHSdIXX3zhYg888IAkae7cuTGsXXzxz0vPP/+8JKlIkeBv/D/66CNJ0vTp\n02NbsSg4++yzJYXuD6VLl87Tz7Dj66233nKxnj175uln5KdTTjlFknTMMce42Pjx4yUFz0WS1KJF\nC0mhx+jQoUMlSWPGjIl6PSNRqlQpV3733XclSeedd56Lbd26VZLUtm1bF/vxxx9jVLuCzY6f2rVr\nu9hll10mSbr22mtdrESJErn+rO+//96Vk5OTXdnaU/np3HPPlSS9+OKLLvbxxx+ni40ePVqS9PXX\nX7uYtekK+3XKtpEUbNO+8847Lhbu+9u9x3333ediZ555ZshrkvTII4+kW8eaNWvyotoFVu/evSWF\n7l927T548KCLbd++XZK0c+dOF2vQoIGk4P4oSTfccIMr//PPP1GoMaLp7rvvliTdddddLla06P/v\nngl37xSOta0lqVy5cpKkX3/9NU/rGSt+O/aiiy6SJD355JMuVqFCBUmZbw+fv9yoUaMkhV6TZs2a\nlfPKFgBVqlRx5TZt2qR7vX79+uli9v1ff/11F9u7d28UalewXXDBBZKke++918WsjTJlyhQXu+WW\nWyTFxzHl7+9169aVJDVq1Cjs6//mn28OHTqU7nU7L/k6deokKbStWFCvQ6effror9+vXT1Loede+\nv9+30qdPH0nSjh07XGzAgAGSpHHjxrnYyJEjJYVejwsjf//54IMPJElDhgzJr+rElV9++UVS8Hwi\nSa+99pqk4LaUpFWrVkkKvd+IJ0cddZQrV69eXZJ03HHHuVidOnUkSdu2bXMx/xyVGTsv+efsvO4P\nQsHWrFkzV/7ss88kSampqS7Wo0cPSaHPagq6m2++2ZWtD1ySfv75Z0nBPjxJuvjiiyVJkyZNik3l\nEBcuvPBCV542bZqk8M+VvvvuO1e2fhnf/v37JQWfNUnBZwpHuiVLlqSLdevWTVLotra+HL/deKS4\n9NJLXblq1aqSpP79+7uY3w4Px/a1Tz/9NAq1i51WrVq5sj1TCXf/5cfmzZsnKXRfmj9/vivbfcaC\nBQvysqo54o9rsHas319sz/mfe+45F7O//dNPPx2LKhYoZcuWdWX7/v6xYn766SdX/uOPPyQVvOdv\nseD3+4W7x7RxN0uXLnUxO8/Y+BNkj9+HbH0eGVmxYoWk0Oc269evj07FUGD4z+46d+4sKfQ8btcu\nKdgvWBhZ/4UUfizXrl27JElHH320i61evdqVf//9d0mhzx6sb6ggjOvy/3Y2ZtT6kn1+f7jV3x83\nu2HDBknBsQVS8N7dH3/qj5crzJo3b+7Kfh/Zv/njMoYNG+bKlStXlhS8/5dC+z0Ki3r16kmS+vbt\n62LWZzp79mwX89tE8fQcz46l5cuXR/zecPfz9jzCv8fy7z2sPykenl+ZYsWKubKdH/z9wcqnnXZa\nuvf622jgwIGSpAkTJkSlntFSs2ZNSaH3hvY8/MYbb0y33D333BPD2sWXY4891pXtNxLXXXediyUm\nJqZ7T7jr+quvvurKNq4wXp/RRMrvg7BxXf44UX8/td9A+K/7Y8EKIv/e3Mbs++0ge14cjv/dN2/e\nLCl0jJx/HxuPvyvKK9YetjHFUujx5T8jjGfW5ykFx1Rn5dtvv5WUf7/LIkMgAAAAAAAAAAAAAAAA\nAAAAAAAAAABxgB8EAgAAAAAAAAAAAAAAAAAAAAAAAAAQB4rmdwXyi6WlTE5OTvfakiVLYl2dPOWn\nLjX79+935blz58ayOk7RosHd7ZJLLnHlTz75RJK0ffv2mNfp38466yxXtpSx4YwdO9aVLf3r448/\n7mLHHHOMpMKT/jQ73njjDUlSo0aN0r3mp4S1/dPSv0vS1q1bJUlPPfVUNKsYU02aNHHlyZMnZ7hc\nuPTvvnDH86OPPipJmjNnTg5rFzt16tRx5Q8++ECSVKZMGRez79e8eXMXmzZtmqTQVLvxfl7OiWLF\nikkKTVvdsmVLSdLll1/uYkWKpP9t/8qVK6Ncu9hZvny5JCk1NdXFrrnmmqh8Vps2baKy3lgqWbKk\nJGnMmDEudu6550qSTjzxRBc74YQTJIU/P/uqV68elXrmVvny5V3ZP98aO980bdrUxX788cfoV6yA\n6tWrlyv/5z//kSRVq1Yt6p9br149V/av+36bKb+MGjVKkjRkyBAX+/DDD7NcXpIuvvhiSfnXpo4G\n//zw/PPPS5K6du3qYnZ+8K9JX3zxhSSpZs2aLnbSSSdJCj1Gw7Fz1Hfffedi119/vSTp66+/jvwL\nxIH169dLCt3P7Bz82GOPudjmzZslST///LOLffrpp5KkPn36uNgzzzzjyt9++20UalwwpKSkuHLf\nvn0lSdddd52L/frrr5JC790sVpB16NBBUug9srXpDh8+nG55/xpt5cqVK7uYbRP/fmr37t15V+Eo\n8+8ZnnjiCUlShQoVXMy+s99usfuDv/76K936/OuP3Xu0bt3axWbNmpUX1Y6JEiVKuPKdd94pSerR\no4eLVa1aNaL1WbtQkgYPHiwpvvaVnLjoootc+eWXX5YU7LPx+f1Uy5YtkxS89y7Ijj76aFd+6623\nJIVv1/vHz//+9z9JodeaefPmpXtvq1at0r139OjRkqRdu3bltupRZ39vKdjnYNdUSXrooYckZd23\n8t5770mSnn32WRcLt40LI7tvlKS0tDRJ0p9//plf1YmaU045xZXvvfdeV7777rslSTt27Mjxug8d\nOuTK1s694447XMz6wOweQwq2s+OBtXEl6fzzz5cUen6wY8W/Z+jWrZskadCgQS5WsWJFSaHb6+qr\nr5Ykvfbaa3ld7VxZsGCBpIz7dBcuXChJ+u9//+tiv/32myTpjz/+iHLtCge7tn388ccuZvuSf5/6\n+uuvSwrt8/CfgxUktWrVkiTdeuutLrZz505Xtj5J/xxr7dh33nnHxdq3b5/hZ/j7pB2Hb7/9tovZ\nPunvh/ZcBv+f38d45ZVXuvLEiRMlhfZh5Bf/75zZs6X69etnup7ExERJ0tNPP+1izZo1k1T47w9y\nokaNGuli48ePlyR99NFHsa5OTFxwwQWSgtdtKXgOPvnkk10s3H5Y2NvKdp9k4xuk7H9nW85f3u+v\nsHUfddRRuaxl3rK/s7WDJKljx46SpPnz57uY3S/695r+s73C7P/+7/9c+dJLL033+iOPPCIp2O8l\n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\nt98khMs47p9DrM/U7y+2sahSsB3l98kXZieeeKIr2zb88ccfXcz/HcmhQ4diV7EcsP1HkkaMGCEp\n9JwdTnbbeSeddFLIv/9mbQb/2pXdcRvZQYZAAAAAAAAAAAAAAAAAAAAAAAAAAADiAD8IBAAAAAAA\nAAAAAAAAAAAAAAAAAAAgDhTNepHCo2TJkq585ZVXSgpNBfvOO+/EvE55yVJwd+jQIX8rIumYY45x\n5eHDh0uSLrzwQhfzU2gmJydLki655BIXe/HFF6NdRefcc8915apVq7qy1dGvq6U59dOx2+tFihTJ\n9L2Fyeuvvy5JOnz4sIvZseTHwh1nliL8tddeS7deP224pZaNNx9//LEk6fTTT890Odsm69atczFL\nGz5w4EAXu/766yWF7kulSpWSJDVq1CgPahxdAwYMSBebN2+eK1911VWSpH/++SfT9Zx22mmSpIUL\nF7pYr169JEmzZ8/ObTXzhX9N6tixo6TgseXz//bZPad06dJFkvT000+72E033ZSjehYUBw8edOXF\nixeH/OubNWuWK3/44YcZrs8/L91yyy2SpBdeeCHX9YwlS0/up+Beu3atJOmnn35yseeee05SMF25\nJO3Zsyfd+n744Yeo1DPa/vOf/0iSihYNNmutTdGsWTMXe/DBB9O9144pf3/45ZdfJEkVKlRIt9zu\n3btdbPny5ZKkFi1auNiKFStc+f7775cUut1jwd8OY8eOlRS+fZNd/rb5448/JEmlS5fO1nv9zypW\nrJgr++3EWPrzzz9duUyZMpKkunXrupj/9/u3VatWuXLt2rUlSWeccYaL2bEXT/y2ih1HUvjj4q67\n7pIUeu365ptvJEk9e/Z0sU2bNkmS9u/fn+7z/P3hrbfekiRdfPHFLmb7lV3zJWnjxo3Z/j6Fme27\nme2jBYV/TzRu3DhJUr9+/bL1Xn//snPr8ccf72J2n+Ff33v06CEp9P4sHvjXaeMfc5kJt5wdXzVq\n1HCx6tWrS5LWrFmTkypGTb169VzZ2m3lypVLt9ykSZNc2e4Nd+zYka3PsPslSfr0008lSccdd5yL\n2fVx8ODB2ax17Fmb49hjj0332s8//+zK3bt3lyR9//33Lnbo0CFJ0vPPP+9idh++evVqF2vdunW6\ndQ8bNkySdO+997rYJ5984sp2D7Zr165sfpPYOvHEE1354YcflhR6bnn55ZclSQ899JCL2X24HTNS\nfJxvcyO755t48vjjj0uStm/f7mLnnXeeK//+++85Xne3bt0khW63wrgNfSVKlJAkpaamupjdVxZG\nfj/V1Vdf7coTJkyQJA0aNMjFrH2TGwcOHHBlOx/NmTPHxfz72JkzZ+b68woCuw5JwWcF1apVczF7\nLvPKK6/EtmI5YO0uuz+WpI8++siV7T7L77dt1aqVJKl58+Yuds8990gKfWbi9+8cyex+slatWi5m\n5yV/u1t7yfr1JGnGjBmxqGLEwvXFTJs2LVvv/eKLL9KVX3311XTLHX300a7cvn17ScFrmB87+eST\nXey///2vK9t956233upidu++b9++bNU1JxITEyVJS5YscbEHHnggXR3ymn/van0e1s8hhZ77C5KV\nK1e6ctu2bSVJJ510kotZP4ttV0kaMmSIpND+wXD8++8jmW3XyZMnu5i1/fy2UUG9J8pKxYoVJUl3\n3nmni11++eWSpBNOOMHF7NmLf1y8+eabkkLPxXZ/unfvXhez656/Pn8MxnfffZe7LxFDdj9s30nK\nvH/dv08YOXJkutdHjBiR6ectWLAgwhrmP/+5krVlkpKSXMyu58uWLYttxWLE2rb+84+0tDRJsR3v\nUpCNGTPGla2Pxm/33n333ZKC2y0j9l67bkvBfiB/n7O+wMLO+v+kYDvO7//87bffQv6VQs9Rdr9r\nzzql4POyv/76y8XeeOONiOrlX19sfX77xZ7BStK3334rSZo7d66L2TNO/1pTvHhxSVLjxo1dzNq2\n/vMku9b4fcPWHzR69GgXe//99yUV7Psva8v5f7Nwx0j58uUlSb1793axsmXLSgq9J7U+ZL9v2K7/\nfn+99f1OnTrVxfy/Wbyz8QP33Xefi4Ub22fPK/0xjHbv7j/vsrZRPPj666/DlrPD79OxcUj+vmlj\nvfx783hg4xP980NBGONZqVIlSaHPhgrCM1C7R7b6ScExoT7bhg0aNEj32ubNm13Zrl116tRJ917f\n2Wef7cp2vejatauLbdmyJXtfIBf8Y+Caa66RFNpnFW5shV1//X4X69P54IMP0n2G/93tmdWzzz7r\nYqecckq69/hjXwoCGx/6yCOPpHvNH4tn/eD+tSYzfv+4jRGwMfJSaP+a9avH+pjxz3+PPvqoJOnS\nSy91sex+V2Rtw4YNrmxtybPOOsvF7Dj0x2/5zyH+vZwk3XDDDZJCr+t+e7ggadmypaS87zuw9caL\n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\nljZb/yBF96n3338/xGwOxjvhhBMkJfctvKT5wULzmWUtA1eurw/+vm5jYJ5fB1+ZDE+54M+BpLWb\n2bK1Br4fmpRp1OZ1k74DsKT5Oluza2PzUnR9T/quQWW8+eabkpLXSUjRuWRzIpI0atQoSfHzwtZ6\n+gzhW2yxRew1yuPvXdZn8Pdtvx6wkHy2OV+2/6//35c1HpGUSdCPN9j1I9vPa0njFmkcw/Brqmxt\nhc+eWNa8lP+87DPx/yc/du/XvKSFjeNI0fiCn98dPHiwpGhuQYrWH9t5Wcr8Gs6k7+/Ye/DXAv/d\nhmzYHIQUzfH5cTGb80k6lqRofa7PdmrXzlwgQyAAAAAAAAAAAAAAAAAAAAAAAAAAACnAFwIBAAAA\nAAAAAAAAAAAAAAAAAAAAAEiB2sWuQLHde++9oTxw4EBJ0ieffBJilnq6Q4cOha1YJfTv319S/D3l\nmk+leeaZZ0pKTm/p06wut9xykqR27dplPE6K0okPGDAgDzXOrZNOOklSlCZeSk7NvGjRosJWLE8s\nDawknX322Rm/97HOnTtLin8Olvo8KT28T81srzNkyJAq1rg4/Dmw1FL/fc/av7+y0i/7tNtrrrnm\nEh83derUqlSxaObPnx/KO+ywgyTpww8/DLHzzz9fUnQ9kaL0vUnHjVfe76uzO+64I5SPPvpoSfHP\n49tvv5UknXjiiYWtWIEcccQRkqT1118/43c+RbVds3OZWrmQdtlll1DecccdJUk9evQIseHDh0uS\nnnvuuRD7888/JUkLFizIeD1/jNg16tprr81hjUubteWsbSdJ77//vqR4WvdffvmlsBXLMf9/njlz\npiTp1ltvLfM5lhb+vffeC7Fll122Qn/3wgsvDGVr26WVTyP/8ssvS4rfy+29+vPx8ccflxRddyRp\n1qxZea1nvtgxNGzYsBDbe++9JUXp7SXpmGOOkSTdfffdIfbSSy8t8XV79+4dyttuu23G7++//35J\n8et42vm+kx1X/jO0duA222wTYpdccokkafTo0YWoYs78/fffkuLnyvLLLy9J+uijj0LsgQcekBQ/\nBlq3bi1JatiwYcbr/vHHH6F81VVXSZK+/vrrHNW68iZNmhTKW2+9dZmPtc/k5JNPzupxSW3cpP5E\n0uOsLyJJCxculBT1ySTpiiuuCGU7xtJ0zvlzys6V0047LcQaNWokKXmM4uOPP86IlYKffvoplPfc\nc89Q/vnnnyVF70mSLr74YknxYynpvay88sqSko8be10pakPaWFJ14O9JK664Ysbv7dqz6667Zvyu\nlI6LirBzXZLGjx8vSTruuONCLOlzsP/5008/HWK///67JGnKlCkhtu6660qK+pye/U6K2j/+emP9\nklLx6aefSopfB638119/hZgdQ2uttVaI7bXXXpKkzz//PMQ23njj2OMlacMNN5QU729st912kqTJ\nkyfn4F3kTvPmzUPZ3ldV+kH+elPWGJhnbeWRI0eGmD+e0+THH3+UJPXr1y/ErJ3n23Tdu3eXJDVu\n3DjE9thjD0nSWWedFWJltalLWd26dSVF54IUfTbTp08PMZs3OOyww0Isre85SZMmTSRJm266aYjZ\neTFo0KCMmL//JN2L1ltvPUlSs2bNyvy7G220USife+65kuLXMuP/P6XArkfnnHNOiFn/aKuttgox\nu8f4+v/zzz+FqGLe+P/3hAkTYj+9zTbbLJRtrs2fPza3Yv2l8vj7vx+T//LLL7N6fq5Zf+r777+v\n0uvYce/PFWsX+z6kXau8m266SZL02WefJb7222+/HXs9KToW/XHq20eF8MQTT0iK96/9sVEWO/6m\nTZsWYnZv9vNUdk1bEruW2bEpxee8SsnNN98sKbquen4s86GHHipYndLK+qaSdMABB0iKzxdb3yJt\nXnzxxdjP8rRp0yaUbdwzaTzCv97uu+9epToWkv1vpaiP4/t51k/K51yA77f4+TLTtWtXSfF7qt1X\nfN+v1Ocr/NjQ5ZdfLkk69dRTQ6xv376S4muYktoM1ckaa6whKT6HmdR+tr5+Guy7776hbHMh9evX\nz3icjbMvXkb5bG7c9y3snmTtPUl65513JEnHHntsiPl5iFLix5hef/31jFiSPn36SIqPWdl8nh9f\nt89h6NChualsHvlzZcstt5QUvw9be/2pp54KMbt2VqXf6NvCSfNXfqw97awfkdSWsc9SSsfxUhY/\nDnzGGWdIki644IIQq137v2XUc+fODTGb6/TnVFnjn/4+9cMPP0hKx5pj35dOuufamon99tuvoPXy\n/flizQ/bmiIpup/b2hApulbYsSJJbdu2zXgduxb7NZNJc7QtWrSQVP44e9OmTcuret699dZboTxx\n4kRJ0tVXXx1iuWiz2niPFI3p2JizVBrtQVu7J0kjRozI6jmrrLKKpGisQpL2339/SfF+l62nf+SR\n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\n7Hi3OUr/exurkKRnnnmmwn+vVNm1YsaMGSGWdL+2toDvq6Vds2bNQvmee+6RFJ+PMdnOp/jH2e/9\n8WXXXT+P9frrr4eyjbX7McXnn39eUrzdVeqaN28eyna8+L7Fr7/+Kqn8Nn/S5+nZfeDZZ58Nsf79\n+1eixvnRpk2bULb/Y3nHko2TppW/v9qx79sb9l6T/rfbbLNNmY/79NNPJUmvvfZamXV45JFHQtn6\nFPZTil/rqpv69euHso3f3HzzzSF2+umnF7xOFbX//vtLSl7j4O+9Nv7ur9k2bnnBBReEmF1vhg8f\nHmJdunSRJN155505qnVh2HouP3Zi54pfy3XAAQdIiq+rQdVtuummkqK+gxS/X59yyimS4tebNLH7\ntO9z29iEf082f5WGMWI/pmDnyscffxxi1g7083RJ7Y2XXnpJknTQQQeFmL1/f9+2NYJJ46B+Dtle\nL23q1KkjSXr55ZdDzN+7jd130nDPybU11lgjlL/88ktJ0Vzmktgx59eYnnnmmXmoXX74uVxbZ+XH\nFJo2bSop3h7Ef2ws0Ldd/TGUC/6aNmHCBEnR3IMUHadpZ/N1UjSn4q/tvXv3llRafcXFWb/H36es\n//Poo4+GmPW1/bot+26D/z6Frb3w41h2D/dzyHaM+HEJPx5mn6dfv+Ln9HLhoosukiRdfvnlOX3d\n8vjzw+Ympk+fHmL2nQo/l+77KIcddli+qxi88MILoWxzJ5LUp0+f2E/Pj0f06tUrI5akvLV/i/P9\nDT92XKptHbvu+rnOiy++WJI0b968ELP5Uf95fP/995Li97hvvvlGUrR+W4rWtO28884hZutOS5n1\nw+16KUnrrbeeJOnBBx8MsdNOO02S9Pfff4fYLrvskvE4+6zTcP8fO3ZsKCetDarKV+Uqek4lrX2T\n4u3EyirrfaR7JBIAAAAAAAAAAAAAAAAAAAAAAAAAgBoit1uzlzi/u4ntvud3IzX+G5SDBw+WFN+h\nzHaist2SS4Xt8Ol3jbddIVZfffUQ8zvC27d6/Y5i48aNkxTfldV2F7ddtjz/7Vfb7d/vMGC7sfrd\nc5J2qS019o37k08+OcSy3aXXdpWy40eKdiCwnWv96/n/SRo89NBDGTH73/vPwTJ/jBo1KsTs936H\npYp+gzpt7P35naaS2PHgv2U/ceLE/FWsRNnn4Hd58ZkB06J169ahbDu+77DDDhV+naTzw++68MUX\n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\nQ0lS//79JUl//vlniI0cOVJS9N4l6auvvpKUPH+Q1s8jySqrrJJRXn/99bN6rm8rr7322hkxG3st\n67pTyrLtNw8cODCxjPK99dZbkuL39dmzZxerOjnRokWLUL7pppsyYvZefXsw6VizfkTr1q1DzD4b\n68tLUufOnUPZjzcXkt03J06cmLe/4d/nyy+/LCldc24VscYaa0iSlltuuTIfVwptlFzYZpttQtnm\nYKTs2zL2OcydOzfEpk+fLkn68MMPMx5Xu3a0rMKOWd/f8G0iG/co1vznAQccEMqDBw8O5bXWWivj\nsdnOv91///2SpMcffzzEbJzh22+/zXi89b+kdF2fn3/++VBu06aNpMr1dXr37p3V43bdddeM8uWX\nXx5iffr0qfDfzgVbo7B4GYXRtWvXULZz8+effy5WdarEj/naPF2rVq1CzK6XTz31VIj9/fffWb22\n3ePvvPPOKtaysEaMGCFJ6t69e4jZWgN/vdl4440lxcf4UD6/buPwww+XJJ188skh1qxZs4zn+PmI\nJ554Io+1yw8b15OkPfbYI+P39957ryTpkUceKVidcumZZ54JZXt/thZSku677z5J0bklRffzpHl/\n3586+uijJUVrUjxbdyFFc+1+3iJNDjnkkFC+4IILJJXfvrHjxcZspHh/sixXXXVVKB9zzDGSpFGj\nRmVX2QLz828PPvigpPgcZlnzbn4c2O5xaR3H8nOGBx54YBFrkl6+T2RjDn7swdYNlydpjsLuZ1Lh\n1hrky8orrywpPg612267SYrPZdpcvO/PZttGLAV+Xu3SSy+VJD377LMhtt9++0mK35Psf+/7z7bW\nw/cFrrjiCknSrFmzQsyvNS42v6bal6vCxkn9HIz1m33bZ5NNNsl4bnljHdZ29G3AbNeC50ou5lf9\n+7RxBD+eYH/Dxjmk+PhHUl2s7Mc37H5h82eFctZZZ4Xy8ssvLyl+zbB1sn6Mr1+/fpLi32Upiz+n\n7LrrP0N/HS+FNqGNXa633nohduGFF0qKz9GmtW1SUf7YtvUfdevWzeq5/vyx71+98cYbITZlyhRJ\n8ePet3cXN2nSpKz+bq6RIRAAAAAAAAAAAAAAAAAAAAAAAAAAgBTgC4EAAAAAAAAAAAAAAAAAAAAA\nAAAAAKRA7WJXoFgsZayl5JWkiy++WJL0559/htj8+fMlSQ8//HCIHXHEEYWoYk5YOuDtt98+xOy9\n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\nNt988xC75JJLQvn222/PQ42rznZK9TuG23v2mUmrU7bjqrDrjY3FSNF1vKZkhvFsh0spylK22mqr\nhZj1I3xb0c6b8namtOPQ+r1SNOaRBkljOieeeGLi741lctpzzz0zHpe0q3+pscx3i5cR70v7DJDG\nxvF8FqIff/xRUvx6Yxl6/a7rdu+uTu3G559/PpRnzJghKT5ubuNgfhzYMhv73Va7dOmS8drWtkr7\nDtjIjWOPPVZSNHclSa+//rok6a+//ipKnXLJMtPbuLIUZSY566yzQsyfNxU1f/78Sj83n/KRGdCs\nueaakqL7tiSNHDkyb3+v1C1atCiUq8sYn5+L9se4ZdEaN25ciFl2AZ9J1H8m1YVlNfFjMT4D1TPP\nPCMpmveXovagzz42duxYSRXPCpg2lhVQivo9SePn/pyxHfT9+KG1iSqTXTBpZ3/Lnop0Ou644yQl\nrynymT023nhjSfFsZtYP98eP3Sv9OHxNVKptmcqw+ZOtt966zMfZseTbgzWZzwhnmYYsK5Mk1atX\nL+M5n3zyiaT4Wo6pU6dKkm677bYQS+s6A8tu4dcz2jyeZbmT0jVOl2TixImhbO0avy7Nyj6WLcs4\n7Z/r/17a2VyUZUySsl8rYPcdf/xY9iQ/HvTll1/mprIFdvzxx0uKMkdJ2X82do/3WSTTzveTklgW\nomuvvbbM51qWPx9r1KiRJOmiiy4KMcte6bPq2ToDSeratWvWdc+3nXbaKZRbtWolKb6+yNYXJymv\nbzF9+nRJ0pAhQ0LMsp2mdQzZj5Hb+eUzcVq2JhtTl6Lx5OqYFbCqyAxYPp+h1taT2k8p3ncvNn/+\n+36/fYcgKTufr7/FkjL7VYbPwlxWrJisbevXcto6JB+z+4bP6pYLfj1Py5Ytc/raVWVrQnNlvfXW\nkxRfJ5omvu1hfWnP5gj8HIytsSnvuLE2zIorrpjxO39eW4ZG/32tQiJDIAAAAAAAAAAAAAAAAAAA\nAAAAAAAAKcAXAgEAAAAAAAAAAAAAAAAAAAAAAAAASIHaxa5AsfkUp1dddZWkKMW5FKVzfO2110Js\nv/32K0zlCuC7776TJD3yyCMZv5s0aVKZz73zzjvzUaWCq107Og18Gu+ktN1XXHGFJOnNN9/M6rVn\nzZqVWDZHH3101vVMix122CGUkz5Di22//fYh9vDDD+e/Yjny0EMPSZIOPvjgEFtzzTVD2aeAzcYl\n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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "decision = tf.argmax(dnn_predicted_log_probs, axis=-1, output_type=tf.int32)\n", "confidence = tf.reduce_max(dnn_predicted_log_probs, axis=-1)\n", "threshold = 0.95\n", "\n", "decided_idx = tf.where(confidence > np.log(threshold))\n", "ordered = tf.argsort(confidence)\n", "\n", "n = datasets_info.splits['test'].num_examples\n", "x_final, y_final = next(iter(eval_dataset.batch(n)))\n", "\n", "print('Number of examples undecided: {}'.format(n - tf.size(decided_idx)))\n", "\n", "accurary = tf.reduce_mean(\n", " tf.cast(tf.equal(tf.gather(y_final, decided_idx),\n", " tf.gather(decision, decided_idx)),\n", " tf.float32))\n", "print('Accurary after excluding undecided ones: {}'.format(accurary))\n", "\n", "tfp_nn.util.display_imgs(\n", " tf.gather(x_final, ordered[0:50]),\n", " tf.gather(y_final, ordered[0:50]));" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "height": 201 }, "colab_type": "code", "id": "9M8hFsvLlymd", "outputId": "41738902-8fb9-4756-c7e9-0d5ffe4d6c2a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Per class AUC:\n", "[[0.99905177]\n", " [0.99976495]\n", " [0.9995598 ]\n", " [0.99976883]\n", " [0.99948807]\n", " [0.99970995]\n", " [0.99963312]\n", " [0.99960009]\n", " [0.99943057]\n", " [0.99946715]]\n" ] } ], "source": [ "from sklearn import metrics\n", "dnn_auc = np.array([\n", " metrics.roc_auc_score(tf.equal(y_final, i), dnn_predicted_log_probs[:, i])\n", " for i in range(10)])\n", "print('Per class AUC:\\n{}'.format(dnn_auc[:, np.newaxis]))" ] } ], "metadata": { "colab": { "collapsed_sections": [ "B0HrNKbJw2bA", "nbQ3rcTowypZ", "a_LR5N47a1ce" ], "name": "Variational Convolution with Reparameterization", "toc_visible": true }, "kernelspec": { "display_name": "Python 2", "name": "python2" } }, "nbformat": 4, "nbformat_minor": 0 }