├── .gitignore ├── ProtoNet-MiniImageNet-v2.ipynb ├── ProtoNet-Omniglot.ipynb ├── README.md ├── create_miniimagenet.py ├── data ├── mini-imagenet │ └── splits │ │ ├── test.csv │ │ ├── train.csv │ │ └── val.csv └── omniglot │ └── splits │ ├── test.txt │ ├── train.txt │ └── trainval.txt ├── download_miniimagenet.sh └── download_omniglot.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb* 2 | .DS_Store 3 | *.pyc 4 | data/omniglot/data/* 5 | *.zip 6 | *.npy 7 | *.tar 8 | *.JPEG 9 | -------------------------------------------------------------------------------- /ProtoNet-MiniImageNet-v2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/opt/anaconda3/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6\n", 13 | " return f(*args, **kwds)\n", 14 | "/opt/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 15 | " from ._conv import register_converters as _register_converters\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "%matplotlib inline\n", 21 | "from __future__ import print_function\n", 22 | "from PIL import Image\n", 23 | "import numpy as np\n", 24 | "import tensorflow as tf\n", 25 | "import os\n", 26 | "import glob\n", 27 | "import matplotlib.pyplot as plt" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": { 34 | "collapsed": true 35 | }, 36 | "outputs": [], 37 | "source": [ 38 | "def conv_block(inputs, out_channels, name='conv'):\n", 39 | " with tf.variable_scope(name):\n", 40 | " conv = tf.layers.conv2d(inputs, out_channels, kernel_size=3, padding='SAME')\n", 41 | " conv = tf.contrib.layers.batch_norm(conv, updates_collections=None, decay=0.99, scale=True, center=True)\n", 42 | " conv = tf.nn.relu(conv)\n", 43 | " conv = tf.contrib.layers.max_pool2d(conv, 2)\n", 44 | " return conv" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 3, 50 | "metadata": { 51 | "collapsed": true 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "def encoder(x, h_dim, z_dim, reuse=False):\n", 56 | " with tf.variable_scope('encoder', reuse=reuse):\n", 57 | " net = conv_block(x, h_dim, name='conv_1')\n", 58 | " net = conv_block(net, h_dim, name='conv_2')\n", 59 | " net = conv_block(net, h_dim, name='conv_3')\n", 60 | " net = conv_block(net, z_dim, name='conv_4')\n", 61 | " net = tf.contrib.layers.flatten(net)\n", 62 | " return net" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 4, 68 | "metadata": { 69 | "collapsed": true 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "def euclidean_distance(a, b):\n", 74 | " # a.shape = N x D\n", 75 | " # b.shape = M x D\n", 76 | " N, D = tf.shape(a)[0], tf.shape(a)[1]\n", 77 | " M = tf.shape(b)[0]\n", 78 | " a = tf.tile(tf.expand_dims(a, axis=1), (1, M, 1))\n", 79 | " b = tf.tile(tf.expand_dims(b, axis=0), (N, 1, 1))\n", 80 | " return tf.reduce_mean(tf.square(a - b), axis=2)" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 5, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [ 91 | "n_epochs = 100\n", 92 | "n_episodes = 100\n", 93 | "n_way = 20\n", 94 | "n_shot = 5\n", 95 | "n_query = 15\n", 96 | "n_examples = 350\n", 97 | "im_width, im_height, channels = 84, 84, 3\n", 98 | "h_dim = 64\n", 99 | "z_dim = 64" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 6, 105 | "metadata": {}, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "(64, 350, 84, 84, 3)\n" 112 | ] 113 | } 114 | ], 115 | "source": [ 116 | "# Load Train Dataset\n", 117 | "train_dataset = np.load('mini-imagenet-train.npy')\n", 118 | "n_classes = train_dataset.shape[0]\n", 119 | "print(train_dataset.shape)" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 7, 125 | "metadata": { 126 | "collapsed": true 127 | }, 128 | "outputs": [], 129 | "source": [ 130 | "x = tf.placeholder(tf.float32, [None, None, im_height, im_width, channels])\n", 131 | "q = tf.placeholder(tf.float32, [None, None, im_height, im_width, channels])\n", 132 | "x_shape = tf.shape(x)\n", 133 | "q_shape = tf.shape(q)\n", 134 | "num_classes, num_support = x_shape[0], x_shape[1]\n", 135 | "num_queries = q_shape[1]\n", 136 | "y = tf.placeholder(tf.int64, [None, None])\n", 137 | "y_one_hot = tf.one_hot(y, depth=num_classes)\n", 138 | "emb_in = encoder(tf.reshape(x, [num_classes * num_support, im_height, im_width, channels]), h_dim, z_dim)\n", 139 | "emb_dim = tf.shape(emb_in)[-1]\n", 140 | "emb_x = tf.reduce_mean(tf.reshape(emb_in, [num_classes, num_support, emb_dim]), axis=1)\n", 141 | "emb_q = encoder(tf.reshape(q, [num_classes * num_queries, im_height, im_width, channels]), h_dim, z_dim, reuse=True)\n", 142 | "dists = euclidean_distance(emb_q, emb_x)\n", 143 | "log_p_y = tf.reshape(tf.nn.log_softmax(-dists), [num_classes, num_queries, -1])\n", 144 | "ce_loss = -tf.reduce_mean(tf.reshape(tf.reduce_sum(tf.multiply(y_one_hot, log_p_y), axis=-1), [-1]))\n", 145 | "acc = tf.reduce_mean(tf.to_float(tf.equal(tf.argmax(log_p_y, axis=-1), y)))" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 8, 151 | "metadata": { 152 | "collapsed": true 153 | }, 154 | "outputs": [], 155 | "source": [ 156 | "train_op = tf.train.AdamOptimizer().minimize(ce_loss)" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 9, 162 | "metadata": { 163 | "collapsed": true 164 | }, 165 | "outputs": [], 166 | "source": [ 167 | "sess = tf.InteractiveSession()\n", 168 | "init_op = tf.global_variables_initializer()\n", 169 | "sess.run(init_op)" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 10, 175 | "metadata": {}, 176 | "outputs": [ 177 | { 178 | "name": "stdout", 179 | "output_type": "stream", 180 | "text": [ 181 | "[epoch 1/100, episode 50/100] => loss: 2.69017, acc: 0.20667\n", 182 | "[epoch 1/100, episode 100/100] => loss: 2.62193, acc: 0.22000\n", 183 | "[epoch 2/100, episode 50/100] => loss: 2.51031, acc: 0.31000\n", 184 | "[epoch 2/100, episode 100/100] => loss: 2.45286, acc: 0.23667\n", 185 | "[epoch 3/100, episode 50/100] => loss: 2.42127, acc: 0.28000\n", 186 | "[epoch 3/100, episode 100/100] => loss: 2.26645, acc: 0.30000\n", 187 | "[epoch 4/100, episode 50/100] => loss: 2.38223, acc: 0.28667\n", 188 | "[epoch 4/100, episode 100/100] => loss: 2.24251, acc: 0.33000\n", 189 | "[epoch 5/100, episode 50/100] => loss: 2.38313, acc: 0.27333\n", 190 | "[epoch 5/100, episode 100/100] => loss: 2.31108, acc: 0.29000\n", 191 | "[epoch 6/100, episode 50/100] => loss: 2.47622, acc: 0.24667\n", 192 | "[epoch 6/100, episode 100/100] => loss: 2.10669, acc: 0.35667\n", 193 | "[epoch 7/100, episode 50/100] => loss: 2.18633, acc: 0.32000\n", 194 | "[epoch 7/100, episode 100/100] => loss: 1.98386, acc: 0.40333\n", 195 | "[epoch 8/100, episode 50/100] => loss: 2.14229, acc: 0.33000\n", 196 | "[epoch 8/100, episode 100/100] => loss: 2.06077, acc: 0.34000\n", 197 | "[epoch 9/100, episode 50/100] => loss: 2.04110, acc: 0.38667\n", 198 | "[epoch 9/100, episode 100/100] => loss: 1.95181, acc: 0.42333\n", 199 | "[epoch 10/100, episode 50/100] => loss: 2.02502, acc: 0.43667\n", 200 | "[epoch 10/100, episode 100/100] => loss: 2.13865, acc: 0.36333\n", 201 | "[epoch 11/100, episode 50/100] => loss: 2.01281, acc: 0.42667\n", 202 | "[epoch 11/100, episode 100/100] => loss: 1.91510, acc: 0.42667\n", 203 | "[epoch 12/100, episode 50/100] => loss: 1.90876, acc: 0.40667\n", 204 | "[epoch 12/100, episode 100/100] => loss: 1.98502, acc: 0.38333\n", 205 | "[epoch 13/100, episode 50/100] => loss: 1.50182, acc: 0.57000\n", 206 | "[epoch 13/100, episode 100/100] => loss: 1.93777, acc: 0.44333\n", 207 | "[epoch 14/100, episode 50/100] => loss: 1.77546, acc: 0.49667\n", 208 | "[epoch 14/100, episode 100/100] => loss: 1.94018, acc: 0.39667\n", 209 | "[epoch 15/100, episode 50/100] => loss: 1.86552, acc: 0.47000\n", 210 | "[epoch 15/100, episode 100/100] => loss: 1.65558, acc: 0.50667\n", 211 | "[epoch 16/100, episode 50/100] => loss: 1.63510, acc: 0.48333\n", 212 | "[epoch 16/100, episode 100/100] => loss: 1.58389, acc: 0.50333\n", 213 | "[epoch 17/100, episode 50/100] => loss: 1.80113, acc: 0.45333\n", 214 | "[epoch 17/100, episode 100/100] => loss: 1.72561, acc: 0.45667\n", 215 | "[epoch 18/100, episode 50/100] => loss: 1.59451, acc: 0.54000\n", 216 | "[epoch 18/100, episode 100/100] => loss: 1.32419, acc: 0.56667\n", 217 | "[epoch 19/100, episode 50/100] => loss: 1.79173, acc: 0.45333\n", 218 | "[epoch 19/100, episode 100/100] => loss: 1.59730, acc: 0.48000\n", 219 | "[epoch 20/100, episode 50/100] => loss: 1.37459, acc: 0.56333\n", 220 | "[epoch 20/100, episode 100/100] => loss: 1.64148, acc: 0.49333\n", 221 | "[epoch 21/100, episode 50/100] => loss: 1.56434, acc: 0.50000\n", 222 | "[epoch 21/100, episode 100/100] => loss: 1.55470, acc: 0.50000\n", 223 | "[epoch 22/100, episode 50/100] => loss: 1.65613, acc: 0.48667\n", 224 | "[epoch 22/100, episode 100/100] => loss: 1.78783, acc: 0.44333\n", 225 | "[epoch 23/100, episode 50/100] => loss: 1.51189, acc: 0.51667\n", 226 | "[epoch 23/100, episode 100/100] => loss: 1.41521, acc: 0.56333\n", 227 | "[epoch 24/100, episode 50/100] => loss: 1.17772, acc: 0.63333\n", 228 | "[epoch 24/100, episode 100/100] => loss: 1.46862, acc: 0.51000\n", 229 | "[epoch 25/100, episode 50/100] => loss: 1.41338, acc: 0.54667\n", 230 | "[epoch 25/100, episode 100/100] => loss: 1.72840, acc: 0.47000\n", 231 | "[epoch 26/100, episode 50/100] => loss: 1.35231, acc: 0.61000\n", 232 | "[epoch 26/100, episode 100/100] => loss: 1.62084, acc: 0.52000\n", 233 | "[epoch 27/100, episode 50/100] => loss: 1.53799, acc: 0.54333\n", 234 | "[epoch 27/100, episode 100/100] => loss: 1.51373, acc: 0.53000\n", 235 | "[epoch 28/100, episode 50/100] => loss: 1.51453, acc: 0.49667\n", 236 | "[epoch 28/100, episode 100/100] => loss: 1.55236, acc: 0.53000\n", 237 | "[epoch 29/100, episode 50/100] => loss: 1.38276, acc: 0.60333\n", 238 | "[epoch 29/100, episode 100/100] => loss: 1.51991, acc: 0.52333\n", 239 | "[epoch 30/100, episode 50/100] => loss: 1.31121, acc: 0.58000\n", 240 | "[epoch 30/100, episode 100/100] => loss: 1.44205, acc: 0.51667\n", 241 | "[epoch 31/100, episode 50/100] => loss: 1.40513, acc: 0.58667\n", 242 | "[epoch 31/100, episode 100/100] => loss: 1.34681, acc: 0.55333\n", 243 | "[epoch 32/100, episode 50/100] => loss: 1.09313, acc: 0.64333\n", 244 | "[epoch 32/100, episode 100/100] => loss: 1.22875, acc: 0.60000\n", 245 | "[epoch 33/100, episode 50/100] => loss: 1.28800, acc: 0.59667\n", 246 | "[epoch 33/100, episode 100/100] => loss: 1.24231, acc: 0.60333\n", 247 | "[epoch 34/100, episode 50/100] => loss: 1.54579, acc: 0.54000\n", 248 | "[epoch 34/100, episode 100/100] => loss: 1.58468, acc: 0.51667\n", 249 | "[epoch 35/100, episode 50/100] => loss: 1.19139, acc: 0.65000\n", 250 | "[epoch 35/100, episode 100/100] => loss: 1.13386, acc: 0.65333\n", 251 | "[epoch 36/100, episode 50/100] => loss: 1.13750, acc: 0.65000\n", 252 | "[epoch 36/100, episode 100/100] => loss: 1.12717, acc: 0.65000\n", 253 | "[epoch 37/100, episode 50/100] => loss: 1.14984, acc: 0.63000\n", 254 | "[epoch 37/100, episode 100/100] => loss: 1.41328, acc: 0.56667\n", 255 | "[epoch 38/100, episode 50/100] => loss: 1.17146, acc: 0.63667\n", 256 | "[epoch 38/100, episode 100/100] => loss: 1.25045, acc: 0.59667\n", 257 | "[epoch 39/100, episode 50/100] => loss: 1.23620, acc: 0.61667\n", 258 | "[epoch 39/100, episode 100/100] => loss: 1.28020, acc: 0.59333\n", 259 | "[epoch 40/100, episode 50/100] => loss: 1.21337, acc: 0.64667\n", 260 | "[epoch 40/100, episode 100/100] => loss: 1.08524, acc: 0.64333\n", 261 | "[epoch 41/100, episode 50/100] => loss: 1.39941, acc: 0.56000\n", 262 | "[epoch 41/100, episode 100/100] => loss: 1.10008, acc: 0.63667\n", 263 | "[epoch 42/100, episode 50/100] => loss: 1.15060, acc: 0.62000\n", 264 | "[epoch 42/100, episode 100/100] => loss: 0.98444, acc: 0.72000\n", 265 | "[epoch 43/100, episode 50/100] => loss: 1.04643, acc: 0.69333\n", 266 | "[epoch 43/100, episode 100/100] => loss: 0.91946, acc: 0.67000\n", 267 | "[epoch 44/100, episode 50/100] => loss: 1.37232, acc: 0.55000\n", 268 | "[epoch 44/100, episode 100/100] => loss: 0.88298, acc: 0.71000\n", 269 | "[epoch 45/100, episode 50/100] => loss: 1.27201, acc: 0.60000\n", 270 | "[epoch 45/100, episode 100/100] => loss: 1.04238, acc: 0.66667\n", 271 | "[epoch 46/100, episode 50/100] => loss: 0.90718, acc: 0.71000\n", 272 | "[epoch 46/100, episode 100/100] => loss: 0.95038, acc: 0.70000\n", 273 | "[epoch 47/100, episode 50/100] => loss: 0.90081, acc: 0.70667\n", 274 | "[epoch 47/100, episode 100/100] => loss: 1.20066, acc: 0.62333\n", 275 | "[epoch 48/100, episode 50/100] => loss: 1.12504, acc: 0.64333\n", 276 | "[epoch 48/100, episode 100/100] => loss: 1.07760, acc: 0.64000\n", 277 | "[epoch 49/100, episode 50/100] => loss: 1.09150, acc: 0.62667\n", 278 | "[epoch 49/100, episode 100/100] => loss: 1.03099, acc: 0.64333\n", 279 | "[epoch 50/100, episode 50/100] => loss: 0.97820, acc: 0.69000\n", 280 | "[epoch 50/100, episode 100/100] => loss: 0.98357, acc: 0.68667\n", 281 | "[epoch 51/100, episode 50/100] => loss: 1.14722, acc: 0.64667\n", 282 | "[epoch 51/100, episode 100/100] => loss: 1.02937, acc: 0.66667\n", 283 | "[epoch 52/100, episode 50/100] => loss: 0.79986, acc: 0.73333\n", 284 | "[epoch 52/100, episode 100/100] => loss: 0.92750, acc: 0.66000\n", 285 | "[epoch 53/100, episode 50/100] => loss: 1.11248, acc: 0.65667\n", 286 | "[epoch 53/100, episode 100/100] => loss: 0.83383, acc: 0.73333\n", 287 | "[epoch 54/100, episode 50/100] => loss: 1.07523, acc: 0.64667\n", 288 | "[epoch 54/100, episode 100/100] => loss: 1.08648, acc: 0.64333\n", 289 | "[epoch 55/100, episode 50/100] => loss: 1.01954, acc: 0.71000\n", 290 | "[epoch 55/100, episode 100/100] => loss: 1.29215, acc: 0.59000\n", 291 | "[epoch 56/100, episode 50/100] => loss: 0.94483, acc: 0.71667\n", 292 | "[epoch 56/100, episode 100/100] => loss: 1.19276, acc: 0.61000\n", 293 | "[epoch 57/100, episode 50/100] => loss: 1.17294, acc: 0.62000\n", 294 | "[epoch 57/100, episode 100/100] => loss: 0.89490, acc: 0.72000\n", 295 | "[epoch 58/100, episode 50/100] => loss: 0.84367, acc: 0.69000\n", 296 | "[epoch 58/100, episode 100/100] => loss: 0.75373, acc: 0.74000\n", 297 | "[epoch 59/100, episode 50/100] => loss: 1.38641, acc: 0.54333\n", 298 | "[epoch 59/100, episode 100/100] => loss: 0.89069, acc: 0.67333\n", 299 | "[epoch 60/100, episode 50/100] => loss: 1.02767, acc: 0.67000\n", 300 | "[epoch 60/100, episode 100/100] => loss: 0.92385, acc: 0.71000\n", 301 | "[epoch 61/100, episode 50/100] => loss: 0.93583, acc: 0.67000\n", 302 | "[epoch 61/100, episode 100/100] => loss: 1.00921, acc: 0.67667\n", 303 | "[epoch 62/100, episode 50/100] => loss: 0.95597, acc: 0.70667\n", 304 | "[epoch 62/100, episode 100/100] => loss: 0.92837, acc: 0.70667\n", 305 | "[epoch 63/100, episode 50/100] => loss: 0.94225, acc: 0.72667\n", 306 | "[epoch 63/100, episode 100/100] => loss: 0.96014, acc: 0.67000\n", 307 | "[epoch 64/100, episode 50/100] => loss: 0.99320, acc: 0.68333\n", 308 | "[epoch 64/100, episode 100/100] => loss: 1.10530, acc: 0.65333\n", 309 | "[epoch 65/100, episode 50/100] => loss: 1.25567, acc: 0.56333\n", 310 | "[epoch 65/100, episode 100/100] => loss: 0.91934, acc: 0.70667\n", 311 | "[epoch 66/100, episode 50/100] => loss: 1.01590, acc: 0.66333\n", 312 | "[epoch 66/100, episode 100/100] => loss: 0.95707, acc: 0.69333\n" 313 | ] 314 | }, 315 | { 316 | "name": "stdout", 317 | "output_type": "stream", 318 | "text": [ 319 | "[epoch 67/100, episode 50/100] => loss: 0.88438, acc: 0.76333\n", 320 | "[epoch 67/100, episode 100/100] => loss: 0.86021, acc: 0.70000\n", 321 | "[epoch 68/100, episode 50/100] => loss: 0.90512, acc: 0.71333\n", 322 | "[epoch 68/100, episode 100/100] => loss: 0.79389, acc: 0.77000\n", 323 | "[epoch 69/100, episode 50/100] => loss: 0.91446, acc: 0.72667\n", 324 | "[epoch 69/100, episode 100/100] => loss: 0.89832, acc: 0.69333\n", 325 | "[epoch 70/100, episode 50/100] => loss: 0.95540, acc: 0.67333\n", 326 | "[epoch 70/100, episode 100/100] => loss: 1.07609, acc: 0.62667\n", 327 | "[epoch 71/100, episode 50/100] => loss: 1.08928, acc: 0.64333\n", 328 | "[epoch 71/100, episode 100/100] => loss: 0.90997, acc: 0.67000\n", 329 | "[epoch 72/100, episode 50/100] => loss: 0.79448, acc: 0.72333\n", 330 | "[epoch 72/100, episode 100/100] => loss: 0.77371, acc: 0.73667\n", 331 | "[epoch 73/100, episode 50/100] => loss: 0.63826, acc: 0.79000\n", 332 | "[epoch 73/100, episode 100/100] => loss: 0.75410, acc: 0.76000\n", 333 | "[epoch 74/100, episode 50/100] => loss: 0.96961, acc: 0.64667\n", 334 | "[epoch 74/100, episode 100/100] => loss: 0.88101, acc: 0.67667\n", 335 | "[epoch 75/100, episode 50/100] => loss: 0.85899, acc: 0.69667\n", 336 | "[epoch 75/100, episode 100/100] => loss: 0.94597, acc: 0.69667\n", 337 | "[epoch 76/100, episode 50/100] => loss: 0.93994, acc: 0.68000\n", 338 | "[epoch 76/100, episode 100/100] => loss: 0.54533, acc: 0.83667\n", 339 | "[epoch 77/100, episode 50/100] => loss: 0.90308, acc: 0.68000\n", 340 | "[epoch 77/100, episode 100/100] => loss: 0.68016, acc: 0.77667\n", 341 | "[epoch 78/100, episode 50/100] => loss: 0.91502, acc: 0.71333\n", 342 | "[epoch 78/100, episode 100/100] => loss: 0.84703, acc: 0.72000\n", 343 | "[epoch 79/100, episode 50/100] => loss: 0.74440, acc: 0.75333\n", 344 | "[epoch 79/100, episode 100/100] => loss: 0.95667, acc: 0.65667\n", 345 | "[epoch 80/100, episode 50/100] => loss: 0.72628, acc: 0.77000\n", 346 | "[epoch 80/100, episode 100/100] => loss: 1.20363, acc: 0.62667\n", 347 | "[epoch 81/100, episode 50/100] => loss: 0.80830, acc: 0.73333\n", 348 | "[epoch 81/100, episode 100/100] => loss: 0.78536, acc: 0.72667\n", 349 | "[epoch 82/100, episode 50/100] => loss: 0.77401, acc: 0.72000\n", 350 | "[epoch 82/100, episode 100/100] => loss: 0.64638, acc: 0.78667\n", 351 | "[epoch 83/100, episode 50/100] => loss: 0.72389, acc: 0.76333\n", 352 | "[epoch 83/100, episode 100/100] => loss: 0.98313, acc: 0.67333\n", 353 | "[epoch 84/100, episode 50/100] => loss: 0.86942, acc: 0.73333\n", 354 | "[epoch 84/100, episode 100/100] => loss: 0.91076, acc: 0.70000\n", 355 | "[epoch 85/100, episode 50/100] => loss: 0.82332, acc: 0.71000\n", 356 | "[epoch 85/100, episode 100/100] => loss: 0.91918, acc: 0.68667\n", 357 | "[epoch 86/100, episode 50/100] => loss: 0.85601, acc: 0.71667\n", 358 | "[epoch 86/100, episode 100/100] => loss: 0.95215, acc: 0.67333\n", 359 | "[epoch 87/100, episode 50/100] => loss: 0.76433, acc: 0.75000\n", 360 | "[epoch 87/100, episode 100/100] => loss: 0.62900, acc: 0.75333\n", 361 | "[epoch 88/100, episode 50/100] => loss: 0.94948, acc: 0.68667\n", 362 | "[epoch 88/100, episode 100/100] => loss: 0.70091, acc: 0.77000\n", 363 | "[epoch 89/100, episode 50/100] => loss: 0.70517, acc: 0.75333\n", 364 | "[epoch 89/100, episode 100/100] => loss: 0.86017, acc: 0.70333\n", 365 | "[epoch 90/100, episode 50/100] => loss: 0.91102, acc: 0.69333\n", 366 | "[epoch 90/100, episode 100/100] => loss: 0.55505, acc: 0.80000\n", 367 | "[epoch 91/100, episode 50/100] => loss: 0.62219, acc: 0.80333\n", 368 | "[epoch 91/100, episode 100/100] => loss: 0.78228, acc: 0.74667\n", 369 | "[epoch 92/100, episode 50/100] => loss: 0.66140, acc: 0.74667\n", 370 | "[epoch 92/100, episode 100/100] => loss: 0.81554, acc: 0.72000\n", 371 | "[epoch 93/100, episode 50/100] => loss: 0.76939, acc: 0.74000\n", 372 | "[epoch 93/100, episode 100/100] => loss: 0.75672, acc: 0.74333\n", 373 | "[epoch 94/100, episode 50/100] => loss: 0.81159, acc: 0.71000\n", 374 | "[epoch 94/100, episode 100/100] => loss: 0.80201, acc: 0.72667\n", 375 | "[epoch 95/100, episode 50/100] => loss: 0.86675, acc: 0.74333\n", 376 | "[epoch 95/100, episode 100/100] => loss: 0.60115, acc: 0.79333\n", 377 | "[epoch 96/100, episode 50/100] => loss: 0.75666, acc: 0.73667\n", 378 | "[epoch 96/100, episode 100/100] => loss: 0.80603, acc: 0.73667\n", 379 | "[epoch 97/100, episode 50/100] => loss: 0.79783, acc: 0.72333\n", 380 | "[epoch 97/100, episode 100/100] => loss: 0.84759, acc: 0.71333\n", 381 | "[epoch 98/100, episode 50/100] => loss: 0.73558, acc: 0.73333\n", 382 | "[epoch 98/100, episode 100/100] => loss: 0.74539, acc: 0.74333\n", 383 | "[epoch 99/100, episode 50/100] => loss: 0.90639, acc: 0.68667\n", 384 | "[epoch 99/100, episode 100/100] => loss: 0.56291, acc: 0.80333\n", 385 | "[epoch 100/100, episode 50/100] => loss: 0.71471, acc: 0.76667\n", 386 | "[epoch 100/100, episode 100/100] => loss: 0.70881, acc: 0.76333\n" 387 | ] 388 | } 389 | ], 390 | "source": [ 391 | "for ep in range(n_epochs):\n", 392 | " for epi in range(n_episodes):\n", 393 | " epi_classes = np.random.permutation(n_classes)[:n_way]\n", 394 | " support = np.zeros([n_way, n_shot, im_height, im_width, channels], dtype=np.float32)\n", 395 | " query = np.zeros([n_way, n_query, im_height, im_width, channels], dtype=np.float32)\n", 396 | " for i, epi_cls in enumerate(epi_classes):\n", 397 | " selected = np.random.permutation(n_examples)[:n_shot + n_query]\n", 398 | " support[i] = train_dataset[epi_cls, selected[:n_shot]]\n", 399 | " query[i] = train_dataset[epi_cls, selected[n_shot:]]\n", 400 | " # support = np.expand_dims(support, axis=-1)\n", 401 | " # query = np.expand_dims(query, axis=-1)\n", 402 | " labels = np.tile(np.arange(n_way)[:, np.newaxis], (1, n_query)).astype(np.uint8)\n", 403 | " _, ls, ac = sess.run([train_op, ce_loss, acc], feed_dict={x: support, q: query, y:labels})\n", 404 | " if (epi+1) % 50 == 0:\n", 405 | " print('[epoch {}/{}, episode {}/{}] => loss: {:.5f}, acc: {:.5f}'.format(ep+1, n_epochs, epi+1, n_episodes, ls, ac))" 406 | ] 407 | }, 408 | { 409 | "cell_type": "code", 410 | "execution_count": 11, 411 | "metadata": {}, 412 | "outputs": [ 413 | { 414 | "name": "stdout", 415 | "output_type": "stream", 416 | "text": [ 417 | "(20, 350, 84, 84, 3)\n" 418 | ] 419 | } 420 | ], 421 | "source": [ 422 | "# Load Test Dataset\n", 423 | "test_dataset = np.load('mini-imagenet-test.npy')\n", 424 | "n_test_classes = test_dataset.shape[0]\n", 425 | "print(test_dataset.shape)" 426 | ] 427 | }, 428 | { 429 | "cell_type": "code", 430 | "execution_count": 12, 431 | "metadata": { 432 | "collapsed": true 433 | }, 434 | "outputs": [], 435 | "source": [ 436 | "n_test_episodes = 600\n", 437 | "n_test_way = 5\n", 438 | "n_test_shot = 5\n", 439 | "n_test_query = 15" 440 | ] 441 | }, 442 | { 443 | "cell_type": "code", 444 | "execution_count": 13, 445 | "metadata": {}, 446 | "outputs": [ 447 | { 448 | "name": "stdout", 449 | "output_type": "stream", 450 | "text": [ 451 | "Testing...\n", 452 | "[test episode 50/600] => loss: 1.05772, acc: 0.58667\n", 453 | "[test episode 100/600] => loss: 1.33291, acc: 0.48000\n", 454 | "[test episode 150/600] => loss: 0.58527, acc: 0.73333\n", 455 | "[test episode 200/600] => loss: 0.65924, acc: 0.69333\n", 456 | "[test episode 250/600] => loss: 1.12209, acc: 0.52000\n", 457 | "[test episode 300/600] => loss: 0.97975, acc: 0.68000\n", 458 | "[test episode 350/600] => loss: 1.05668, acc: 0.65333\n", 459 | "[test episode 400/600] => loss: 0.98864, acc: 0.68000\n", 460 | "[test episode 450/600] => loss: 1.04565, acc: 0.65333\n", 461 | "[test episode 500/600] => loss: 0.72200, acc: 0.72000\n", 462 | "[test episode 550/600] => loss: 0.77793, acc: 0.77333\n", 463 | "[test episode 600/600] => loss: 0.94674, acc: 0.62667\n", 464 | "Average Test Accuracy: 0.61807\n" 465 | ] 466 | } 467 | ], 468 | "source": [ 469 | "print('Testing...')\n", 470 | "avg_acc = 0.\n", 471 | "for epi in range(n_test_episodes):\n", 472 | " epi_classes = np.random.permutation(n_test_classes)[:n_test_way]\n", 473 | " support = np.zeros([n_test_way, n_test_shot, im_height, im_width, channels], dtype=np.float32)\n", 474 | " query = np.zeros([n_test_way, n_test_query, im_height, im_width, channels], dtype=np.float32)\n", 475 | " for i, epi_cls in enumerate(epi_classes):\n", 476 | " selected = np.random.permutation(n_examples)[:n_test_shot + n_test_query]\n", 477 | " support[i] = test_dataset[epi_cls, selected[:n_test_shot]]\n", 478 | " query[i] = test_dataset[epi_cls, selected[n_test_shot:]]\n", 479 | " # support = np.expand_dims(support, axis=-1)\n", 480 | " # query = np.expand_dims(query, axis=-1)\n", 481 | " labels = np.tile(np.arange(n_test_way)[:, np.newaxis], (1, n_test_query)).astype(np.uint8)\n", 482 | " ls, ac = sess.run([ce_loss, acc], feed_dict={x: support, q: query, y:labels})\n", 483 | " avg_acc += ac\n", 484 | " if (epi+1) % 50 == 0:\n", 485 | " print('[test episode {}/{}] => loss: {:.5f}, acc: {:.5f}'.format(epi+1, n_test_episodes, ls, ac))\n", 486 | "avg_acc /= n_test_episodes\n", 487 | "print('Average Test Accuracy: {:.5f}'.format(avg_acc))" 488 | ] 489 | }, 490 | { 491 | "cell_type": "code", 492 | "execution_count": null, 493 | "metadata": { 494 | "collapsed": true 495 | }, 496 | "outputs": [], 497 | "source": [] 498 | } 499 | ], 500 | "metadata": { 501 | "kernelspec": { 502 | "display_name": "Python 2", 503 | "language": "python", 504 | "name": "python2" 505 | }, 506 | "language_info": { 507 | "codemirror_mode": { 508 | "name": "ipython", 509 | "version": 2 510 | }, 511 | "file_extension": ".py", 512 | "mimetype": "text/x-python", 513 | "name": "python", 514 | "nbconvert_exporter": "python", 515 | "pygments_lexer": "ipython2", 516 | "version": "2.7.14" 517 | } 518 | }, 519 | "nbformat": 4, 520 | "nbformat_minor": 2 521 | } 522 | -------------------------------------------------------------------------------- /ProtoNet-Omniglot.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/opt/anaconda3/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6\n", 13 | " return f(*args, **kwds)\n", 14 | "/opt/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 15 | " from ._conv import register_converters as _register_converters\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "%matplotlib inline\n", 21 | "from __future__ import print_function\n", 22 | "from PIL import Image\n", 23 | "import numpy as np\n", 24 | "import tensorflow as tf\n", 25 | "import os\n", 26 | "import glob\n", 27 | "import matplotlib.pyplot as plt" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": { 34 | "collapsed": true 35 | }, 36 | "outputs": [], 37 | "source": [ 38 | "def conv_block(inputs, out_channels, name='conv'):\n", 39 | " with tf.variable_scope(name):\n", 40 | " conv = tf.layers.conv2d(inputs, out_channels, kernel_size=3, padding='SAME')\n", 41 | " conv = tf.contrib.layers.batch_norm(conv, updates_collections=None, decay=0.99, scale=True, center=True)\n", 42 | " conv = tf.nn.relu(conv)\n", 43 | " conv = tf.contrib.layers.max_pool2d(conv, 2)\n", 44 | " return conv" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 3, 50 | "metadata": { 51 | "collapsed": true 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "def encoder(x, h_dim, z_dim, reuse=False):\n", 56 | " with tf.variable_scope('encoder', reuse=reuse):\n", 57 | " net = conv_block(x, h_dim, name='conv_1')\n", 58 | " net = conv_block(net, h_dim, name='conv_2')\n", 59 | " net = conv_block(net, h_dim, name='conv_3')\n", 60 | " net = conv_block(net, z_dim, name='conv_4')\n", 61 | " net = tf.contrib.layers.flatten(net)\n", 62 | " return net" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 4, 68 | "metadata": { 69 | "collapsed": true 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "def euclidean_distance(a, b):\n", 74 | " # a.shape = N x D\n", 75 | " # b.shape = M x D\n", 76 | " N, D = tf.shape(a)[0], tf.shape(a)[1]\n", 77 | " M = tf.shape(b)[0]\n", 78 | " a = tf.tile(tf.expand_dims(a, axis=1), (1, M, 1))\n", 79 | " b = tf.tile(tf.expand_dims(b, axis=0), (N, 1, 1))\n", 80 | " return tf.reduce_mean(tf.square(a - b), axis=2)" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 5, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [ 91 | "n_epochs = 20\n", 92 | "n_episodes = 100\n", 93 | "n_way = 60\n", 94 | "n_shot = 5\n", 95 | "n_query = 5\n", 96 | "n_examples = 20\n", 97 | "im_width, im_height, channels = 28, 28, 1\n", 98 | "h_dim = 64\n", 99 | "z_dim = 64" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 6, 105 | "metadata": {}, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "(4112, 20, 28, 28)\n" 112 | ] 113 | } 114 | ], 115 | "source": [ 116 | "# Load Train Dataset\n", 117 | "root_dir = './data/omniglot'\n", 118 | "train_split_path = os.path.join(root_dir, 'splits', 'train.txt')\n", 119 | "with open(train_split_path, 'r') as train_split:\n", 120 | " train_classes = [line.rstrip() for line in train_split.readlines()]\n", 121 | "n_classes = len(train_classes)\n", 122 | "train_dataset = np.zeros([n_classes, n_examples, im_height, im_width], dtype=np.float32)\n", 123 | "for i, tc in enumerate(train_classes):\n", 124 | " alphabet, character, rotation = tc.split('/')\n", 125 | " rotation = float(rotation[3:])\n", 126 | " im_dir = os.path.join(root_dir, 'data', alphabet, character)\n", 127 | " im_files = sorted(glob.glob(os.path.join(im_dir, '*.png')))\n", 128 | " for j, im_file in enumerate(im_files):\n", 129 | " im = 1. - np.array(Image.open(im_file).rotate(rotation).resize((im_width, im_height)), np.float32, copy=False)\n", 130 | " train_dataset[i, j] = im\n", 131 | "print(train_dataset.shape)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 7, 137 | "metadata": { 138 | "collapsed": true 139 | }, 140 | "outputs": [], 141 | "source": [ 142 | "x = tf.placeholder(tf.float32, [None, None, im_height, im_width, channels])\n", 143 | "q = tf.placeholder(tf.float32, [None, None, im_height, im_width, channels])\n", 144 | "x_shape = tf.shape(x)\n", 145 | "q_shape = tf.shape(q)\n", 146 | "num_classes, num_support = x_shape[0], x_shape[1]\n", 147 | "num_queries = q_shape[1]\n", 148 | "y = tf.placeholder(tf.int64, [None, None])\n", 149 | "y_one_hot = tf.one_hot(y, depth=num_classes)\n", 150 | "emb_x = encoder(tf.reshape(x, [num_classes * num_support, im_height, im_width, channels]), h_dim, z_dim)\n", 151 | "emb_dim = tf.shape(emb_x)[-1]\n", 152 | "emb_x = tf.reduce_mean(tf.reshape(emb_x, [num_classes, num_support, emb_dim]), axis=1)\n", 153 | "emb_q = encoder(tf.reshape(q, [num_classes * num_queries, im_height, im_width, channels]), h_dim, z_dim, reuse=True)\n", 154 | "dists = euclidean_distance(emb_q, emb_x)\n", 155 | "log_p_y = tf.reshape(tf.nn.log_softmax(-dists), [num_classes, num_queries, -1])\n", 156 | "ce_loss = -tf.reduce_mean(tf.reshape(tf.reduce_sum(tf.multiply(y_one_hot, log_p_y), axis=-1), [-1]))\n", 157 | "acc = tf.reduce_mean(tf.to_float(tf.equal(tf.argmax(log_p_y, axis=-1), y)))" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 8, 163 | "metadata": { 164 | "collapsed": true 165 | }, 166 | "outputs": [], 167 | "source": [ 168 | "train_op = tf.train.AdamOptimizer().minimize(ce_loss)" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 9, 174 | "metadata": { 175 | "collapsed": true 176 | }, 177 | "outputs": [], 178 | "source": [ 179 | "sess = tf.InteractiveSession()\n", 180 | "init_op = tf.global_variables_initializer()\n", 181 | "sess.run(init_op)" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": 10, 187 | "metadata": {}, 188 | "outputs": [ 189 | { 190 | "name": "stdout", 191 | "output_type": "stream", 192 | "text": [ 193 | "[epoch 1/20, episode 50/100] => loss: 2.05681, acc: 0.69667\n", 194 | "[epoch 1/20, episode 100/100] => loss: 1.31057, acc: 0.84333\n", 195 | "[epoch 2/20, episode 50/100] => loss: 0.95323, acc: 0.85667\n", 196 | "[epoch 2/20, episode 100/100] => loss: 0.77123, acc: 0.90667\n", 197 | "[epoch 3/20, episode 50/100] => loss: 0.56138, acc: 0.93333\n", 198 | "[epoch 3/20, episode 100/100] => loss: 0.56206, acc: 0.91667\n", 199 | "[epoch 4/20, episode 50/100] => loss: 0.41580, acc: 0.95000\n", 200 | "[epoch 4/20, episode 100/100] => loss: 0.32341, acc: 0.95333\n", 201 | "[epoch 5/20, episode 50/100] => loss: 0.21081, acc: 0.98667\n", 202 | "[epoch 5/20, episode 100/100] => loss: 0.23478, acc: 0.97333\n", 203 | "[epoch 6/20, episode 50/100] => loss: 0.18931, acc: 0.96000\n", 204 | "[epoch 6/20, episode 100/100] => loss: 0.25989, acc: 0.93333\n", 205 | "[epoch 7/20, episode 50/100] => loss: 0.16271, acc: 0.97667\n", 206 | "[epoch 7/20, episode 100/100] => loss: 0.18911, acc: 0.96000\n", 207 | "[epoch 8/20, episode 50/100] => loss: 0.19383, acc: 0.96333\n", 208 | "[epoch 8/20, episode 100/100] => loss: 0.16333, acc: 0.96333\n", 209 | "[epoch 9/20, episode 50/100] => loss: 0.13290, acc: 0.98000\n", 210 | "[epoch 9/20, episode 100/100] => loss: 0.12453, acc: 0.98000\n", 211 | "[epoch 10/20, episode 50/100] => loss: 0.15873, acc: 0.97000\n", 212 | "[epoch 10/20, episode 100/100] => loss: 0.14228, acc: 0.97000\n", 213 | "[epoch 11/20, episode 50/100] => loss: 0.09097, acc: 0.98333\n", 214 | "[epoch 11/20, episode 100/100] => loss: 0.10532, acc: 0.98333\n", 215 | "[epoch 12/20, episode 50/100] => loss: 0.16229, acc: 0.95667\n", 216 | "[epoch 12/20, episode 100/100] => loss: 0.13725, acc: 0.97333\n", 217 | "[epoch 13/20, episode 50/100] => loss: 0.08362, acc: 0.98000\n", 218 | "[epoch 13/20, episode 100/100] => loss: 0.14789, acc: 0.97667\n", 219 | "[epoch 14/20, episode 50/100] => loss: 0.10677, acc: 0.98667\n", 220 | "[epoch 14/20, episode 100/100] => loss: 0.06838, acc: 0.98667\n", 221 | "[epoch 15/20, episode 50/100] => loss: 0.10952, acc: 0.98667\n", 222 | "[epoch 15/20, episode 100/100] => loss: 0.07136, acc: 0.98667\n", 223 | "[epoch 16/20, episode 50/100] => loss: 0.10298, acc: 0.97333\n", 224 | "[epoch 16/20, episode 100/100] => loss: 0.04288, acc: 0.99333\n", 225 | "[epoch 17/20, episode 50/100] => loss: 0.12377, acc: 0.97333\n", 226 | "[epoch 17/20, episode 100/100] => loss: 0.07907, acc: 0.98333\n", 227 | "[epoch 18/20, episode 50/100] => loss: 0.09200, acc: 0.99333\n", 228 | "[epoch 18/20, episode 100/100] => loss: 0.09606, acc: 0.98667\n", 229 | "[epoch 19/20, episode 50/100] => loss: 0.08441, acc: 0.98000\n", 230 | "[epoch 19/20, episode 100/100] => loss: 0.06932, acc: 0.97667\n", 231 | "[epoch 20/20, episode 50/100] => loss: 0.07246, acc: 0.98333\n", 232 | "[epoch 20/20, episode 100/100] => loss: 0.07372, acc: 0.99000\n" 233 | ] 234 | } 235 | ], 236 | "source": [ 237 | "for ep in range(n_epochs):\n", 238 | " for epi in range(n_episodes):\n", 239 | " epi_classes = np.random.permutation(n_classes)[:n_way]\n", 240 | " support = np.zeros([n_way, n_shot, im_height, im_width], dtype=np.float32)\n", 241 | " query = np.zeros([n_way, n_query, im_height, im_width], dtype=np.float32)\n", 242 | " for i, epi_cls in enumerate(epi_classes):\n", 243 | " selected = np.random.permutation(n_examples)[:n_shot + n_query]\n", 244 | " support[i] = train_dataset[epi_cls, selected[:n_shot]]\n", 245 | " query[i] = train_dataset[epi_cls, selected[n_shot:]]\n", 246 | " support = np.expand_dims(support, axis=-1)\n", 247 | " query = np.expand_dims(query, axis=-1)\n", 248 | " labels = np.tile(np.arange(n_way)[:, np.newaxis], (1, n_query)).astype(np.uint8)\n", 249 | " _, ls, ac = sess.run([train_op, ce_loss, acc], feed_dict={x: support, q: query, y:labels})\n", 250 | " if (epi+1) % 50 == 0:\n", 251 | " print('[epoch {}/{}, episode {}/{}] => loss: {:.5f}, acc: {:.5f}'.format(ep+1, n_epochs, epi+1, n_episodes, ls, ac))" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": 11, 257 | "metadata": {}, 258 | "outputs": [ 259 | { 260 | "name": "stdout", 261 | "output_type": "stream", 262 | "text": [ 263 | "(1692, 20, 28, 28)\n" 264 | ] 265 | } 266 | ], 267 | "source": [ 268 | "# Load Test Dataset\n", 269 | "root_dir = './data/omniglot'\n", 270 | "test_split_path = os.path.join(root_dir, 'splits', 'test.txt')\n", 271 | "with open(test_split_path, 'r') as test_split:\n", 272 | " test_classes = [line.rstrip() for line in test_split.readlines()]\n", 273 | "n_test_classes = len(test_classes)\n", 274 | "test_dataset = np.zeros([n_test_classes, n_examples, im_height, im_width], dtype=np.float32)\n", 275 | "for i, tc in enumerate(test_classes):\n", 276 | " alphabet, character, rotation = tc.split('/')\n", 277 | " rotation = float(rotation[3:])\n", 278 | " im_dir = os.path.join(root_dir, 'data', alphabet, character)\n", 279 | " im_files = sorted(glob.glob(os.path.join(im_dir, '*.png')))\n", 280 | " for j, im_file in enumerate(im_files):\n", 281 | " im = 1. - np.array(Image.open(im_file).rotate(rotation).resize((im_width, im_height)), np.float32, copy=False)\n", 282 | " test_dataset[i, j] = im\n", 283 | "print(test_dataset.shape)" 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 12, 289 | "metadata": { 290 | "collapsed": true 291 | }, 292 | "outputs": [], 293 | "source": [ 294 | "n_test_episodes = 1000\n", 295 | "n_test_way = 20\n", 296 | "n_test_shot = 5\n", 297 | "n_test_query = 15" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": 13, 303 | "metadata": {}, 304 | "outputs": [ 305 | { 306 | "name": "stdout", 307 | "output_type": "stream", 308 | "text": [ 309 | "Testing...\n", 310 | "[test episode 50/1000] => loss: 0.03256, acc: 0.99667\n", 311 | "[test episode 100/1000] => loss: 0.12023, acc: 0.98000\n", 312 | "[test episode 150/1000] => loss: 0.07153, acc: 0.98000\n", 313 | "[test episode 200/1000] => loss: 0.05016, acc: 0.99000\n", 314 | "[test episode 250/1000] => loss: 0.10391, acc: 0.97333\n", 315 | "[test episode 300/1000] => loss: 0.16047, acc: 0.94667\n", 316 | "[test episode 350/1000] => loss: 0.09679, acc: 0.96333\n", 317 | "[test episode 400/1000] => loss: 0.04228, acc: 0.99000\n", 318 | "[test episode 450/1000] => loss: 0.04014, acc: 0.98667\n", 319 | "[test episode 500/1000] => loss: 0.11133, acc: 0.96333\n", 320 | "[test episode 550/1000] => loss: 0.06174, acc: 0.99000\n", 321 | "[test episode 600/1000] => loss: 0.04588, acc: 0.99000\n", 322 | "[test episode 650/1000] => loss: 0.07874, acc: 0.97667\n", 323 | "[test episode 700/1000] => loss: 0.09997, acc: 0.96333\n", 324 | "[test episode 750/1000] => loss: 0.06412, acc: 0.98333\n", 325 | "[test episode 800/1000] => loss: 0.03532, acc: 0.99000\n", 326 | "[test episode 850/1000] => loss: 0.03986, acc: 0.99333\n", 327 | "[test episode 900/1000] => loss: 0.04442, acc: 0.99000\n", 328 | "[test episode 950/1000] => loss: 0.06309, acc: 0.99000\n", 329 | "[test episode 1000/1000] => loss: 0.04308, acc: 0.99333\n", 330 | "Average Test Accuracy: 0.98281\n" 331 | ] 332 | } 333 | ], 334 | "source": [ 335 | "print('Testing...')\n", 336 | "avg_acc = 0.\n", 337 | "for epi in range(n_test_episodes):\n", 338 | " epi_classes = np.random.permutation(n_test_classes)[:n_test_way]\n", 339 | " support = np.zeros([n_test_way, n_test_shot, im_height, im_width], dtype=np.float32)\n", 340 | " query = np.zeros([n_test_way, n_test_query, im_height, im_width], dtype=np.float32)\n", 341 | " for i, epi_cls in enumerate(epi_classes):\n", 342 | " selected = np.random.permutation(n_examples)[:n_test_shot + n_test_query]\n", 343 | " support[i] = test_dataset[epi_cls, selected[:n_test_shot]]\n", 344 | " query[i] = test_dataset[epi_cls, selected[n_test_shot:]]\n", 345 | " support = np.expand_dims(support, axis=-1)\n", 346 | " query = np.expand_dims(query, axis=-1)\n", 347 | " labels = np.tile(np.arange(n_test_way)[:, np.newaxis], (1, n_test_query)).astype(np.uint8)\n", 348 | " ls, ac = sess.run([ce_loss, acc], feed_dict={x: support, q: query, y:labels})\n", 349 | " avg_acc += ac\n", 350 | " if (epi+1) % 50 == 0:\n", 351 | " print('[test episode {}/{}] => loss: {:.5f}, acc: {:.5f}'.format(epi+1, n_test_episodes, ls, ac))\n", 352 | "avg_acc /= n_test_episodes\n", 353 | "print('Average Test Accuracy: {:.5f}'.format(avg_acc))" 354 | ] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "execution_count": null, 359 | "metadata": { 360 | "collapsed": true 361 | }, 362 | "outputs": [], 363 | "source": [] 364 | } 365 | ], 366 | "metadata": { 367 | "kernelspec": { 368 | "display_name": "Python 2", 369 | "language": "python", 370 | "name": "python2" 371 | }, 372 | "language_info": { 373 | "codemirror_mode": { 374 | "name": "ipython", 375 | "version": 2 376 | }, 377 | "file_extension": ".py", 378 | "mimetype": "text/x-python", 379 | "name": "python", 380 | "nbconvert_exporter": "python", 381 | "pygments_lexer": "ipython2", 382 | "version": "2.7.14" 383 | } 384 | }, 385 | "nbformat": 4, 386 | "nbformat_minor": 2 387 | } 388 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Prototypical Networks for Few-shot Learning 2 | Tensorflow implementation of NIPS 2017 Paper [Prototypical Networks for Few-shot Learning](http://papers.nips.cc/paper/6996-prototypical-networks-for-few-shot-learning.pdf)[1]. 3 | 4 | This code has been ported from the official implementation in PyTorch ([jakesnell/prototypical-networks](https://github.com/jakesnell/prototypical-networks)) and may be buggy. 5 | 6 | ## Usage 7 | ### Omniglot Dataset 8 | * Download the Omniglot dataset by executing `download_omniglot.sh` 9 | * Use the IPython Notebook `ProtoNet-Omniglot.ipynb` 10 | ### *mini* ImageNet v2 11 | #### Downloading Images 12 | * Create an account on [image-net.org](http://image-net.org/download-images) with your institutional ID. 13 | * Replace `` and `` in `download_miniimagenet.sh` with the username and accesskey you receive upon registration. 14 | * Run `download_miniimagenet.sh` which will download 84 ImageNet classes from ILSVRC2011. (64 train + 20 test) 15 | #### Testing on miniImageNet 16 | * Run `create_miniimagenet.py` which will generate `mini-imagenet-train.npy` and `mini-imagenet-test.npy` which are numpy arrays of shapes `64 x 350 x 84 x 84 x 3` and `20 x 350 x 84 x 84 x 3` respectively. 17 | * Use the IPython Notebook `ProtoNet-MiniImageNet-v2.ipynb`. 18 | 19 | **NOTE**: This miniImageNet dataset is not identical to the one used by Ravi et. al.[2] They have used images from ILSVRC2012 which can be downloaded from [here](http://www.image-net.org/challenges/LSVRC/2012/nonpub-downloads). Ravi et. al. have used 100 classes (64 training + 16 validation + 20 test) with 600 examples from each class. The script provided in this dataset downloads images from [image-net.org](http://www.image-net.org) which currently (Feb, 2018) contains images from ILSVRC2011. Therefore, some of the classes suggested by Ravi et. al. have less than 600 examples. For this reason, the number of examples of each class has been reduced to 350. The scripts provided download images corresponding to 84 classes (64 train + 20 test), the ones suggested by Ravi et. al., and then randomly samples 350 examples for each class. 20 | 21 | ## References 22 | [1] Jake Snell, Kevin Swersky, and Richard S. Zemel. *Prototypical networks for few-shot learning*. 23 | [2] Sachin Ravi and Hugo Larochelle. *Optimization as a model for few-shot learning*. 24 | -------------------------------------------------------------------------------- /create_miniimagenet.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import glob 3 | import os 4 | import numpy as np 5 | import cv2 6 | 7 | n_train_classes = 64 8 | n_test_classes = 20 9 | n_examples, width, height, channels = 350, 84, 84, 3 10 | 11 | root_path = './data/mini-imagenet/data' 12 | train_path = os.path.join(root_path, 'train') 13 | test_path = os.path.join(root_path, 'test') 14 | 15 | train_dirs = [f for f in glob.glob(os.path.join(train_path, '*')) if os.path.isdir(f)] 16 | test_dirs = [f for f in glob.glob(os.path.join(test_path, '*')) if os.path.isdir(f)] 17 | 18 | assert len(train_dirs) == n_train_classes 19 | assert len(test_dirs) == n_test_classes 20 | 21 | read_and_resize = lambda x: cv2.resize(cv2.imread(x, 1), (width, height)) 22 | 23 | def sample_dataset(dataset, dirs, name='train'): 24 | for i, d in enumerate(dirs): 25 | fs = np.asarray(glob.glob(os.path.join(d, '*.JPEG'))) 26 | fs = fs[np.random.permutation(len(fs))][:n_examples] 27 | for j, f in enumerate(fs): 28 | dataset[i, j] = read_and_resize(f) 29 | print('{}: {} of {}'.format(name, i + 1, len(dirs))) 30 | return dataset 31 | 32 | train_dataset = np.zeros((n_train_classes, n_examples, width, height, channels), dtype=np.uint8) 33 | train_dataset = sample_dataset(train_dataset, train_dirs) 34 | np.save('mini-imagenet-train.npy', train_dataset) 35 | del train_dataset 36 | 37 | test_dataset = np.zeros((n_test_classes, n_examples, width, height, channels), dtype=np.uint8) 38 | test_dataset = sample_dataset(test_dataset, test_dirs, name='test') 39 | np.save('mini-imagenet-test.npy', test_dataset) -------------------------------------------------------------------------------- /data/omniglot/splits/test.txt: -------------------------------------------------------------------------------- 1 | Gurmukhi/character42/rot000 2 | Gurmukhi/character42/rot090 3 | Gurmukhi/character42/rot180 4 | Gurmukhi/character42/rot270 5 | Gurmukhi/character43/rot000 6 | Gurmukhi/character43/rot090 7 | Gurmukhi/character43/rot180 8 | Gurmukhi/character43/rot270 9 | Gurmukhi/character44/rot000 10 | Gurmukhi/character44/rot090 11 | Gurmukhi/character44/rot180 12 | Gurmukhi/character44/rot270 13 | Gurmukhi/character45/rot000 14 | Gurmukhi/character45/rot090 15 | Gurmukhi/character45/rot180 16 | Gurmukhi/character45/rot270 17 | Kannada/character01/rot000 18 | Kannada/character01/rot090 19 | Kannada/character01/rot180 20 | Kannada/character01/rot270 21 | Kannada/character02/rot000 22 | Kannada/character02/rot090 23 | Kannada/character02/rot180 24 | Kannada/character02/rot270 25 | Kannada/character03/rot000 26 | Kannada/character03/rot090 27 | Kannada/character03/rot180 28 | Kannada/character03/rot270 29 | Kannada/character04/rot000 30 | Kannada/character04/rot090 31 | Kannada/character04/rot180 32 | Kannada/character04/rot270 33 | Kannada/character05/rot000 34 | Kannada/character05/rot090 35 | Kannada/character05/rot180 36 | Kannada/character05/rot270 37 | Kannada/character06/rot000 38 | Kannada/character06/rot090 39 | Kannada/character06/rot180 40 | Kannada/character06/rot270 41 | Kannada/character07/rot000 42 | Kannada/character07/rot090 43 | Kannada/character07/rot180 44 | Kannada/character07/rot270 45 | Kannada/character08/rot000 46 | Kannada/character08/rot090 47 | Kannada/character08/rot180 48 | Kannada/character08/rot270 49 | Kannada/character09/rot000 50 | Kannada/character09/rot090 51 | Kannada/character09/rot180 52 | Kannada/character09/rot270 53 | Kannada/character10/rot000 54 | Kannada/character10/rot090 55 | Kannada/character10/rot180 56 | Kannada/character10/rot270 57 | Kannada/character11/rot000 58 | Kannada/character11/rot090 59 | Kannada/character11/rot180 60 | Kannada/character11/rot270 61 | Kannada/character12/rot000 62 | Kannada/character12/rot090 63 | Kannada/character12/rot180 64 | Kannada/character12/rot270 65 | Kannada/character13/rot000 66 | Kannada/character13/rot090 67 | Kannada/character13/rot180 68 | Kannada/character13/rot270 69 | Kannada/character14/rot000 70 | Kannada/character14/rot090 71 | Kannada/character14/rot180 72 | Kannada/character14/rot270 73 | Kannada/character15/rot000 74 | Kannada/character15/rot090 75 | Kannada/character15/rot180 76 | Kannada/character15/rot270 77 | Kannada/character16/rot000 78 | Kannada/character16/rot090 79 | Kannada/character16/rot180 80 | Kannada/character16/rot270 81 | Kannada/character17/rot000 82 | Kannada/character17/rot090 83 | Kannada/character17/rot180 84 | Kannada/character17/rot270 85 | Kannada/character18/rot000 86 | Kannada/character18/rot090 87 | Kannada/character18/rot180 88 | Kannada/character18/rot270 89 | Kannada/character19/rot000 90 | Kannada/character19/rot090 91 | Kannada/character19/rot180 92 | Kannada/character19/rot270 93 | Kannada/character20/rot000 94 | Kannada/character20/rot090 95 | Kannada/character20/rot180 96 | Kannada/character20/rot270 97 | Kannada/character21/rot000 98 | Kannada/character21/rot090 99 | Kannada/character21/rot180 100 | Kannada/character21/rot270 101 | Kannada/character22/rot000 102 | Kannada/character22/rot090 103 | Kannada/character22/rot180 104 | Kannada/character22/rot270 105 | Kannada/character23/rot000 106 | Kannada/character23/rot090 107 | Kannada/character23/rot180 108 | Kannada/character23/rot270 109 | Kannada/character24/rot000 110 | Kannada/character24/rot090 111 | Kannada/character24/rot180 112 | Kannada/character24/rot270 113 | Kannada/character25/rot000 114 | Kannada/character25/rot090 115 | Kannada/character25/rot180 116 | Kannada/character25/rot270 117 | Kannada/character26/rot000 118 | Kannada/character26/rot090 119 | Kannada/character26/rot180 120 | Kannada/character26/rot270 121 | Kannada/character27/rot000 122 | Kannada/character27/rot090 123 | Kannada/character27/rot180 124 | Kannada/character27/rot270 125 | Kannada/character28/rot000 126 | Kannada/character28/rot090 127 | Kannada/character28/rot180 128 | Kannada/character28/rot270 129 | Kannada/character29/rot000 130 | Kannada/character29/rot090 131 | Kannada/character29/rot180 132 | Kannada/character29/rot270 133 | Kannada/character30/rot000 134 | Kannada/character30/rot090 135 | Kannada/character30/rot180 136 | Kannada/character30/rot270 137 | Kannada/character31/rot000 138 | Kannada/character31/rot090 139 | Kannada/character31/rot180 140 | Kannada/character31/rot270 141 | Kannada/character32/rot000 142 | Kannada/character32/rot090 143 | Kannada/character32/rot180 144 | Kannada/character32/rot270 145 | Kannada/character33/rot000 146 | Kannada/character33/rot090 147 | Kannada/character33/rot180 148 | Kannada/character33/rot270 149 | Kannada/character34/rot000 150 | Kannada/character34/rot090 151 | Kannada/character34/rot180 152 | Kannada/character34/rot270 153 | Kannada/character35/rot000 154 | Kannada/character35/rot090 155 | Kannada/character35/rot180 156 | Kannada/character35/rot270 157 | Kannada/character36/rot000 158 | Kannada/character36/rot090 159 | Kannada/character36/rot180 160 | Kannada/character36/rot270 161 | Kannada/character37/rot000 162 | Kannada/character37/rot090 163 | Kannada/character37/rot180 164 | Kannada/character37/rot270 165 | Kannada/character38/rot000 166 | Kannada/character38/rot090 167 | Kannada/character38/rot180 168 | Kannada/character38/rot270 169 | Kannada/character39/rot000 170 | Kannada/character39/rot090 171 | Kannada/character39/rot180 172 | Kannada/character39/rot270 173 | Kannada/character40/rot000 174 | Kannada/character40/rot090 175 | Kannada/character40/rot180 176 | Kannada/character40/rot270 177 | Kannada/character41/rot000 178 | Kannada/character41/rot090 179 | Kannada/character41/rot180 180 | Kannada/character41/rot270 181 | Keble/character01/rot000 182 | Keble/character01/rot090 183 | Keble/character01/rot180 184 | Keble/character01/rot270 185 | Keble/character02/rot000 186 | Keble/character02/rot090 187 | Keble/character02/rot180 188 | Keble/character02/rot270 189 | Keble/character03/rot000 190 | Keble/character03/rot090 191 | Keble/character03/rot180 192 | Keble/character03/rot270 193 | Keble/character04/rot000 194 | Keble/character04/rot090 195 | Keble/character04/rot180 196 | Keble/character04/rot270 197 | Keble/character05/rot000 198 | Keble/character05/rot090 199 | Keble/character05/rot180 200 | Keble/character05/rot270 201 | Keble/character06/rot000 202 | Keble/character06/rot090 203 | Keble/character06/rot180 204 | Keble/character06/rot270 205 | Keble/character07/rot000 206 | Keble/character07/rot090 207 | Keble/character07/rot180 208 | Keble/character07/rot270 209 | Keble/character08/rot000 210 | Keble/character08/rot090 211 | Keble/character08/rot180 212 | Keble/character08/rot270 213 | Keble/character09/rot000 214 | Keble/character09/rot090 215 | Keble/character09/rot180 216 | Keble/character09/rot270 217 | Keble/character10/rot000 218 | Keble/character10/rot090 219 | Keble/character10/rot180 220 | Keble/character10/rot270 221 | Keble/character11/rot000 222 | Keble/character11/rot090 223 | Keble/character11/rot180 224 | Keble/character11/rot270 225 | Keble/character12/rot000 226 | Keble/character12/rot090 227 | Keble/character12/rot180 228 | Keble/character12/rot270 229 | Keble/character13/rot000 230 | Keble/character13/rot090 231 | Keble/character13/rot180 232 | Keble/character13/rot270 233 | Keble/character14/rot000 234 | Keble/character14/rot090 235 | Keble/character14/rot180 236 | Keble/character14/rot270 237 | Keble/character15/rot000 238 | Keble/character15/rot090 239 | Keble/character15/rot180 240 | Keble/character15/rot270 241 | Keble/character16/rot000 242 | Keble/character16/rot090 243 | Keble/character16/rot180 244 | Keble/character16/rot270 245 | Keble/character17/rot000 246 | Keble/character17/rot090 247 | Keble/character17/rot180 248 | Keble/character17/rot270 249 | Keble/character18/rot000 250 | Keble/character18/rot090 251 | Keble/character18/rot180 252 | Keble/character18/rot270 253 | Keble/character19/rot000 254 | Keble/character19/rot090 255 | Keble/character19/rot180 256 | Keble/character19/rot270 257 | Keble/character20/rot000 258 | Keble/character20/rot090 259 | Keble/character20/rot180 260 | Keble/character20/rot270 261 | Keble/character21/rot000 262 | Keble/character21/rot090 263 | Keble/character21/rot180 264 | Keble/character21/rot270 265 | Keble/character22/rot000 266 | Keble/character22/rot090 267 | Keble/character22/rot180 268 | Keble/character22/rot270 269 | Keble/character23/rot000 270 | Keble/character23/rot090 271 | Keble/character23/rot180 272 | Keble/character23/rot270 273 | Keble/character24/rot000 274 | Keble/character24/rot090 275 | Keble/character24/rot180 276 | Keble/character24/rot270 277 | Keble/character25/rot000 278 | Keble/character25/rot090 279 | Keble/character25/rot180 280 | Keble/character25/rot270 281 | Keble/character26/rot000 282 | Keble/character26/rot090 283 | Keble/character26/rot180 284 | Keble/character26/rot270 285 | Malayalam/character01/rot000 286 | Malayalam/character01/rot090 287 | Malayalam/character01/rot180 288 | Malayalam/character01/rot270 289 | Malayalam/character02/rot000 290 | Malayalam/character02/rot090 291 | Malayalam/character02/rot180 292 | Malayalam/character02/rot270 293 | Malayalam/character03/rot000 294 | Malayalam/character03/rot090 295 | Malayalam/character03/rot180 296 | Malayalam/character03/rot270 297 | Malayalam/character04/rot000 298 | Malayalam/character04/rot090 299 | Malayalam/character04/rot180 300 | Malayalam/character04/rot270 301 | Malayalam/character05/rot000 302 | Malayalam/character05/rot090 303 | Malayalam/character05/rot180 304 | Malayalam/character05/rot270 305 | Malayalam/character06/rot000 306 | Malayalam/character06/rot090 307 | Malayalam/character06/rot180 308 | Malayalam/character06/rot270 309 | Malayalam/character07/rot000 310 | Malayalam/character07/rot090 311 | Malayalam/character07/rot180 312 | Malayalam/character07/rot270 313 | Malayalam/character08/rot000 314 | Malayalam/character08/rot090 315 | Malayalam/character08/rot180 316 | Malayalam/character08/rot270 317 | Malayalam/character09/rot000 318 | Malayalam/character09/rot090 319 | Malayalam/character09/rot180 320 | Malayalam/character09/rot270 321 | Malayalam/character10/rot000 322 | Malayalam/character10/rot090 323 | Malayalam/character10/rot180 324 | Malayalam/character10/rot270 325 | Malayalam/character11/rot000 326 | Malayalam/character11/rot090 327 | Malayalam/character11/rot180 328 | Malayalam/character11/rot270 329 | Malayalam/character12/rot000 330 | Malayalam/character12/rot090 331 | Malayalam/character12/rot180 332 | Malayalam/character12/rot270 333 | Malayalam/character13/rot000 334 | Malayalam/character13/rot090 335 | Malayalam/character13/rot180 336 | Malayalam/character13/rot270 337 | Malayalam/character14/rot000 338 | Malayalam/character14/rot090 339 | Malayalam/character14/rot180 340 | Malayalam/character14/rot270 341 | Malayalam/character15/rot000 342 | Malayalam/character15/rot090 343 | Malayalam/character15/rot180 344 | Malayalam/character15/rot270 345 | Malayalam/character16/rot000 346 | Malayalam/character16/rot090 347 | Malayalam/character16/rot180 348 | Malayalam/character16/rot270 349 | Malayalam/character17/rot000 350 | Malayalam/character17/rot090 351 | Malayalam/character17/rot180 352 | Malayalam/character17/rot270 353 | Malayalam/character18/rot000 354 | Malayalam/character18/rot090 355 | Malayalam/character18/rot180 356 | Malayalam/character18/rot270 357 | Malayalam/character19/rot000 358 | Malayalam/character19/rot090 359 | Malayalam/character19/rot180 360 | Malayalam/character19/rot270 361 | Malayalam/character20/rot000 362 | Malayalam/character20/rot090 363 | Malayalam/character20/rot180 364 | Malayalam/character20/rot270 365 | Malayalam/character21/rot000 366 | Malayalam/character21/rot090 367 | Malayalam/character21/rot180 368 | Malayalam/character21/rot270 369 | Malayalam/character22/rot000 370 | Malayalam/character22/rot090 371 | Malayalam/character22/rot180 372 | Malayalam/character22/rot270 373 | Malayalam/character23/rot000 374 | Malayalam/character23/rot090 375 | Malayalam/character23/rot180 376 | Malayalam/character23/rot270 377 | Malayalam/character24/rot000 378 | Malayalam/character24/rot090 379 | Malayalam/character24/rot180 380 | Malayalam/character24/rot270 381 | Malayalam/character25/rot000 382 | Malayalam/character25/rot090 383 | Malayalam/character25/rot180 384 | Malayalam/character25/rot270 385 | Malayalam/character26/rot000 386 | Malayalam/character26/rot090 387 | Malayalam/character26/rot180 388 | Malayalam/character26/rot270 389 | Malayalam/character27/rot000 390 | Malayalam/character27/rot090 391 | Malayalam/character27/rot180 392 | Malayalam/character27/rot270 393 | Malayalam/character28/rot000 394 | Malayalam/character28/rot090 395 | Malayalam/character28/rot180 396 | Malayalam/character28/rot270 397 | Malayalam/character29/rot000 398 | Malayalam/character29/rot090 399 | Malayalam/character29/rot180 400 | Malayalam/character29/rot270 401 | Malayalam/character30/rot000 402 | Malayalam/character30/rot090 403 | Malayalam/character30/rot180 404 | Malayalam/character30/rot270 405 | Malayalam/character31/rot000 406 | Malayalam/character31/rot090 407 | Malayalam/character31/rot180 408 | Malayalam/character31/rot270 409 | Malayalam/character32/rot000 410 | Malayalam/character32/rot090 411 | Malayalam/character32/rot180 412 | Malayalam/character32/rot270 413 | Malayalam/character33/rot000 414 | Malayalam/character33/rot090 415 | Malayalam/character33/rot180 416 | Malayalam/character33/rot270 417 | Malayalam/character34/rot000 418 | Malayalam/character34/rot090 419 | Malayalam/character34/rot180 420 | Malayalam/character34/rot270 421 | Malayalam/character35/rot000 422 | Malayalam/character35/rot090 423 | Malayalam/character35/rot180 424 | Malayalam/character35/rot270 425 | Malayalam/character36/rot000 426 | Malayalam/character36/rot090 427 | Malayalam/character36/rot180 428 | Malayalam/character36/rot270 429 | Malayalam/character37/rot000 430 | Malayalam/character37/rot090 431 | Malayalam/character37/rot180 432 | Malayalam/character37/rot270 433 | Malayalam/character38/rot000 434 | Malayalam/character38/rot090 435 | Malayalam/character38/rot180 436 | Malayalam/character38/rot270 437 | Malayalam/character39/rot000 438 | Malayalam/character39/rot090 439 | Malayalam/character39/rot180 440 | Malayalam/character39/rot270 441 | Malayalam/character40/rot000 442 | Malayalam/character40/rot090 443 | Malayalam/character40/rot180 444 | Malayalam/character40/rot270 445 | Malayalam/character41/rot000 446 | Malayalam/character41/rot090 447 | Malayalam/character41/rot180 448 | Malayalam/character41/rot270 449 | Malayalam/character42/rot000 450 | Malayalam/character42/rot090 451 | Malayalam/character42/rot180 452 | Malayalam/character42/rot270 453 | Malayalam/character43/rot000 454 | Malayalam/character43/rot090 455 | Malayalam/character43/rot180 456 | Malayalam/character43/rot270 457 | Malayalam/character44/rot000 458 | Malayalam/character44/rot090 459 | Malayalam/character44/rot180 460 | Malayalam/character44/rot270 461 | Malayalam/character45/rot000 462 | Malayalam/character45/rot090 463 | Malayalam/character45/rot180 464 | Malayalam/character45/rot270 465 | Malayalam/character46/rot000 466 | Malayalam/character46/rot090 467 | Malayalam/character46/rot180 468 | Malayalam/character46/rot270 469 | Malayalam/character47/rot000 470 | Malayalam/character47/rot090 471 | Malayalam/character47/rot180 472 | Malayalam/character47/rot270 473 | Manipuri/character01/rot000 474 | Manipuri/character01/rot090 475 | Manipuri/character01/rot180 476 | Manipuri/character01/rot270 477 | Manipuri/character02/rot000 478 | Manipuri/character02/rot090 479 | Manipuri/character02/rot180 480 | Manipuri/character02/rot270 481 | Manipuri/character03/rot000 482 | Manipuri/character03/rot090 483 | Manipuri/character03/rot180 484 | Manipuri/character03/rot270 485 | Manipuri/character04/rot000 486 | Manipuri/character04/rot090 487 | Manipuri/character04/rot180 488 | Manipuri/character04/rot270 489 | Manipuri/character05/rot000 490 | Manipuri/character05/rot090 491 | Manipuri/character05/rot180 492 | Manipuri/character05/rot270 493 | Manipuri/character06/rot000 494 | Manipuri/character06/rot090 495 | Manipuri/character06/rot180 496 | Manipuri/character06/rot270 497 | Manipuri/character07/rot000 498 | Manipuri/character07/rot090 499 | Manipuri/character07/rot180 500 | Manipuri/character07/rot270 501 | Manipuri/character08/rot000 502 | Manipuri/character08/rot090 503 | Manipuri/character08/rot180 504 | Manipuri/character08/rot270 505 | Manipuri/character09/rot000 506 | Manipuri/character09/rot090 507 | Manipuri/character09/rot180 508 | Manipuri/character09/rot270 509 | Manipuri/character10/rot000 510 | Manipuri/character10/rot090 511 | Manipuri/character10/rot180 512 | Manipuri/character10/rot270 513 | Manipuri/character11/rot000 514 | Manipuri/character11/rot090 515 | Manipuri/character11/rot180 516 | Manipuri/character11/rot270 517 | Manipuri/character12/rot000 518 | Manipuri/character12/rot090 519 | Manipuri/character12/rot180 520 | Manipuri/character12/rot270 521 | Manipuri/character13/rot000 522 | Manipuri/character13/rot090 523 | Manipuri/character13/rot180 524 | Manipuri/character13/rot270 525 | Manipuri/character14/rot000 526 | Manipuri/character14/rot090 527 | Manipuri/character14/rot180 528 | Manipuri/character14/rot270 529 | Manipuri/character15/rot000 530 | Manipuri/character15/rot090 531 | Manipuri/character15/rot180 532 | Manipuri/character15/rot270 533 | Manipuri/character16/rot000 534 | Manipuri/character16/rot090 535 | Manipuri/character16/rot180 536 | Manipuri/character16/rot270 537 | Manipuri/character17/rot000 538 | Manipuri/character17/rot090 539 | Manipuri/character17/rot180 540 | Manipuri/character17/rot270 541 | Manipuri/character18/rot000 542 | Manipuri/character18/rot090 543 | Manipuri/character18/rot180 544 | Manipuri/character18/rot270 545 | Manipuri/character19/rot000 546 | Manipuri/character19/rot090 547 | Manipuri/character19/rot180 548 | Manipuri/character19/rot270 549 | Manipuri/character20/rot000 550 | Manipuri/character20/rot090 551 | Manipuri/character20/rot180 552 | Manipuri/character20/rot270 553 | Manipuri/character21/rot000 554 | Manipuri/character21/rot090 555 | Manipuri/character21/rot180 556 | Manipuri/character21/rot270 557 | Manipuri/character22/rot000 558 | Manipuri/character22/rot090 559 | Manipuri/character22/rot180 560 | Manipuri/character22/rot270 561 | Manipuri/character23/rot000 562 | Manipuri/character23/rot090 563 | Manipuri/character23/rot180 564 | Manipuri/character23/rot270 565 | Manipuri/character24/rot000 566 | Manipuri/character24/rot090 567 | Manipuri/character24/rot180 568 | Manipuri/character24/rot270 569 | Manipuri/character25/rot000 570 | Manipuri/character25/rot090 571 | Manipuri/character25/rot180 572 | Manipuri/character25/rot270 573 | Manipuri/character26/rot000 574 | Manipuri/character26/rot090 575 | Manipuri/character26/rot180 576 | Manipuri/character26/rot270 577 | Manipuri/character27/rot000 578 | Manipuri/character27/rot090 579 | Manipuri/character27/rot180 580 | Manipuri/character27/rot270 581 | Manipuri/character28/rot000 582 | Manipuri/character28/rot090 583 | Manipuri/character28/rot180 584 | Manipuri/character28/rot270 585 | Manipuri/character29/rot000 586 | Manipuri/character29/rot090 587 | Manipuri/character29/rot180 588 | Manipuri/character29/rot270 589 | Manipuri/character30/rot000 590 | Manipuri/character30/rot090 591 | Manipuri/character30/rot180 592 | Manipuri/character30/rot270 593 | Manipuri/character31/rot000 594 | Manipuri/character31/rot090 595 | Manipuri/character31/rot180 596 | Manipuri/character31/rot270 597 | Manipuri/character32/rot000 598 | Manipuri/character32/rot090 599 | Manipuri/character32/rot180 600 | Manipuri/character32/rot270 601 | Manipuri/character33/rot000 602 | Manipuri/character33/rot090 603 | Manipuri/character33/rot180 604 | Manipuri/character33/rot270 605 | Manipuri/character34/rot000 606 | Manipuri/character34/rot090 607 | Manipuri/character34/rot180 608 | Manipuri/character34/rot270 609 | Manipuri/character35/rot000 610 | Manipuri/character35/rot090 611 | Manipuri/character35/rot180 612 | Manipuri/character35/rot270 613 | Manipuri/character36/rot000 614 | Manipuri/character36/rot090 615 | Manipuri/character36/rot180 616 | Manipuri/character36/rot270 617 | Manipuri/character37/rot000 618 | Manipuri/character37/rot090 619 | Manipuri/character37/rot180 620 | Manipuri/character37/rot270 621 | Manipuri/character38/rot000 622 | Manipuri/character38/rot090 623 | Manipuri/character38/rot180 624 | Manipuri/character38/rot270 625 | Manipuri/character39/rot000 626 | Manipuri/character39/rot090 627 | Manipuri/character39/rot180 628 | Manipuri/character39/rot270 629 | Manipuri/character40/rot000 630 | Manipuri/character40/rot090 631 | Manipuri/character40/rot180 632 | Manipuri/character40/rot270 633 | Mongolian/character01/rot000 634 | Mongolian/character01/rot090 635 | Mongolian/character01/rot180 636 | Mongolian/character01/rot270 637 | Mongolian/character02/rot000 638 | Mongolian/character02/rot090 639 | Mongolian/character02/rot180 640 | Mongolian/character02/rot270 641 | Mongolian/character03/rot000 642 | Mongolian/character03/rot090 643 | Mongolian/character03/rot180 644 | Mongolian/character03/rot270 645 | Mongolian/character04/rot000 646 | Mongolian/character04/rot090 647 | Mongolian/character04/rot180 648 | Mongolian/character04/rot270 649 | Mongolian/character05/rot000 650 | Mongolian/character05/rot090 651 | Mongolian/character05/rot180 652 | Mongolian/character05/rot270 653 | Mongolian/character06/rot000 654 | Mongolian/character06/rot090 655 | Mongolian/character06/rot180 656 | Mongolian/character06/rot270 657 | Mongolian/character07/rot000 658 | Mongolian/character07/rot090 659 | Mongolian/character07/rot180 660 | Mongolian/character07/rot270 661 | Mongolian/character08/rot000 662 | Mongolian/character08/rot090 663 | Mongolian/character08/rot180 664 | Mongolian/character08/rot270 665 | Mongolian/character09/rot000 666 | Mongolian/character09/rot090 667 | Mongolian/character09/rot180 668 | Mongolian/character09/rot270 669 | Mongolian/character10/rot000 670 | Mongolian/character10/rot090 671 | Mongolian/character10/rot180 672 | Mongolian/character10/rot270 673 | Mongolian/character11/rot000 674 | Mongolian/character11/rot090 675 | Mongolian/character11/rot180 676 | Mongolian/character11/rot270 677 | Mongolian/character12/rot000 678 | Mongolian/character12/rot090 679 | Mongolian/character12/rot180 680 | Mongolian/character12/rot270 681 | Mongolian/character13/rot000 682 | Mongolian/character13/rot090 683 | Mongolian/character13/rot180 684 | Mongolian/character13/rot270 685 | Mongolian/character14/rot000 686 | Mongolian/character14/rot090 687 | Mongolian/character14/rot180 688 | Mongolian/character14/rot270 689 | Mongolian/character15/rot000 690 | Mongolian/character15/rot090 691 | Mongolian/character15/rot180 692 | Mongolian/character15/rot270 693 | Mongolian/character16/rot000 694 | Mongolian/character16/rot090 695 | Mongolian/character16/rot180 696 | Mongolian/character16/rot270 697 | Mongolian/character17/rot000 698 | Mongolian/character17/rot090 699 | Mongolian/character17/rot180 700 | Mongolian/character17/rot270 701 | Mongolian/character18/rot000 702 | Mongolian/character18/rot090 703 | Mongolian/character18/rot180 704 | Mongolian/character18/rot270 705 | Mongolian/character19/rot000 706 | Mongolian/character19/rot090 707 | Mongolian/character19/rot180 708 | Mongolian/character19/rot270 709 | Mongolian/character20/rot000 710 | Mongolian/character20/rot090 711 | Mongolian/character20/rot180 712 | Mongolian/character20/rot270 713 | Mongolian/character21/rot000 714 | Mongolian/character21/rot090 715 | Mongolian/character21/rot180 716 | Mongolian/character21/rot270 717 | Mongolian/character22/rot000 718 | Mongolian/character22/rot090 719 | Mongolian/character22/rot180 720 | Mongolian/character22/rot270 721 | Mongolian/character23/rot000 722 | Mongolian/character23/rot090 723 | Mongolian/character23/rot180 724 | Mongolian/character23/rot270 725 | Mongolian/character24/rot000 726 | Mongolian/character24/rot090 727 | Mongolian/character24/rot180 728 | Mongolian/character24/rot270 729 | Mongolian/character25/rot000 730 | Mongolian/character25/rot090 731 | Mongolian/character25/rot180 732 | Mongolian/character25/rot270 733 | Mongolian/character26/rot000 734 | Mongolian/character26/rot090 735 | Mongolian/character26/rot180 736 | Mongolian/character26/rot270 737 | Mongolian/character27/rot000 738 | Mongolian/character27/rot090 739 | Mongolian/character27/rot180 740 | Mongolian/character27/rot270 741 | Mongolian/character28/rot000 742 | Mongolian/character28/rot090 743 | Mongolian/character28/rot180 744 | Mongolian/character28/rot270 745 | Mongolian/character29/rot000 746 | Mongolian/character29/rot090 747 | Mongolian/character29/rot180 748 | Mongolian/character29/rot270 749 | Mongolian/character30/rot000 750 | Mongolian/character30/rot090 751 | Mongolian/character30/rot180 752 | Mongolian/character30/rot270 753 | Old_Church_Slavonic_(Cyrillic)/character01/rot000 754 | Old_Church_Slavonic_(Cyrillic)/character01/rot090 755 | Old_Church_Slavonic_(Cyrillic)/character01/rot180 756 | Old_Church_Slavonic_(Cyrillic)/character01/rot270 757 | Old_Church_Slavonic_(Cyrillic)/character02/rot000 758 | Old_Church_Slavonic_(Cyrillic)/character02/rot090 759 | Old_Church_Slavonic_(Cyrillic)/character02/rot180 760 | Old_Church_Slavonic_(Cyrillic)/character02/rot270 761 | Old_Church_Slavonic_(Cyrillic)/character03/rot000 762 | Old_Church_Slavonic_(Cyrillic)/character03/rot090 763 | Old_Church_Slavonic_(Cyrillic)/character03/rot180 764 | Old_Church_Slavonic_(Cyrillic)/character03/rot270 765 | Old_Church_Slavonic_(Cyrillic)/character04/rot000 766 | Old_Church_Slavonic_(Cyrillic)/character04/rot090 767 | Old_Church_Slavonic_(Cyrillic)/character04/rot180 768 | Old_Church_Slavonic_(Cyrillic)/character04/rot270 769 | Old_Church_Slavonic_(Cyrillic)/character05/rot000 770 | Old_Church_Slavonic_(Cyrillic)/character05/rot090 771 | Old_Church_Slavonic_(Cyrillic)/character05/rot180 772 | Old_Church_Slavonic_(Cyrillic)/character05/rot270 773 | Old_Church_Slavonic_(Cyrillic)/character06/rot000 774 | Old_Church_Slavonic_(Cyrillic)/character06/rot090 775 | Old_Church_Slavonic_(Cyrillic)/character06/rot180 776 | Old_Church_Slavonic_(Cyrillic)/character06/rot270 777 | Old_Church_Slavonic_(Cyrillic)/character07/rot000 778 | Old_Church_Slavonic_(Cyrillic)/character07/rot090 779 | Old_Church_Slavonic_(Cyrillic)/character07/rot180 780 | Old_Church_Slavonic_(Cyrillic)/character07/rot270 781 | Old_Church_Slavonic_(Cyrillic)/character08/rot000 782 | Old_Church_Slavonic_(Cyrillic)/character08/rot090 783 | Old_Church_Slavonic_(Cyrillic)/character08/rot180 784 | Old_Church_Slavonic_(Cyrillic)/character08/rot270 785 | Old_Church_Slavonic_(Cyrillic)/character09/rot000 786 | Old_Church_Slavonic_(Cyrillic)/character09/rot090 787 | Old_Church_Slavonic_(Cyrillic)/character09/rot180 788 | Old_Church_Slavonic_(Cyrillic)/character09/rot270 789 | Old_Church_Slavonic_(Cyrillic)/character10/rot000 790 | Old_Church_Slavonic_(Cyrillic)/character10/rot090 791 | Old_Church_Slavonic_(Cyrillic)/character10/rot180 792 | Old_Church_Slavonic_(Cyrillic)/character10/rot270 793 | Old_Church_Slavonic_(Cyrillic)/character11/rot000 794 | Old_Church_Slavonic_(Cyrillic)/character11/rot090 795 | Old_Church_Slavonic_(Cyrillic)/character11/rot180 796 | Old_Church_Slavonic_(Cyrillic)/character11/rot270 797 | Old_Church_Slavonic_(Cyrillic)/character12/rot000 798 | Old_Church_Slavonic_(Cyrillic)/character12/rot090 799 | Old_Church_Slavonic_(Cyrillic)/character12/rot180 800 | Old_Church_Slavonic_(Cyrillic)/character12/rot270 801 | Old_Church_Slavonic_(Cyrillic)/character13/rot000 802 | Old_Church_Slavonic_(Cyrillic)/character13/rot090 803 | Old_Church_Slavonic_(Cyrillic)/character13/rot180 804 | Old_Church_Slavonic_(Cyrillic)/character13/rot270 805 | Old_Church_Slavonic_(Cyrillic)/character14/rot000 806 | Old_Church_Slavonic_(Cyrillic)/character14/rot090 807 | Old_Church_Slavonic_(Cyrillic)/character14/rot180 808 | Old_Church_Slavonic_(Cyrillic)/character14/rot270 809 | Old_Church_Slavonic_(Cyrillic)/character15/rot000 810 | Old_Church_Slavonic_(Cyrillic)/character15/rot090 811 | Old_Church_Slavonic_(Cyrillic)/character15/rot180 812 | Old_Church_Slavonic_(Cyrillic)/character15/rot270 813 | Old_Church_Slavonic_(Cyrillic)/character16/rot000 814 | Old_Church_Slavonic_(Cyrillic)/character16/rot090 815 | Old_Church_Slavonic_(Cyrillic)/character16/rot180 816 | Old_Church_Slavonic_(Cyrillic)/character16/rot270 817 | Old_Church_Slavonic_(Cyrillic)/character17/rot000 818 | Old_Church_Slavonic_(Cyrillic)/character17/rot090 819 | Old_Church_Slavonic_(Cyrillic)/character17/rot180 820 | Old_Church_Slavonic_(Cyrillic)/character17/rot270 821 | Old_Church_Slavonic_(Cyrillic)/character18/rot000 822 | Old_Church_Slavonic_(Cyrillic)/character18/rot090 823 | Old_Church_Slavonic_(Cyrillic)/character18/rot180 824 | Old_Church_Slavonic_(Cyrillic)/character18/rot270 825 | Old_Church_Slavonic_(Cyrillic)/character19/rot000 826 | Old_Church_Slavonic_(Cyrillic)/character19/rot090 827 | Old_Church_Slavonic_(Cyrillic)/character19/rot180 828 | Old_Church_Slavonic_(Cyrillic)/character19/rot270 829 | Old_Church_Slavonic_(Cyrillic)/character20/rot000 830 | Old_Church_Slavonic_(Cyrillic)/character20/rot090 831 | Old_Church_Slavonic_(Cyrillic)/character20/rot180 832 | Old_Church_Slavonic_(Cyrillic)/character20/rot270 833 | Old_Church_Slavonic_(Cyrillic)/character21/rot000 834 | Old_Church_Slavonic_(Cyrillic)/character21/rot090 835 | Old_Church_Slavonic_(Cyrillic)/character21/rot180 836 | Old_Church_Slavonic_(Cyrillic)/character21/rot270 837 | Old_Church_Slavonic_(Cyrillic)/character22/rot000 838 | Old_Church_Slavonic_(Cyrillic)/character22/rot090 839 | Old_Church_Slavonic_(Cyrillic)/character22/rot180 840 | Old_Church_Slavonic_(Cyrillic)/character22/rot270 841 | Old_Church_Slavonic_(Cyrillic)/character23/rot000 842 | Old_Church_Slavonic_(Cyrillic)/character23/rot090 843 | Old_Church_Slavonic_(Cyrillic)/character23/rot180 844 | Old_Church_Slavonic_(Cyrillic)/character23/rot270 845 | Old_Church_Slavonic_(Cyrillic)/character24/rot000 846 | Old_Church_Slavonic_(Cyrillic)/character24/rot090 847 | Old_Church_Slavonic_(Cyrillic)/character24/rot180 848 | Old_Church_Slavonic_(Cyrillic)/character24/rot270 849 | Old_Church_Slavonic_(Cyrillic)/character25/rot000 850 | Old_Church_Slavonic_(Cyrillic)/character25/rot090 851 | Old_Church_Slavonic_(Cyrillic)/character25/rot180 852 | Old_Church_Slavonic_(Cyrillic)/character25/rot270 853 | Old_Church_Slavonic_(Cyrillic)/character26/rot000 854 | Old_Church_Slavonic_(Cyrillic)/character26/rot090 855 | Old_Church_Slavonic_(Cyrillic)/character26/rot180 856 | Old_Church_Slavonic_(Cyrillic)/character26/rot270 857 | Old_Church_Slavonic_(Cyrillic)/character27/rot000 858 | Old_Church_Slavonic_(Cyrillic)/character27/rot090 859 | Old_Church_Slavonic_(Cyrillic)/character27/rot180 860 | Old_Church_Slavonic_(Cyrillic)/character27/rot270 861 | Old_Church_Slavonic_(Cyrillic)/character28/rot000 862 | Old_Church_Slavonic_(Cyrillic)/character28/rot090 863 | Old_Church_Slavonic_(Cyrillic)/character28/rot180 864 | Old_Church_Slavonic_(Cyrillic)/character28/rot270 865 | Old_Church_Slavonic_(Cyrillic)/character29/rot000 866 | Old_Church_Slavonic_(Cyrillic)/character29/rot090 867 | Old_Church_Slavonic_(Cyrillic)/character29/rot180 868 | Old_Church_Slavonic_(Cyrillic)/character29/rot270 869 | Old_Church_Slavonic_(Cyrillic)/character30/rot000 870 | Old_Church_Slavonic_(Cyrillic)/character30/rot090 871 | Old_Church_Slavonic_(Cyrillic)/character30/rot180 872 | Old_Church_Slavonic_(Cyrillic)/character30/rot270 873 | Old_Church_Slavonic_(Cyrillic)/character31/rot000 874 | Old_Church_Slavonic_(Cyrillic)/character31/rot090 875 | Old_Church_Slavonic_(Cyrillic)/character31/rot180 876 | Old_Church_Slavonic_(Cyrillic)/character31/rot270 877 | Old_Church_Slavonic_(Cyrillic)/character32/rot000 878 | Old_Church_Slavonic_(Cyrillic)/character32/rot090 879 | Old_Church_Slavonic_(Cyrillic)/character32/rot180 880 | Old_Church_Slavonic_(Cyrillic)/character32/rot270 881 | Old_Church_Slavonic_(Cyrillic)/character33/rot000 882 | Old_Church_Slavonic_(Cyrillic)/character33/rot090 883 | Old_Church_Slavonic_(Cyrillic)/character33/rot180 884 | Old_Church_Slavonic_(Cyrillic)/character33/rot270 885 | Old_Church_Slavonic_(Cyrillic)/character34/rot000 886 | Old_Church_Slavonic_(Cyrillic)/character34/rot090 887 | Old_Church_Slavonic_(Cyrillic)/character34/rot180 888 | Old_Church_Slavonic_(Cyrillic)/character34/rot270 889 | Old_Church_Slavonic_(Cyrillic)/character35/rot000 890 | Old_Church_Slavonic_(Cyrillic)/character35/rot090 891 | Old_Church_Slavonic_(Cyrillic)/character35/rot180 892 | Old_Church_Slavonic_(Cyrillic)/character35/rot270 893 | Old_Church_Slavonic_(Cyrillic)/character36/rot000 894 | Old_Church_Slavonic_(Cyrillic)/character36/rot090 895 | Old_Church_Slavonic_(Cyrillic)/character36/rot180 896 | Old_Church_Slavonic_(Cyrillic)/character36/rot270 897 | Old_Church_Slavonic_(Cyrillic)/character37/rot000 898 | Old_Church_Slavonic_(Cyrillic)/character37/rot090 899 | Old_Church_Slavonic_(Cyrillic)/character37/rot180 900 | Old_Church_Slavonic_(Cyrillic)/character37/rot270 901 | Old_Church_Slavonic_(Cyrillic)/character38/rot000 902 | Old_Church_Slavonic_(Cyrillic)/character38/rot090 903 | Old_Church_Slavonic_(Cyrillic)/character38/rot180 904 | Old_Church_Slavonic_(Cyrillic)/character38/rot270 905 | Old_Church_Slavonic_(Cyrillic)/character39/rot000 906 | Old_Church_Slavonic_(Cyrillic)/character39/rot090 907 | Old_Church_Slavonic_(Cyrillic)/character39/rot180 908 | Old_Church_Slavonic_(Cyrillic)/character39/rot270 909 | Old_Church_Slavonic_(Cyrillic)/character40/rot000 910 | Old_Church_Slavonic_(Cyrillic)/character40/rot090 911 | Old_Church_Slavonic_(Cyrillic)/character40/rot180 912 | Old_Church_Slavonic_(Cyrillic)/character40/rot270 913 | Old_Church_Slavonic_(Cyrillic)/character41/rot000 914 | Old_Church_Slavonic_(Cyrillic)/character41/rot090 915 | Old_Church_Slavonic_(Cyrillic)/character41/rot180 916 | Old_Church_Slavonic_(Cyrillic)/character41/rot270 917 | Old_Church_Slavonic_(Cyrillic)/character42/rot000 918 | Old_Church_Slavonic_(Cyrillic)/character42/rot090 919 | Old_Church_Slavonic_(Cyrillic)/character42/rot180 920 | Old_Church_Slavonic_(Cyrillic)/character42/rot270 921 | Old_Church_Slavonic_(Cyrillic)/character43/rot000 922 | Old_Church_Slavonic_(Cyrillic)/character43/rot090 923 | Old_Church_Slavonic_(Cyrillic)/character43/rot180 924 | Old_Church_Slavonic_(Cyrillic)/character43/rot270 925 | Old_Church_Slavonic_(Cyrillic)/character44/rot000 926 | Old_Church_Slavonic_(Cyrillic)/character44/rot090 927 | Old_Church_Slavonic_(Cyrillic)/character44/rot180 928 | Old_Church_Slavonic_(Cyrillic)/character44/rot270 929 | Old_Church_Slavonic_(Cyrillic)/character45/rot000 930 | Old_Church_Slavonic_(Cyrillic)/character45/rot090 931 | Old_Church_Slavonic_(Cyrillic)/character45/rot180 932 | Old_Church_Slavonic_(Cyrillic)/character45/rot270 933 | Oriya/character01/rot000 934 | Oriya/character01/rot090 935 | Oriya/character01/rot180 936 | Oriya/character01/rot270 937 | Oriya/character02/rot000 938 | Oriya/character02/rot090 939 | Oriya/character02/rot180 940 | Oriya/character02/rot270 941 | Oriya/character03/rot000 942 | Oriya/character03/rot090 943 | Oriya/character03/rot180 944 | Oriya/character03/rot270 945 | Oriya/character04/rot000 946 | Oriya/character04/rot090 947 | Oriya/character04/rot180 948 | Oriya/character04/rot270 949 | Oriya/character05/rot000 950 | Oriya/character05/rot090 951 | Oriya/character05/rot180 952 | Oriya/character05/rot270 953 | Oriya/character06/rot000 954 | Oriya/character06/rot090 955 | Oriya/character06/rot180 956 | Oriya/character06/rot270 957 | Oriya/character07/rot000 958 | Oriya/character07/rot090 959 | Oriya/character07/rot180 960 | Oriya/character07/rot270 961 | Oriya/character08/rot000 962 | Oriya/character08/rot090 963 | Oriya/character08/rot180 964 | Oriya/character08/rot270 965 | Oriya/character09/rot000 966 | Oriya/character09/rot090 967 | Oriya/character09/rot180 968 | Oriya/character09/rot270 969 | Oriya/character10/rot000 970 | Oriya/character10/rot090 971 | Oriya/character10/rot180 972 | Oriya/character10/rot270 973 | Oriya/character11/rot000 974 | Oriya/character11/rot090 975 | Oriya/character11/rot180 976 | Oriya/character11/rot270 977 | Oriya/character12/rot000 978 | Oriya/character12/rot090 979 | Oriya/character12/rot180 980 | Oriya/character12/rot270 981 | Oriya/character13/rot000 982 | Oriya/character13/rot090 983 | Oriya/character13/rot180 984 | Oriya/character13/rot270 985 | Oriya/character14/rot000 986 | Oriya/character14/rot090 987 | Oriya/character14/rot180 988 | Oriya/character14/rot270 989 | Oriya/character15/rot000 990 | Oriya/character15/rot090 991 | Oriya/character15/rot180 992 | Oriya/character15/rot270 993 | Oriya/character16/rot000 994 | Oriya/character16/rot090 995 | Oriya/character16/rot180 996 | Oriya/character16/rot270 997 | Oriya/character17/rot000 998 | Oriya/character17/rot090 999 | Oriya/character17/rot180 1000 | Oriya/character17/rot270 1001 | Oriya/character18/rot000 1002 | Oriya/character18/rot090 1003 | Oriya/character18/rot180 1004 | Oriya/character18/rot270 1005 | Oriya/character19/rot000 1006 | Oriya/character19/rot090 1007 | Oriya/character19/rot180 1008 | Oriya/character19/rot270 1009 | Oriya/character20/rot000 1010 | Oriya/character20/rot090 1011 | Oriya/character20/rot180 1012 | Oriya/character20/rot270 1013 | Oriya/character21/rot000 1014 | Oriya/character21/rot090 1015 | Oriya/character21/rot180 1016 | Oriya/character21/rot270 1017 | Oriya/character22/rot000 1018 | Oriya/character22/rot090 1019 | Oriya/character22/rot180 1020 | Oriya/character22/rot270 1021 | Oriya/character23/rot000 1022 | Oriya/character23/rot090 1023 | Oriya/character23/rot180 1024 | Oriya/character23/rot270 1025 | Oriya/character24/rot000 1026 | Oriya/character24/rot090 1027 | Oriya/character24/rot180 1028 | Oriya/character24/rot270 1029 | Oriya/character25/rot000 1030 | Oriya/character25/rot090 1031 | Oriya/character25/rot180 1032 | Oriya/character25/rot270 1033 | Oriya/character26/rot000 1034 | Oriya/character26/rot090 1035 | Oriya/character26/rot180 1036 | Oriya/character26/rot270 1037 | Oriya/character27/rot000 1038 | Oriya/character27/rot090 1039 | Oriya/character27/rot180 1040 | Oriya/character27/rot270 1041 | Oriya/character28/rot000 1042 | Oriya/character28/rot090 1043 | Oriya/character28/rot180 1044 | Oriya/character28/rot270 1045 | Oriya/character29/rot000 1046 | Oriya/character29/rot090 1047 | Oriya/character29/rot180 1048 | Oriya/character29/rot270 1049 | Oriya/character30/rot000 1050 | Oriya/character30/rot090 1051 | Oriya/character30/rot180 1052 | Oriya/character30/rot270 1053 | Oriya/character31/rot000 1054 | Oriya/character31/rot090 1055 | Oriya/character31/rot180 1056 | Oriya/character31/rot270 1057 | Oriya/character32/rot000 1058 | Oriya/character32/rot090 1059 | Oriya/character32/rot180 1060 | Oriya/character32/rot270 1061 | Oriya/character33/rot000 1062 | Oriya/character33/rot090 1063 | Oriya/character33/rot180 1064 | Oriya/character33/rot270 1065 | Oriya/character34/rot000 1066 | Oriya/character34/rot090 1067 | Oriya/character34/rot180 1068 | Oriya/character34/rot270 1069 | Oriya/character35/rot000 1070 | Oriya/character35/rot090 1071 | Oriya/character35/rot180 1072 | Oriya/character35/rot270 1073 | Oriya/character36/rot000 1074 | Oriya/character36/rot090 1075 | Oriya/character36/rot180 1076 | Oriya/character36/rot270 1077 | Oriya/character37/rot000 1078 | Oriya/character37/rot090 1079 | Oriya/character37/rot180 1080 | Oriya/character37/rot270 1081 | Oriya/character38/rot000 1082 | Oriya/character38/rot090 1083 | Oriya/character38/rot180 1084 | Oriya/character38/rot270 1085 | Oriya/character39/rot000 1086 | Oriya/character39/rot090 1087 | Oriya/character39/rot180 1088 | Oriya/character39/rot270 1089 | Oriya/character40/rot000 1090 | Oriya/character40/rot090 1091 | Oriya/character40/rot180 1092 | Oriya/character40/rot270 1093 | Oriya/character41/rot000 1094 | Oriya/character41/rot090 1095 | Oriya/character41/rot180 1096 | Oriya/character41/rot270 1097 | Oriya/character42/rot000 1098 | Oriya/character42/rot090 1099 | Oriya/character42/rot180 1100 | Oriya/character42/rot270 1101 | Oriya/character43/rot000 1102 | Oriya/character43/rot090 1103 | Oriya/character43/rot180 1104 | Oriya/character43/rot270 1105 | Oriya/character44/rot000 1106 | Oriya/character44/rot090 1107 | Oriya/character44/rot180 1108 | Oriya/character44/rot270 1109 | Oriya/character45/rot000 1110 | Oriya/character45/rot090 1111 | Oriya/character45/rot180 1112 | Oriya/character45/rot270 1113 | Oriya/character46/rot000 1114 | Oriya/character46/rot090 1115 | Oriya/character46/rot180 1116 | Oriya/character46/rot270 1117 | Syriac_(Serto)/character01/rot000 1118 | Syriac_(Serto)/character01/rot090 1119 | Syriac_(Serto)/character01/rot180 1120 | Syriac_(Serto)/character01/rot270 1121 | Syriac_(Serto)/character02/rot000 1122 | Syriac_(Serto)/character02/rot090 1123 | Syriac_(Serto)/character02/rot180 1124 | Syriac_(Serto)/character02/rot270 1125 | Syriac_(Serto)/character03/rot000 1126 | Syriac_(Serto)/character03/rot090 1127 | Syriac_(Serto)/character03/rot180 1128 | Syriac_(Serto)/character03/rot270 1129 | Syriac_(Serto)/character04/rot000 1130 | Syriac_(Serto)/character04/rot090 1131 | Syriac_(Serto)/character04/rot180 1132 | Syriac_(Serto)/character04/rot270 1133 | Syriac_(Serto)/character05/rot000 1134 | Syriac_(Serto)/character05/rot090 1135 | Syriac_(Serto)/character05/rot180 1136 | Syriac_(Serto)/character05/rot270 1137 | Syriac_(Serto)/character06/rot000 1138 | Syriac_(Serto)/character06/rot090 1139 | Syriac_(Serto)/character06/rot180 1140 | Syriac_(Serto)/character06/rot270 1141 | Syriac_(Serto)/character07/rot000 1142 | Syriac_(Serto)/character07/rot090 1143 | Syriac_(Serto)/character07/rot180 1144 | Syriac_(Serto)/character07/rot270 1145 | Syriac_(Serto)/character08/rot000 1146 | Syriac_(Serto)/character08/rot090 1147 | Syriac_(Serto)/character08/rot180 1148 | Syriac_(Serto)/character08/rot270 1149 | Syriac_(Serto)/character09/rot000 1150 | Syriac_(Serto)/character09/rot090 1151 | Syriac_(Serto)/character09/rot180 1152 | Syriac_(Serto)/character09/rot270 1153 | Syriac_(Serto)/character10/rot000 1154 | Syriac_(Serto)/character10/rot090 1155 | Syriac_(Serto)/character10/rot180 1156 | Syriac_(Serto)/character10/rot270 1157 | Syriac_(Serto)/character11/rot000 1158 | Syriac_(Serto)/character11/rot090 1159 | Syriac_(Serto)/character11/rot180 1160 | Syriac_(Serto)/character11/rot270 1161 | Syriac_(Serto)/character12/rot000 1162 | Syriac_(Serto)/character12/rot090 1163 | Syriac_(Serto)/character12/rot180 1164 | Syriac_(Serto)/character12/rot270 1165 | Syriac_(Serto)/character13/rot000 1166 | Syriac_(Serto)/character13/rot090 1167 | Syriac_(Serto)/character13/rot180 1168 | Syriac_(Serto)/character13/rot270 1169 | Syriac_(Serto)/character14/rot000 1170 | Syriac_(Serto)/character14/rot090 1171 | Syriac_(Serto)/character14/rot180 1172 | Syriac_(Serto)/character14/rot270 1173 | Syriac_(Serto)/character15/rot000 1174 | Syriac_(Serto)/character15/rot090 1175 | Syriac_(Serto)/character15/rot180 1176 | Syriac_(Serto)/character15/rot270 1177 | Syriac_(Serto)/character16/rot000 1178 | Syriac_(Serto)/character16/rot090 1179 | Syriac_(Serto)/character16/rot180 1180 | Syriac_(Serto)/character16/rot270 1181 | Syriac_(Serto)/character17/rot000 1182 | Syriac_(Serto)/character17/rot090 1183 | Syriac_(Serto)/character17/rot180 1184 | Syriac_(Serto)/character17/rot270 1185 | Syriac_(Serto)/character18/rot000 1186 | Syriac_(Serto)/character18/rot090 1187 | Syriac_(Serto)/character18/rot180 1188 | Syriac_(Serto)/character18/rot270 1189 | Syriac_(Serto)/character19/rot000 1190 | Syriac_(Serto)/character19/rot090 1191 | Syriac_(Serto)/character19/rot180 1192 | Syriac_(Serto)/character19/rot270 1193 | Syriac_(Serto)/character20/rot000 1194 | Syriac_(Serto)/character20/rot090 1195 | Syriac_(Serto)/character20/rot180 1196 | Syriac_(Serto)/character20/rot270 1197 | Syriac_(Serto)/character21/rot000 1198 | Syriac_(Serto)/character21/rot090 1199 | Syriac_(Serto)/character21/rot180 1200 | Syriac_(Serto)/character21/rot270 1201 | Syriac_(Serto)/character22/rot000 1202 | Syriac_(Serto)/character22/rot090 1203 | Syriac_(Serto)/character22/rot180 1204 | Syriac_(Serto)/character22/rot270 1205 | Syriac_(Serto)/character23/rot000 1206 | Syriac_(Serto)/character23/rot090 1207 | Syriac_(Serto)/character23/rot180 1208 | Syriac_(Serto)/character23/rot270 1209 | Sylheti/character01/rot000 1210 | Sylheti/character01/rot090 1211 | Sylheti/character01/rot180 1212 | Sylheti/character01/rot270 1213 | Sylheti/character02/rot000 1214 | Sylheti/character02/rot090 1215 | Sylheti/character02/rot180 1216 | Sylheti/character02/rot270 1217 | Sylheti/character03/rot000 1218 | Sylheti/character03/rot090 1219 | Sylheti/character03/rot180 1220 | Sylheti/character03/rot270 1221 | Sylheti/character04/rot000 1222 | Sylheti/character04/rot090 1223 | Sylheti/character04/rot180 1224 | Sylheti/character04/rot270 1225 | Sylheti/character05/rot000 1226 | Sylheti/character05/rot090 1227 | Sylheti/character05/rot180 1228 | Sylheti/character05/rot270 1229 | Sylheti/character06/rot000 1230 | Sylheti/character06/rot090 1231 | Sylheti/character06/rot180 1232 | Sylheti/character06/rot270 1233 | Sylheti/character07/rot000 1234 | Sylheti/character07/rot090 1235 | Sylheti/character07/rot180 1236 | Sylheti/character07/rot270 1237 | Sylheti/character08/rot000 1238 | Sylheti/character08/rot090 1239 | Sylheti/character08/rot180 1240 | Sylheti/character08/rot270 1241 | Sylheti/character09/rot000 1242 | Sylheti/character09/rot090 1243 | Sylheti/character09/rot180 1244 | Sylheti/character09/rot270 1245 | Sylheti/character10/rot000 1246 | Sylheti/character10/rot090 1247 | Sylheti/character10/rot180 1248 | Sylheti/character10/rot270 1249 | Sylheti/character11/rot000 1250 | Sylheti/character11/rot090 1251 | Sylheti/character11/rot180 1252 | Sylheti/character11/rot270 1253 | Sylheti/character12/rot000 1254 | Sylheti/character12/rot090 1255 | Sylheti/character12/rot180 1256 | Sylheti/character12/rot270 1257 | Sylheti/character13/rot000 1258 | Sylheti/character13/rot090 1259 | Sylheti/character13/rot180 1260 | Sylheti/character13/rot270 1261 | Sylheti/character14/rot000 1262 | Sylheti/character14/rot090 1263 | Sylheti/character14/rot180 1264 | Sylheti/character14/rot270 1265 | Sylheti/character15/rot000 1266 | Sylheti/character15/rot090 1267 | Sylheti/character15/rot180 1268 | Sylheti/character15/rot270 1269 | Sylheti/character16/rot000 1270 | Sylheti/character16/rot090 1271 | Sylheti/character16/rot180 1272 | Sylheti/character16/rot270 1273 | Sylheti/character17/rot000 1274 | Sylheti/character17/rot090 1275 | Sylheti/character17/rot180 1276 | Sylheti/character17/rot270 1277 | Sylheti/character18/rot000 1278 | Sylheti/character18/rot090 1279 | Sylheti/character18/rot180 1280 | Sylheti/character18/rot270 1281 | Sylheti/character19/rot000 1282 | Sylheti/character19/rot090 1283 | Sylheti/character19/rot180 1284 | Sylheti/character19/rot270 1285 | Sylheti/character20/rot000 1286 | Sylheti/character20/rot090 1287 | Sylheti/character20/rot180 1288 | Sylheti/character20/rot270 1289 | Sylheti/character21/rot000 1290 | Sylheti/character21/rot090 1291 | Sylheti/character21/rot180 1292 | Sylheti/character21/rot270 1293 | Sylheti/character22/rot000 1294 | Sylheti/character22/rot090 1295 | Sylheti/character22/rot180 1296 | Sylheti/character22/rot270 1297 | Sylheti/character23/rot000 1298 | Sylheti/character23/rot090 1299 | Sylheti/character23/rot180 1300 | Sylheti/character23/rot270 1301 | Sylheti/character24/rot000 1302 | Sylheti/character24/rot090 1303 | Sylheti/character24/rot180 1304 | Sylheti/character24/rot270 1305 | Sylheti/character25/rot000 1306 | Sylheti/character25/rot090 1307 | Sylheti/character25/rot180 1308 | Sylheti/character25/rot270 1309 | Sylheti/character26/rot000 1310 | Sylheti/character26/rot090 1311 | Sylheti/character26/rot180 1312 | Sylheti/character26/rot270 1313 | Sylheti/character27/rot000 1314 | Sylheti/character27/rot090 1315 | Sylheti/character27/rot180 1316 | Sylheti/character27/rot270 1317 | Sylheti/character28/rot000 1318 | Sylheti/character28/rot090 1319 | Sylheti/character28/rot180 1320 | Sylheti/character28/rot270 1321 | Tengwar/character01/rot000 1322 | Tengwar/character01/rot090 1323 | Tengwar/character01/rot180 1324 | Tengwar/character01/rot270 1325 | Tengwar/character02/rot000 1326 | Tengwar/character02/rot090 1327 | Tengwar/character02/rot180 1328 | Tengwar/character02/rot270 1329 | Tengwar/character03/rot000 1330 | Tengwar/character03/rot090 1331 | Tengwar/character03/rot180 1332 | Tengwar/character03/rot270 1333 | Tengwar/character04/rot000 1334 | Tengwar/character04/rot090 1335 | Tengwar/character04/rot180 1336 | Tengwar/character04/rot270 1337 | Tengwar/character05/rot000 1338 | Tengwar/character05/rot090 1339 | Tengwar/character05/rot180 1340 | Tengwar/character05/rot270 1341 | Tengwar/character06/rot000 1342 | Tengwar/character06/rot090 1343 | Tengwar/character06/rot180 1344 | Tengwar/character06/rot270 1345 | Tengwar/character07/rot000 1346 | Tengwar/character07/rot090 1347 | Tengwar/character07/rot180 1348 | Tengwar/character07/rot270 1349 | Tengwar/character08/rot000 1350 | Tengwar/character08/rot090 1351 | Tengwar/character08/rot180 1352 | Tengwar/character08/rot270 1353 | Tengwar/character09/rot000 1354 | Tengwar/character09/rot090 1355 | Tengwar/character09/rot180 1356 | Tengwar/character09/rot270 1357 | Tengwar/character10/rot000 1358 | Tengwar/character10/rot090 1359 | Tengwar/character10/rot180 1360 | Tengwar/character10/rot270 1361 | Tengwar/character11/rot000 1362 | Tengwar/character11/rot090 1363 | Tengwar/character11/rot180 1364 | Tengwar/character11/rot270 1365 | Tengwar/character12/rot000 1366 | Tengwar/character12/rot090 1367 | Tengwar/character12/rot180 1368 | Tengwar/character12/rot270 1369 | Tengwar/character13/rot000 1370 | Tengwar/character13/rot090 1371 | Tengwar/character13/rot180 1372 | Tengwar/character13/rot270 1373 | Tengwar/character14/rot000 1374 | Tengwar/character14/rot090 1375 | Tengwar/character14/rot180 1376 | Tengwar/character14/rot270 1377 | Tengwar/character15/rot000 1378 | Tengwar/character15/rot090 1379 | Tengwar/character15/rot180 1380 | Tengwar/character15/rot270 1381 | Tengwar/character16/rot000 1382 | Tengwar/character16/rot090 1383 | Tengwar/character16/rot180 1384 | Tengwar/character16/rot270 1385 | Tengwar/character17/rot000 1386 | Tengwar/character17/rot090 1387 | Tengwar/character17/rot180 1388 | Tengwar/character17/rot270 1389 | Tengwar/character18/rot000 1390 | Tengwar/character18/rot090 1391 | Tengwar/character18/rot180 1392 | Tengwar/character18/rot270 1393 | Tengwar/character19/rot000 1394 | Tengwar/character19/rot090 1395 | Tengwar/character19/rot180 1396 | Tengwar/character19/rot270 1397 | Tengwar/character20/rot000 1398 | Tengwar/character20/rot090 1399 | Tengwar/character20/rot180 1400 | Tengwar/character20/rot270 1401 | Tengwar/character21/rot000 1402 | Tengwar/character21/rot090 1403 | Tengwar/character21/rot180 1404 | Tengwar/character21/rot270 1405 | Tengwar/character22/rot000 1406 | Tengwar/character22/rot090 1407 | Tengwar/character22/rot180 1408 | Tengwar/character22/rot270 1409 | Tengwar/character23/rot000 1410 | Tengwar/character23/rot090 1411 | Tengwar/character23/rot180 1412 | Tengwar/character23/rot270 1413 | Tengwar/character24/rot000 1414 | Tengwar/character24/rot090 1415 | Tengwar/character24/rot180 1416 | Tengwar/character24/rot270 1417 | Tengwar/character25/rot000 1418 | Tengwar/character25/rot090 1419 | Tengwar/character25/rot180 1420 | Tengwar/character25/rot270 1421 | Tibetan/character01/rot000 1422 | Tibetan/character01/rot090 1423 | Tibetan/character01/rot180 1424 | Tibetan/character01/rot270 1425 | Tibetan/character02/rot000 1426 | Tibetan/character02/rot090 1427 | Tibetan/character02/rot180 1428 | Tibetan/character02/rot270 1429 | Tibetan/character03/rot000 1430 | Tibetan/character03/rot090 1431 | Tibetan/character03/rot180 1432 | Tibetan/character03/rot270 1433 | Tibetan/character04/rot000 1434 | Tibetan/character04/rot090 1435 | Tibetan/character04/rot180 1436 | Tibetan/character04/rot270 1437 | Tibetan/character05/rot000 1438 | Tibetan/character05/rot090 1439 | Tibetan/character05/rot180 1440 | Tibetan/character05/rot270 1441 | Tibetan/character06/rot000 1442 | Tibetan/character06/rot090 1443 | Tibetan/character06/rot180 1444 | Tibetan/character06/rot270 1445 | Tibetan/character07/rot000 1446 | Tibetan/character07/rot090 1447 | Tibetan/character07/rot180 1448 | Tibetan/character07/rot270 1449 | Tibetan/character08/rot000 1450 | Tibetan/character08/rot090 1451 | Tibetan/character08/rot180 1452 | Tibetan/character08/rot270 1453 | Tibetan/character09/rot000 1454 | Tibetan/character09/rot090 1455 | Tibetan/character09/rot180 1456 | Tibetan/character09/rot270 1457 | Tibetan/character10/rot000 1458 | Tibetan/character10/rot090 1459 | Tibetan/character10/rot180 1460 | Tibetan/character10/rot270 1461 | Tibetan/character11/rot000 1462 | Tibetan/character11/rot090 1463 | Tibetan/character11/rot180 1464 | Tibetan/character11/rot270 1465 | Tibetan/character12/rot000 1466 | Tibetan/character12/rot090 1467 | Tibetan/character12/rot180 1468 | Tibetan/character12/rot270 1469 | Tibetan/character13/rot000 1470 | Tibetan/character13/rot090 1471 | Tibetan/character13/rot180 1472 | Tibetan/character13/rot270 1473 | Tibetan/character14/rot000 1474 | Tibetan/character14/rot090 1475 | Tibetan/character14/rot180 1476 | Tibetan/character14/rot270 1477 | Tibetan/character15/rot000 1478 | Tibetan/character15/rot090 1479 | Tibetan/character15/rot180 1480 | Tibetan/character15/rot270 1481 | Tibetan/character16/rot000 1482 | Tibetan/character16/rot090 1483 | Tibetan/character16/rot180 1484 | Tibetan/character16/rot270 1485 | Tibetan/character17/rot000 1486 | Tibetan/character17/rot090 1487 | Tibetan/character17/rot180 1488 | Tibetan/character17/rot270 1489 | Tibetan/character18/rot000 1490 | Tibetan/character18/rot090 1491 | Tibetan/character18/rot180 1492 | Tibetan/character18/rot270 1493 | Tibetan/character19/rot000 1494 | Tibetan/character19/rot090 1495 | Tibetan/character19/rot180 1496 | Tibetan/character19/rot270 1497 | Tibetan/character20/rot000 1498 | Tibetan/character20/rot090 1499 | Tibetan/character20/rot180 1500 | Tibetan/character20/rot270 1501 | Tibetan/character21/rot000 1502 | Tibetan/character21/rot090 1503 | Tibetan/character21/rot180 1504 | Tibetan/character21/rot270 1505 | Tibetan/character22/rot000 1506 | Tibetan/character22/rot090 1507 | Tibetan/character22/rot180 1508 | Tibetan/character22/rot270 1509 | Tibetan/character23/rot000 1510 | Tibetan/character23/rot090 1511 | Tibetan/character23/rot180 1512 | Tibetan/character23/rot270 1513 | Tibetan/character24/rot000 1514 | Tibetan/character24/rot090 1515 | Tibetan/character24/rot180 1516 | Tibetan/character24/rot270 1517 | Tibetan/character25/rot000 1518 | Tibetan/character25/rot090 1519 | Tibetan/character25/rot180 1520 | Tibetan/character25/rot270 1521 | Tibetan/character26/rot000 1522 | Tibetan/character26/rot090 1523 | Tibetan/character26/rot180 1524 | Tibetan/character26/rot270 1525 | Tibetan/character27/rot000 1526 | Tibetan/character27/rot090 1527 | Tibetan/character27/rot180 1528 | Tibetan/character27/rot270 1529 | Tibetan/character28/rot000 1530 | Tibetan/character28/rot090 1531 | Tibetan/character28/rot180 1532 | Tibetan/character28/rot270 1533 | Tibetan/character29/rot000 1534 | Tibetan/character29/rot090 1535 | Tibetan/character29/rot180 1536 | Tibetan/character29/rot270 1537 | Tibetan/character30/rot000 1538 | Tibetan/character30/rot090 1539 | Tibetan/character30/rot180 1540 | Tibetan/character30/rot270 1541 | Tibetan/character31/rot000 1542 | Tibetan/character31/rot090 1543 | Tibetan/character31/rot180 1544 | Tibetan/character31/rot270 1545 | Tibetan/character32/rot000 1546 | Tibetan/character32/rot090 1547 | Tibetan/character32/rot180 1548 | Tibetan/character32/rot270 1549 | Tibetan/character33/rot000 1550 | Tibetan/character33/rot090 1551 | Tibetan/character33/rot180 1552 | Tibetan/character33/rot270 1553 | Tibetan/character34/rot000 1554 | Tibetan/character34/rot090 1555 | Tibetan/character34/rot180 1556 | Tibetan/character34/rot270 1557 | Tibetan/character35/rot000 1558 | Tibetan/character35/rot090 1559 | Tibetan/character35/rot180 1560 | Tibetan/character35/rot270 1561 | Tibetan/character36/rot000 1562 | Tibetan/character36/rot090 1563 | Tibetan/character36/rot180 1564 | Tibetan/character36/rot270 1565 | Tibetan/character37/rot000 1566 | Tibetan/character37/rot090 1567 | Tibetan/character37/rot180 1568 | Tibetan/character37/rot270 1569 | Tibetan/character38/rot000 1570 | Tibetan/character38/rot090 1571 | Tibetan/character38/rot180 1572 | Tibetan/character38/rot270 1573 | Tibetan/character39/rot000 1574 | Tibetan/character39/rot090 1575 | Tibetan/character39/rot180 1576 | Tibetan/character39/rot270 1577 | Tibetan/character40/rot000 1578 | Tibetan/character40/rot090 1579 | Tibetan/character40/rot180 1580 | Tibetan/character40/rot270 1581 | Tibetan/character41/rot000 1582 | Tibetan/character41/rot090 1583 | Tibetan/character41/rot180 1584 | Tibetan/character41/rot270 1585 | Tibetan/character42/rot000 1586 | Tibetan/character42/rot090 1587 | Tibetan/character42/rot180 1588 | Tibetan/character42/rot270 1589 | ULOG/character01/rot000 1590 | ULOG/character01/rot090 1591 | ULOG/character01/rot180 1592 | ULOG/character01/rot270 1593 | ULOG/character02/rot000 1594 | ULOG/character02/rot090 1595 | ULOG/character02/rot180 1596 | ULOG/character02/rot270 1597 | ULOG/character03/rot000 1598 | ULOG/character03/rot090 1599 | ULOG/character03/rot180 1600 | ULOG/character03/rot270 1601 | ULOG/character04/rot000 1602 | ULOG/character04/rot090 1603 | ULOG/character04/rot180 1604 | ULOG/character04/rot270 1605 | ULOG/character05/rot000 1606 | ULOG/character05/rot090 1607 | ULOG/character05/rot180 1608 | ULOG/character05/rot270 1609 | ULOG/character06/rot000 1610 | ULOG/character06/rot090 1611 | ULOG/character06/rot180 1612 | ULOG/character06/rot270 1613 | ULOG/character07/rot000 1614 | ULOG/character07/rot090 1615 | ULOG/character07/rot180 1616 | ULOG/character07/rot270 1617 | ULOG/character08/rot000 1618 | ULOG/character08/rot090 1619 | ULOG/character08/rot180 1620 | ULOG/character08/rot270 1621 | ULOG/character09/rot000 1622 | ULOG/character09/rot090 1623 | ULOG/character09/rot180 1624 | ULOG/character09/rot270 1625 | ULOG/character10/rot000 1626 | ULOG/character10/rot090 1627 | ULOG/character10/rot180 1628 | ULOG/character10/rot270 1629 | ULOG/character11/rot000 1630 | ULOG/character11/rot090 1631 | ULOG/character11/rot180 1632 | ULOG/character11/rot270 1633 | ULOG/character12/rot000 1634 | ULOG/character12/rot090 1635 | ULOG/character12/rot180 1636 | ULOG/character12/rot270 1637 | ULOG/character13/rot000 1638 | ULOG/character13/rot090 1639 | ULOG/character13/rot180 1640 | ULOG/character13/rot270 1641 | ULOG/character14/rot000 1642 | ULOG/character14/rot090 1643 | ULOG/character14/rot180 1644 | ULOG/character14/rot270 1645 | ULOG/character15/rot000 1646 | ULOG/character15/rot090 1647 | ULOG/character15/rot180 1648 | ULOG/character15/rot270 1649 | ULOG/character16/rot000 1650 | ULOG/character16/rot090 1651 | ULOG/character16/rot180 1652 | ULOG/character16/rot270 1653 | ULOG/character17/rot000 1654 | ULOG/character17/rot090 1655 | ULOG/character17/rot180 1656 | ULOG/character17/rot270 1657 | ULOG/character18/rot000 1658 | ULOG/character18/rot090 1659 | ULOG/character18/rot180 1660 | ULOG/character18/rot270 1661 | ULOG/character19/rot000 1662 | ULOG/character19/rot090 1663 | ULOG/character19/rot180 1664 | ULOG/character19/rot270 1665 | ULOG/character20/rot000 1666 | ULOG/character20/rot090 1667 | ULOG/character20/rot180 1668 | ULOG/character20/rot270 1669 | ULOG/character21/rot000 1670 | ULOG/character21/rot090 1671 | ULOG/character21/rot180 1672 | ULOG/character21/rot270 1673 | ULOG/character22/rot000 1674 | ULOG/character22/rot090 1675 | ULOG/character22/rot180 1676 | ULOG/character22/rot270 1677 | ULOG/character23/rot000 1678 | ULOG/character23/rot090 1679 | ULOG/character23/rot180 1680 | ULOG/character23/rot270 1681 | ULOG/character24/rot000 1682 | ULOG/character24/rot090 1683 | ULOG/character24/rot180 1684 | ULOG/character24/rot270 1685 | ULOG/character25/rot000 1686 | ULOG/character25/rot090 1687 | ULOG/character25/rot180 1688 | ULOG/character25/rot270 1689 | ULOG/character26/rot000 1690 | ULOG/character26/rot090 1691 | ULOG/character26/rot180 1692 | ULOG/character26/rot270 1693 | -------------------------------------------------------------------------------- /download_miniimagenet.sh: -------------------------------------------------------------------------------- 1 | declare -a trainclasses=("n04509417" "n07697537" "n03924679" "n02113712" "n02089867" "n02108551" "n03888605" "n04435653" "n02074367" "n03017168" "n02823428" "n03337140" "n02687172" "n02108089" "n13133613" "n01704323" "n02165456" "n01532829" "n02108915" "n01910747" "n03220513" "n03047690" "n02457408" "n01843383" "n02747177" "n01749939" "n13054560" "n03207743" "n02105505" "n02101006" "n09246464" "n04251144" "n04389033" "n03347037" "n04067472" "n01558993" "n07584110" "n03062245" "n04515003" "n03998194" "n04258138" "n06794110" "n02966193" "n02795169" "n03476684" "n03400231" "n01770081" "n02120079" "n03527444" "n07747607" "n04443257" "n04275548" "n04596742" "n02606052" "n04612504" "n04604644" "n04243546" "n03676483" "n03854065" "n02111277" "n04296562" "n03908618" "n02091831" "n03838899") 2 | declare -a testclasses=("n02110341" "n01930112" "n02219486" "n02443484" "n01981276" "n02129165" "n04522168" "n02099601" "n03775546" "n02110063" "n02116738" "n03146219" "n02871525" "n03127925" "n03544143" "n03272010" "n07613480" "n04146614" "n04418357" "n04149813") 3 | 4 | token= 5 | user= 6 | DATADIR=data/mini-imagenet 7 | 8 | # Create directories 9 | mkdir $DATADIR/data 10 | mkdir $DATADIR/data/train 11 | mkdir $DATADIR/data/test 12 | 13 | # Download train set 14 | for i in "${trainclasses[@]}" 15 | do 16 | wget -c --output-document=$DATADIR/data/train/$i.tar "http://www.image-net.org/download/synset?wnid=$i&username=$user&accesskey=$token&release=latest&src=stanford" 17 | mkdir $DATADIR/data/train/$i 18 | tar xf $DATADIR/data/train/$i.tar -C $DATADIR/data/train/$i/ 19 | done 20 | 21 | # Download test set 22 | for j in "${testclasses[@]}" 23 | do 24 | wget -c --output-document=$DATADIR/data/test/$j.tar "http://www.image-net.org/download/synset?wnid=$j&username=$user&accesskey=$token&release=latest&src=stanford" 25 | mkdir $DATADIR/data/test/$j 26 | tar xf $DATADIR/data/test/$j.tar -C $DATADIR/data/test/$j/ 27 | done -------------------------------------------------------------------------------- /download_omniglot.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | DATADIR=data/omniglot/data 3 | 4 | mkdir -p $DATADIR 5 | wget -O images_background.zip https://github.com/brendenlake/omniglot/blob/master/python/images_background.zip?raw=true 6 | wget -O images_evaluation.zip https://github.com/brendenlake/omniglot/blob/master/python/images_evaluation.zip?raw=true 7 | unzip images_background.zip -d $DATADIR 8 | unzip images_evaluation.zip -d $DATADIR 9 | mv $DATADIR/images_background/* $DATADIR/ 10 | mv $DATADIR/images_evaluation/* $DATADIR/ 11 | rmdir $DATADIR/images_background 12 | rmdir $DATADIR/images_evaluation 13 | --------------------------------------------------------------------------------