├── .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 |
--------------------------------------------------------------------------------