├── .gitignore ├── LICENSE ├── README.md ├── data ├── miniImagenet │ └── splits │ │ └── ravi │ │ ├── test.csv │ │ ├── train.csv │ │ └── val.csv └── omniglot │ └── splits │ └── vinyals │ ├── test.txt │ ├── train.txt │ ├── trainval.txt │ └── val.txt ├── download_omniglot.sh ├── protonets ├── __init__.py ├── data │ ├── __init__.py │ ├── base.py │ └── omniglot.py ├── engine.py ├── models │ ├── __init__.py │ ├── factory.py │ ├── few_shot.py │ └── utils.py └── utils │ ├── __init__.py │ ├── data.py │ ├── log.py │ └── model.py ├── scripts ├── predict │ └── few_shot │ │ ├── eval.py │ │ └── run_eval.py └── train │ └── few_shot │ ├── run_train.py │ ├── run_trainval.py │ ├── train.py │ └── trainval.py └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.swp 3 | *.egg-info/ 4 | results/ 5 | data/*/data 6 | dist 7 | build 8 | *.zip -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Jake Snell 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Prototypical Networks for Few-shot Learning 2 | 3 | Code for the NIPS 2017 paper [Prototypical Networks for Few-shot Learning](http://papers.nips.cc/paper/6996-prototypical-networks-for-few-shot-learning.pdf). 4 | 5 | If you use this code, please cite our paper: 6 | 7 | ``` 8 | @inproceedings{snell2017prototypical, 9 | title={Prototypical Networks for Few-shot Learning}, 10 | author={Snell, Jake and Swersky, Kevin and Zemel, Richard}, 11 | booktitle={Advances in Neural Information Processing Systems}, 12 | year={2017} 13 | } 14 | ``` 15 | 16 | ## Training a prototypical network 17 | 18 | ### Install dependencies 19 | 20 | * This code has been tested on Ubuntu 16.04 with Python 3.6 and PyTorch 0.4. 21 | * Install [PyTorch and torchvision](http://pytorch.org/). 22 | * Install [torchnet](https://github.com/pytorch/tnt) by running `pip install git+https://github.com/pytorch/tnt.git@master`. 23 | * Install the protonets package by running `python setup.py install` or `python setup.py develop`. 24 | 25 | ### Set up the Omniglot dataset 26 | 27 | * Run `sh download_omniglot.sh`. 28 | 29 | ### Train the model 30 | 31 | * Run `python scripts/train/few_shot/run_train.py`. This will run training and place the results into `results`. 32 | * You can specify a different output directory by passing in the option `--log.exp_dir EXP_DIR`, where `EXP_DIR` is your desired output directory. 33 | * If you are running on a GPU you can pass in the option `--data.cuda`. 34 | * Re-run in trainval mode `python scripts/train/few_shot/run_trainval.py`. This will save your model into `results/trainval` by default. 35 | 36 | ### Evaluate 37 | 38 | * Run evaluation as: `python scripts/predict/few_shot/run_eval.py --model.model_path results/trainval/best_model.pt`. 39 | -------------------------------------------------------------------------------- /data/omniglot/splits/vinyals/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 | -------------------------------------------------------------------------------- /data/omniglot/splits/vinyals/val.txt: -------------------------------------------------------------------------------- 1 | Hebrew/character01/rot000 2 | Hebrew/character01/rot090 3 | Hebrew/character01/rot180 4 | Hebrew/character01/rot270 5 | Hebrew/character02/rot000 6 | Hebrew/character02/rot090 7 | Hebrew/character02/rot180 8 | Hebrew/character02/rot270 9 | Hebrew/character03/rot000 10 | Hebrew/character03/rot090 11 | Hebrew/character03/rot180 12 | Hebrew/character03/rot270 13 | Hebrew/character04/rot000 14 | Hebrew/character04/rot090 15 | Hebrew/character04/rot180 16 | Hebrew/character04/rot270 17 | Hebrew/character05/rot000 18 | Hebrew/character05/rot090 19 | Hebrew/character05/rot180 20 | Hebrew/character05/rot270 21 | Hebrew/character06/rot000 22 | Hebrew/character06/rot090 23 | Hebrew/character06/rot180 24 | Hebrew/character06/rot270 25 | Hebrew/character07/rot000 26 | Hebrew/character07/rot090 27 | Hebrew/character07/rot180 28 | Hebrew/character07/rot270 29 | Hebrew/character08/rot000 30 | Hebrew/character08/rot090 31 | Hebrew/character08/rot180 32 | Hebrew/character08/rot270 33 | Hebrew/character09/rot000 34 | Hebrew/character09/rot090 35 | Hebrew/character09/rot180 36 | Hebrew/character09/rot270 37 | Hebrew/character10/rot000 38 | Hebrew/character10/rot090 39 | Hebrew/character10/rot180 40 | Hebrew/character10/rot270 41 | Hebrew/character11/rot000 42 | Hebrew/character11/rot090 43 | Hebrew/character11/rot180 44 | Hebrew/character11/rot270 45 | Hebrew/character12/rot000 46 | Hebrew/character12/rot090 47 | Hebrew/character12/rot180 48 | Hebrew/character12/rot270 49 | Hebrew/character13/rot000 50 | Hebrew/character13/rot090 51 | Hebrew/character13/rot180 52 | Hebrew/character13/rot270 53 | Hebrew/character14/rot000 54 | Hebrew/character14/rot090 55 | Hebrew/character14/rot180 56 | Hebrew/character14/rot270 57 | Hebrew/character15/rot000 58 | Hebrew/character15/rot090 59 | Hebrew/character15/rot180 60 | Hebrew/character15/rot270 61 | Hebrew/character16/rot000 62 | Hebrew/character16/rot090 63 | Hebrew/character16/rot180 64 | Hebrew/character16/rot270 65 | Hebrew/character17/rot000 66 | Hebrew/character17/rot090 67 | Hebrew/character17/rot180 68 | Hebrew/character17/rot270 69 | Hebrew/character18/rot000 70 | Hebrew/character18/rot090 71 | Hebrew/character18/rot180 72 | Hebrew/character18/rot270 73 | Hebrew/character19/rot000 74 | Hebrew/character19/rot090 75 | Hebrew/character19/rot180 76 | Hebrew/character19/rot270 77 | Hebrew/character20/rot000 78 | Hebrew/character20/rot090 79 | Hebrew/character20/rot180 80 | Hebrew/character20/rot270 81 | Hebrew/character21/rot000 82 | Hebrew/character21/rot090 83 | Hebrew/character21/rot180 84 | Hebrew/character21/rot270 85 | Hebrew/character22/rot000 86 | Hebrew/character22/rot090 87 | Hebrew/character22/rot180 88 | Hebrew/character22/rot270 89 | Mkhedruli_(Georgian)/character01/rot000 90 | Mkhedruli_(Georgian)/character01/rot090 91 | Mkhedruli_(Georgian)/character01/rot180 92 | Mkhedruli_(Georgian)/character01/rot270 93 | Mkhedruli_(Georgian)/character02/rot000 94 | Mkhedruli_(Georgian)/character02/rot090 95 | Mkhedruli_(Georgian)/character02/rot180 96 | Mkhedruli_(Georgian)/character02/rot270 97 | Mkhedruli_(Georgian)/character03/rot000 98 | Mkhedruli_(Georgian)/character03/rot090 99 | Mkhedruli_(Georgian)/character03/rot180 100 | Mkhedruli_(Georgian)/character03/rot270 101 | Mkhedruli_(Georgian)/character04/rot000 102 | Mkhedruli_(Georgian)/character04/rot090 103 | Mkhedruli_(Georgian)/character04/rot180 104 | Mkhedruli_(Georgian)/character04/rot270 105 | Mkhedruli_(Georgian)/character05/rot000 106 | Mkhedruli_(Georgian)/character05/rot090 107 | Mkhedruli_(Georgian)/character05/rot180 108 | Mkhedruli_(Georgian)/character05/rot270 109 | Mkhedruli_(Georgian)/character06/rot000 110 | Mkhedruli_(Georgian)/character06/rot090 111 | Mkhedruli_(Georgian)/character06/rot180 112 | Mkhedruli_(Georgian)/character06/rot270 113 | Mkhedruli_(Georgian)/character07/rot000 114 | Mkhedruli_(Georgian)/character07/rot090 115 | Mkhedruli_(Georgian)/character07/rot180 116 | Mkhedruli_(Georgian)/character07/rot270 117 | Mkhedruli_(Georgian)/character08/rot000 118 | Mkhedruli_(Georgian)/character08/rot090 119 | Mkhedruli_(Georgian)/character08/rot180 120 | Mkhedruli_(Georgian)/character08/rot270 121 | Mkhedruli_(Georgian)/character09/rot000 122 | Mkhedruli_(Georgian)/character09/rot090 123 | Mkhedruli_(Georgian)/character09/rot180 124 | Mkhedruli_(Georgian)/character09/rot270 125 | Mkhedruli_(Georgian)/character10/rot000 126 | Mkhedruli_(Georgian)/character10/rot090 127 | Mkhedruli_(Georgian)/character10/rot180 128 | Mkhedruli_(Georgian)/character10/rot270 129 | Mkhedruli_(Georgian)/character11/rot000 130 | Mkhedruli_(Georgian)/character11/rot090 131 | Mkhedruli_(Georgian)/character11/rot180 132 | Mkhedruli_(Georgian)/character11/rot270 133 | Mkhedruli_(Georgian)/character12/rot000 134 | Mkhedruli_(Georgian)/character12/rot090 135 | Mkhedruli_(Georgian)/character12/rot180 136 | Mkhedruli_(Georgian)/character12/rot270 137 | Mkhedruli_(Georgian)/character13/rot000 138 | Mkhedruli_(Georgian)/character13/rot090 139 | Mkhedruli_(Georgian)/character13/rot180 140 | Mkhedruli_(Georgian)/character13/rot270 141 | Mkhedruli_(Georgian)/character14/rot000 142 | Mkhedruli_(Georgian)/character14/rot090 143 | Mkhedruli_(Georgian)/character14/rot180 144 | Mkhedruli_(Georgian)/character14/rot270 145 | Mkhedruli_(Georgian)/character15/rot000 146 | Mkhedruli_(Georgian)/character15/rot090 147 | Mkhedruli_(Georgian)/character15/rot180 148 | Mkhedruli_(Georgian)/character15/rot270 149 | Mkhedruli_(Georgian)/character16/rot000 150 | Mkhedruli_(Georgian)/character16/rot090 151 | Mkhedruli_(Georgian)/character16/rot180 152 | Mkhedruli_(Georgian)/character16/rot270 153 | Mkhedruli_(Georgian)/character17/rot000 154 | Mkhedruli_(Georgian)/character17/rot090 155 | Mkhedruli_(Georgian)/character17/rot180 156 | Mkhedruli_(Georgian)/character17/rot270 157 | Mkhedruli_(Georgian)/character18/rot000 158 | Mkhedruli_(Georgian)/character18/rot090 159 | Mkhedruli_(Georgian)/character18/rot180 160 | Mkhedruli_(Georgian)/character18/rot270 161 | Mkhedruli_(Georgian)/character19/rot000 162 | Mkhedruli_(Georgian)/character19/rot090 163 | Mkhedruli_(Georgian)/character19/rot180 164 | Mkhedruli_(Georgian)/character19/rot270 165 | Mkhedruli_(Georgian)/character20/rot000 166 | Mkhedruli_(Georgian)/character20/rot090 167 | Mkhedruli_(Georgian)/character20/rot180 168 | Mkhedruli_(Georgian)/character20/rot270 169 | Mkhedruli_(Georgian)/character21/rot000 170 | Mkhedruli_(Georgian)/character21/rot090 171 | Mkhedruli_(Georgian)/character21/rot180 172 | Mkhedruli_(Georgian)/character21/rot270 173 | Mkhedruli_(Georgian)/character22/rot000 174 | Mkhedruli_(Georgian)/character22/rot090 175 | Mkhedruli_(Georgian)/character22/rot180 176 | Mkhedruli_(Georgian)/character22/rot270 177 | Mkhedruli_(Georgian)/character23/rot000 178 | Mkhedruli_(Georgian)/character23/rot090 179 | Mkhedruli_(Georgian)/character23/rot180 180 | Mkhedruli_(Georgian)/character23/rot270 181 | Mkhedruli_(Georgian)/character24/rot000 182 | Mkhedruli_(Georgian)/character24/rot090 183 | Mkhedruli_(Georgian)/character24/rot180 184 | Mkhedruli_(Georgian)/character24/rot270 185 | Mkhedruli_(Georgian)/character25/rot000 186 | Mkhedruli_(Georgian)/character25/rot090 187 | Mkhedruli_(Georgian)/character25/rot180 188 | Mkhedruli_(Georgian)/character25/rot270 189 | Mkhedruli_(Georgian)/character26/rot000 190 | Mkhedruli_(Georgian)/character26/rot090 191 | Mkhedruli_(Georgian)/character26/rot180 192 | Mkhedruli_(Georgian)/character26/rot270 193 | Mkhedruli_(Georgian)/character27/rot000 194 | Mkhedruli_(Georgian)/character27/rot090 195 | Mkhedruli_(Georgian)/character27/rot180 196 | Mkhedruli_(Georgian)/character27/rot270 197 | Mkhedruli_(Georgian)/character28/rot000 198 | Mkhedruli_(Georgian)/character28/rot090 199 | Mkhedruli_(Georgian)/character28/rot180 200 | Mkhedruli_(Georgian)/character28/rot270 201 | Mkhedruli_(Georgian)/character29/rot000 202 | Mkhedruli_(Georgian)/character29/rot090 203 | Mkhedruli_(Georgian)/character29/rot180 204 | Mkhedruli_(Georgian)/character29/rot270 205 | Mkhedruli_(Georgian)/character30/rot000 206 | Mkhedruli_(Georgian)/character30/rot090 207 | Mkhedruli_(Georgian)/character30/rot180 208 | Mkhedruli_(Georgian)/character30/rot270 209 | Mkhedruli_(Georgian)/character31/rot000 210 | Mkhedruli_(Georgian)/character31/rot090 211 | Mkhedruli_(Georgian)/character31/rot180 212 | Mkhedruli_(Georgian)/character31/rot270 213 | Mkhedruli_(Georgian)/character32/rot000 214 | Mkhedruli_(Georgian)/character32/rot090 215 | Mkhedruli_(Georgian)/character32/rot180 216 | Mkhedruli_(Georgian)/character32/rot270 217 | Mkhedruli_(Georgian)/character33/rot000 218 | Mkhedruli_(Georgian)/character33/rot090 219 | Mkhedruli_(Georgian)/character33/rot180 220 | Mkhedruli_(Georgian)/character33/rot270 221 | Mkhedruli_(Georgian)/character34/rot000 222 | Mkhedruli_(Georgian)/character34/rot090 223 | Mkhedruli_(Georgian)/character34/rot180 224 | Mkhedruli_(Georgian)/character34/rot270 225 | Mkhedruli_(Georgian)/character35/rot000 226 | Mkhedruli_(Georgian)/character35/rot090 227 | Mkhedruli_(Georgian)/character35/rot180 228 | Mkhedruli_(Georgian)/character35/rot270 229 | Mkhedruli_(Georgian)/character36/rot000 230 | Mkhedruli_(Georgian)/character36/rot090 231 | Mkhedruli_(Georgian)/character36/rot180 232 | Mkhedruli_(Georgian)/character36/rot270 233 | Mkhedruli_(Georgian)/character37/rot000 234 | Mkhedruli_(Georgian)/character37/rot090 235 | Mkhedruli_(Georgian)/character37/rot180 236 | Mkhedruli_(Georgian)/character37/rot270 237 | Mkhedruli_(Georgian)/character38/rot000 238 | Mkhedruli_(Georgian)/character38/rot090 239 | Mkhedruli_(Georgian)/character38/rot180 240 | Mkhedruli_(Georgian)/character38/rot270 241 | Mkhedruli_(Georgian)/character39/rot000 242 | Mkhedruli_(Georgian)/character39/rot090 243 | Mkhedruli_(Georgian)/character39/rot180 244 | Mkhedruli_(Georgian)/character39/rot270 245 | Mkhedruli_(Georgian)/character40/rot000 246 | Mkhedruli_(Georgian)/character40/rot090 247 | Mkhedruli_(Georgian)/character40/rot180 248 | Mkhedruli_(Georgian)/character40/rot270 249 | Mkhedruli_(Georgian)/character41/rot000 250 | Mkhedruli_(Georgian)/character41/rot090 251 | Mkhedruli_(Georgian)/character41/rot180 252 | Mkhedruli_(Georgian)/character41/rot270 253 | Armenian/character01/rot000 254 | Armenian/character01/rot090 255 | Armenian/character01/rot180 256 | Armenian/character01/rot270 257 | Armenian/character02/rot000 258 | Armenian/character02/rot090 259 | Armenian/character02/rot180 260 | Armenian/character02/rot270 261 | Armenian/character03/rot000 262 | Armenian/character03/rot090 263 | Armenian/character03/rot180 264 | Armenian/character03/rot270 265 | Armenian/character04/rot000 266 | Armenian/character04/rot090 267 | Armenian/character04/rot180 268 | Armenian/character04/rot270 269 | Armenian/character05/rot000 270 | Armenian/character05/rot090 271 | Armenian/character05/rot180 272 | Armenian/character05/rot270 273 | Armenian/character06/rot000 274 | Armenian/character06/rot090 275 | Armenian/character06/rot180 276 | Armenian/character06/rot270 277 | Armenian/character07/rot000 278 | Armenian/character07/rot090 279 | Armenian/character07/rot180 280 | Armenian/character07/rot270 281 | Armenian/character08/rot000 282 | Armenian/character08/rot090 283 | Armenian/character08/rot180 284 | Armenian/character08/rot270 285 | Armenian/character09/rot000 286 | Armenian/character09/rot090 287 | Armenian/character09/rot180 288 | Armenian/character09/rot270 289 | Armenian/character10/rot000 290 | Armenian/character10/rot090 291 | Armenian/character10/rot180 292 | Armenian/character10/rot270 293 | Armenian/character11/rot000 294 | Armenian/character11/rot090 295 | Armenian/character11/rot180 296 | Armenian/character11/rot270 297 | Armenian/character12/rot000 298 | Armenian/character12/rot090 299 | Armenian/character12/rot180 300 | Armenian/character12/rot270 301 | Armenian/character13/rot000 302 | Armenian/character13/rot090 303 | Armenian/character13/rot180 304 | Armenian/character13/rot270 305 | Armenian/character14/rot000 306 | Armenian/character14/rot090 307 | Armenian/character14/rot180 308 | Armenian/character14/rot270 309 | Armenian/character15/rot000 310 | Armenian/character15/rot090 311 | Armenian/character15/rot180 312 | Armenian/character15/rot270 313 | Armenian/character16/rot000 314 | Armenian/character16/rot090 315 | Armenian/character16/rot180 316 | Armenian/character16/rot270 317 | Armenian/character17/rot000 318 | Armenian/character17/rot090 319 | Armenian/character17/rot180 320 | Armenian/character17/rot270 321 | Armenian/character18/rot000 322 | Armenian/character18/rot090 323 | Armenian/character18/rot180 324 | Armenian/character18/rot270 325 | Armenian/character19/rot000 326 | Armenian/character19/rot090 327 | Armenian/character19/rot180 328 | Armenian/character19/rot270 329 | Armenian/character20/rot000 330 | Armenian/character20/rot090 331 | Armenian/character20/rot180 332 | Armenian/character20/rot270 333 | Armenian/character21/rot000 334 | Armenian/character21/rot090 335 | Armenian/character21/rot180 336 | Armenian/character21/rot270 337 | Armenian/character22/rot000 338 | Armenian/character22/rot090 339 | Armenian/character22/rot180 340 | Armenian/character22/rot270 341 | Armenian/character23/rot000 342 | Armenian/character23/rot090 343 | Armenian/character23/rot180 344 | Armenian/character23/rot270 345 | Armenian/character24/rot000 346 | Armenian/character24/rot090 347 | Armenian/character24/rot180 348 | Armenian/character24/rot270 349 | Armenian/character25/rot000 350 | Armenian/character25/rot090 351 | Armenian/character25/rot180 352 | Armenian/character25/rot270 353 | Armenian/character26/rot000 354 | Armenian/character26/rot090 355 | Armenian/character26/rot180 356 | Armenian/character26/rot270 357 | Armenian/character27/rot000 358 | Armenian/character27/rot090 359 | Armenian/character27/rot180 360 | Armenian/character27/rot270 361 | Armenian/character28/rot000 362 | Armenian/character28/rot090 363 | Armenian/character28/rot180 364 | Armenian/character28/rot270 365 | Armenian/character29/rot000 366 | Armenian/character29/rot090 367 | Armenian/character29/rot180 368 | Armenian/character29/rot270 369 | Armenian/character30/rot000 370 | Armenian/character30/rot090 371 | Armenian/character30/rot180 372 | Armenian/character30/rot270 373 | Armenian/character31/rot000 374 | Armenian/character31/rot090 375 | Armenian/character31/rot180 376 | Armenian/character31/rot270 377 | Armenian/character32/rot000 378 | Armenian/character32/rot090 379 | Armenian/character32/rot180 380 | Armenian/character32/rot270 381 | Armenian/character33/rot000 382 | Armenian/character33/rot090 383 | Armenian/character33/rot180 384 | Armenian/character33/rot270 385 | Armenian/character34/rot000 386 | Armenian/character34/rot090 387 | Armenian/character34/rot180 388 | Armenian/character34/rot270 389 | Armenian/character35/rot000 390 | Armenian/character35/rot090 391 | Armenian/character35/rot180 392 | Armenian/character35/rot270 393 | Armenian/character36/rot000 394 | Armenian/character36/rot090 395 | Armenian/character36/rot180 396 | Armenian/character36/rot270 397 | Armenian/character37/rot000 398 | Armenian/character37/rot090 399 | Armenian/character37/rot180 400 | Armenian/character37/rot270 401 | Armenian/character38/rot000 402 | Armenian/character38/rot090 403 | Armenian/character38/rot180 404 | Armenian/character38/rot270 405 | Armenian/character39/rot000 406 | Armenian/character39/rot090 407 | Armenian/character39/rot180 408 | Armenian/character39/rot270 409 | Armenian/character40/rot000 410 | Armenian/character40/rot090 411 | Armenian/character40/rot180 412 | Armenian/character40/rot270 413 | Armenian/character41/rot000 414 | Armenian/character41/rot090 415 | Armenian/character41/rot180 416 | Armenian/character41/rot270 417 | Early_Aramaic/character01/rot000 418 | Early_Aramaic/character01/rot090 419 | Early_Aramaic/character01/rot180 420 | Early_Aramaic/character01/rot270 421 | Early_Aramaic/character02/rot000 422 | Early_Aramaic/character02/rot090 423 | Early_Aramaic/character02/rot180 424 | Early_Aramaic/character02/rot270 425 | Early_Aramaic/character03/rot000 426 | Early_Aramaic/character03/rot090 427 | Early_Aramaic/character03/rot180 428 | Early_Aramaic/character03/rot270 429 | Early_Aramaic/character04/rot000 430 | Early_Aramaic/character04/rot090 431 | Early_Aramaic/character04/rot180 432 | Early_Aramaic/character04/rot270 433 | Early_Aramaic/character05/rot000 434 | Early_Aramaic/character05/rot090 435 | Early_Aramaic/character05/rot180 436 | Early_Aramaic/character05/rot270 437 | Early_Aramaic/character06/rot000 438 | Early_Aramaic/character06/rot090 439 | Early_Aramaic/character06/rot180 440 | Early_Aramaic/character06/rot270 441 | Early_Aramaic/character07/rot000 442 | Early_Aramaic/character07/rot090 443 | Early_Aramaic/character07/rot180 444 | Early_Aramaic/character07/rot270 445 | Early_Aramaic/character08/rot000 446 | Early_Aramaic/character08/rot090 447 | Early_Aramaic/character08/rot180 448 | Early_Aramaic/character08/rot270 449 | Early_Aramaic/character09/rot000 450 | Early_Aramaic/character09/rot090 451 | Early_Aramaic/character09/rot180 452 | Early_Aramaic/character09/rot270 453 | Early_Aramaic/character10/rot000 454 | Early_Aramaic/character10/rot090 455 | Early_Aramaic/character10/rot180 456 | Early_Aramaic/character10/rot270 457 | Early_Aramaic/character11/rot000 458 | Early_Aramaic/character11/rot090 459 | Early_Aramaic/character11/rot180 460 | Early_Aramaic/character11/rot270 461 | Early_Aramaic/character12/rot000 462 | Early_Aramaic/character12/rot090 463 | Early_Aramaic/character12/rot180 464 | Early_Aramaic/character12/rot270 465 | Early_Aramaic/character13/rot000 466 | Early_Aramaic/character13/rot090 467 | Early_Aramaic/character13/rot180 468 | Early_Aramaic/character13/rot270 469 | Early_Aramaic/character14/rot000 470 | Early_Aramaic/character14/rot090 471 | Early_Aramaic/character14/rot180 472 | Early_Aramaic/character14/rot270 473 | Early_Aramaic/character15/rot000 474 | Early_Aramaic/character15/rot090 475 | Early_Aramaic/character15/rot180 476 | Early_Aramaic/character15/rot270 477 | Early_Aramaic/character16/rot000 478 | Early_Aramaic/character16/rot090 479 | Early_Aramaic/character16/rot180 480 | Early_Aramaic/character16/rot270 481 | Early_Aramaic/character17/rot000 482 | Early_Aramaic/character17/rot090 483 | Early_Aramaic/character17/rot180 484 | Early_Aramaic/character17/rot270 485 | Early_Aramaic/character18/rot000 486 | Early_Aramaic/character18/rot090 487 | Early_Aramaic/character18/rot180 488 | Early_Aramaic/character18/rot270 489 | Early_Aramaic/character19/rot000 490 | Early_Aramaic/character19/rot090 491 | Early_Aramaic/character19/rot180 492 | Early_Aramaic/character19/rot270 493 | Early_Aramaic/character20/rot000 494 | Early_Aramaic/character20/rot090 495 | Early_Aramaic/character20/rot180 496 | Early_Aramaic/character20/rot270 497 | Early_Aramaic/character21/rot000 498 | Early_Aramaic/character21/rot090 499 | Early_Aramaic/character21/rot180 500 | Early_Aramaic/character21/rot270 501 | Early_Aramaic/character22/rot000 502 | Early_Aramaic/character22/rot090 503 | Early_Aramaic/character22/rot180 504 | Early_Aramaic/character22/rot270 505 | Bengali/character01/rot000 506 | Bengali/character01/rot090 507 | Bengali/character01/rot180 508 | Bengali/character01/rot270 509 | Bengali/character02/rot000 510 | Bengali/character02/rot090 511 | Bengali/character02/rot180 512 | Bengali/character02/rot270 513 | Bengali/character03/rot000 514 | Bengali/character03/rot090 515 | Bengali/character03/rot180 516 | Bengali/character03/rot270 517 | Bengali/character04/rot000 518 | Bengali/character04/rot090 519 | Bengali/character04/rot180 520 | Bengali/character04/rot270 521 | Bengali/character05/rot000 522 | Bengali/character05/rot090 523 | Bengali/character05/rot180 524 | Bengali/character05/rot270 525 | Bengali/character06/rot000 526 | Bengali/character06/rot090 527 | Bengali/character06/rot180 528 | Bengali/character06/rot270 529 | Bengali/character07/rot000 530 | Bengali/character07/rot090 531 | Bengali/character07/rot180 532 | Bengali/character07/rot270 533 | Bengali/character08/rot000 534 | Bengali/character08/rot090 535 | Bengali/character08/rot180 536 | Bengali/character08/rot270 537 | Bengali/character09/rot000 538 | Bengali/character09/rot090 539 | Bengali/character09/rot180 540 | Bengali/character09/rot270 541 | Bengali/character10/rot000 542 | Bengali/character10/rot090 543 | Bengali/character10/rot180 544 | Bengali/character10/rot270 545 | Bengali/character11/rot000 546 | Bengali/character11/rot090 547 | Bengali/character11/rot180 548 | Bengali/character11/rot270 549 | Bengali/character12/rot000 550 | Bengali/character12/rot090 551 | Bengali/character12/rot180 552 | Bengali/character12/rot270 553 | Bengali/character13/rot000 554 | Bengali/character13/rot090 555 | Bengali/character13/rot180 556 | Bengali/character13/rot270 557 | Bengali/character14/rot000 558 | Bengali/character14/rot090 559 | Bengali/character14/rot180 560 | Bengali/character14/rot270 561 | Bengali/character15/rot000 562 | Bengali/character15/rot090 563 | Bengali/character15/rot180 564 | Bengali/character15/rot270 565 | Bengali/character16/rot000 566 | Bengali/character16/rot090 567 | Bengali/character16/rot180 568 | Bengali/character16/rot270 569 | Bengali/character17/rot000 570 | Bengali/character17/rot090 571 | Bengali/character17/rot180 572 | Bengali/character17/rot270 573 | Bengali/character18/rot000 574 | Bengali/character18/rot090 575 | Bengali/character18/rot180 576 | Bengali/character18/rot270 577 | Bengali/character19/rot000 578 | Bengali/character19/rot090 579 | Bengali/character19/rot180 580 | Bengali/character19/rot270 581 | Bengali/character20/rot000 582 | Bengali/character20/rot090 583 | Bengali/character20/rot180 584 | Bengali/character20/rot270 585 | Bengali/character21/rot000 586 | Bengali/character21/rot090 587 | Bengali/character21/rot180 588 | Bengali/character21/rot270 589 | Bengali/character22/rot000 590 | Bengali/character22/rot090 591 | Bengali/character22/rot180 592 | Bengali/character22/rot270 593 | Bengali/character23/rot000 594 | Bengali/character23/rot090 595 | Bengali/character23/rot180 596 | Bengali/character23/rot270 597 | Bengali/character24/rot000 598 | Bengali/character24/rot090 599 | Bengali/character24/rot180 600 | Bengali/character24/rot270 601 | Bengali/character25/rot000 602 | Bengali/character25/rot090 603 | Bengali/character25/rot180 604 | Bengali/character25/rot270 605 | Bengali/character26/rot000 606 | Bengali/character26/rot090 607 | Bengali/character26/rot180 608 | Bengali/character26/rot270 609 | Bengali/character27/rot000 610 | Bengali/character27/rot090 611 | Bengali/character27/rot180 612 | Bengali/character27/rot270 613 | Bengali/character28/rot000 614 | Bengali/character28/rot090 615 | Bengali/character28/rot180 616 | Bengali/character28/rot270 617 | Bengali/character29/rot000 618 | Bengali/character29/rot090 619 | Bengali/character29/rot180 620 | Bengali/character29/rot270 621 | Bengali/character30/rot000 622 | Bengali/character30/rot090 623 | Bengali/character30/rot180 624 | Bengali/character30/rot270 625 | Bengali/character31/rot000 626 | Bengali/character31/rot090 627 | Bengali/character31/rot180 628 | Bengali/character31/rot270 629 | Bengali/character32/rot000 630 | Bengali/character32/rot090 631 | Bengali/character32/rot180 632 | Bengali/character32/rot270 633 | Bengali/character33/rot000 634 | Bengali/character33/rot090 635 | Bengali/character33/rot180 636 | Bengali/character33/rot270 637 | Bengali/character34/rot000 638 | Bengali/character34/rot090 639 | Bengali/character34/rot180 640 | Bengali/character34/rot270 641 | Bengali/character35/rot000 642 | Bengali/character35/rot090 643 | Bengali/character35/rot180 644 | Bengali/character35/rot270 645 | Bengali/character36/rot000 646 | Bengali/character36/rot090 647 | Bengali/character36/rot180 648 | Bengali/character36/rot270 649 | Bengali/character37/rot000 650 | Bengali/character37/rot090 651 | Bengali/character37/rot180 652 | Bengali/character37/rot270 653 | Bengali/character38/rot000 654 | Bengali/character38/rot090 655 | Bengali/character38/rot180 656 | Bengali/character38/rot270 657 | Bengali/character39/rot000 658 | Bengali/character39/rot090 659 | Bengali/character39/rot180 660 | Bengali/character39/rot270 661 | Bengali/character40/rot000 662 | Bengali/character40/rot090 663 | Bengali/character40/rot180 664 | Bengali/character40/rot270 665 | Bengali/character41/rot000 666 | Bengali/character41/rot090 667 | Bengali/character41/rot180 668 | Bengali/character41/rot270 669 | Bengali/character42/rot000 670 | Bengali/character42/rot090 671 | Bengali/character42/rot180 672 | Bengali/character42/rot270 673 | Bengali/character43/rot000 674 | Bengali/character43/rot090 675 | Bengali/character43/rot180 676 | Bengali/character43/rot270 677 | Bengali/character44/rot000 678 | Bengali/character44/rot090 679 | Bengali/character44/rot180 680 | Bengali/character44/rot270 681 | Bengali/character45/rot000 682 | Bengali/character45/rot090 683 | Bengali/character45/rot180 684 | Bengali/character45/rot270 685 | Bengali/character46/rot000 686 | Bengali/character46/rot090 687 | Bengali/character46/rot180 688 | Bengali/character46/rot270 689 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /protonets/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakesnell/prototypical-networks/c9bb4d258267c11cb6e23f0a19242d24ca98ad8a/protonets/__init__.py -------------------------------------------------------------------------------- /protonets/data/__init__.py: -------------------------------------------------------------------------------- 1 | from . import omniglot 2 | -------------------------------------------------------------------------------- /protonets/data/base.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | def convert_dict(k, v): 4 | return { k: v } 5 | 6 | class CudaTransform(object): 7 | def __init__(self): 8 | pass 9 | 10 | def __call__(self, data): 11 | for k,v in data.items(): 12 | if hasattr(v, 'cuda'): 13 | data[k] = v.cuda() 14 | 15 | return data 16 | 17 | class SequentialBatchSampler(object): 18 | def __init__(self, n_classes): 19 | self.n_classes = n_classes 20 | 21 | def __len__(self): 22 | return self.n_classes 23 | 24 | def __iter__(self): 25 | for i in range(self.n_classes): 26 | yield torch.LongTensor([i]) 27 | 28 | class EpisodicBatchSampler(object): 29 | def __init__(self, n_classes, n_way, n_episodes): 30 | self.n_classes = n_classes 31 | self.n_way = n_way 32 | self.n_episodes = n_episodes 33 | 34 | def __len__(self): 35 | return self.n_episodes 36 | 37 | def __iter__(self): 38 | for i in range(self.n_episodes): 39 | yield torch.randperm(self.n_classes)[:self.n_way] 40 | -------------------------------------------------------------------------------- /protonets/data/omniglot.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import glob 4 | 5 | from functools import partial 6 | 7 | import numpy as np 8 | from PIL import Image 9 | 10 | import torch 11 | from torchvision.transforms import ToTensor 12 | 13 | from torchnet.dataset import ListDataset, TransformDataset 14 | from torchnet.transform import compose 15 | 16 | import protonets 17 | from protonets.data.base import convert_dict, CudaTransform, EpisodicBatchSampler, SequentialBatchSampler 18 | 19 | OMNIGLOT_DATA_DIR = os.path.join(os.path.dirname(__file__), '../../data/omniglot') 20 | OMNIGLOT_CACHE = { } 21 | 22 | def load_image_path(key, out_field, d): 23 | d[out_field] = Image.open(d[key]) 24 | return d 25 | 26 | def convert_tensor(key, d): 27 | d[key] = 1.0 - torch.from_numpy(np.array(d[key], np.float32, copy=False)).transpose(0, 1).contiguous().view(1, d[key].size[0], d[key].size[1]) 28 | return d 29 | 30 | def rotate_image(key, rot, d): 31 | d[key] = d[key].rotate(rot) 32 | return d 33 | 34 | def scale_image(key, height, width, d): 35 | d[key] = d[key].resize((height, width)) 36 | return d 37 | 38 | def load_class_images(d): 39 | if d['class'] not in OMNIGLOT_CACHE: 40 | alphabet, character, rot = d['class'].split('/') 41 | image_dir = os.path.join(OMNIGLOT_DATA_DIR, 'data', alphabet, character) 42 | 43 | class_images = sorted(glob.glob(os.path.join(image_dir, '*.png'))) 44 | if len(class_images) == 0: 45 | raise Exception("No images found for omniglot class {} at {}. Did you run download_omniglot.sh first?".format(d['class'], image_dir)) 46 | 47 | image_ds = TransformDataset(ListDataset(class_images), 48 | compose([partial(convert_dict, 'file_name'), 49 | partial(load_image_path, 'file_name', 'data'), 50 | partial(rotate_image, 'data', float(rot[3:])), 51 | partial(scale_image, 'data', 28, 28), 52 | partial(convert_tensor, 'data')])) 53 | 54 | loader = torch.utils.data.DataLoader(image_ds, batch_size=len(image_ds), shuffle=False) 55 | 56 | for sample in loader: 57 | OMNIGLOT_CACHE[d['class']] = sample['data'] 58 | break # only need one sample because batch size equal to dataset length 59 | 60 | return { 'class': d['class'], 'data': OMNIGLOT_CACHE[d['class']] } 61 | 62 | def extract_episode(n_support, n_query, d): 63 | # data: N x C x H x W 64 | n_examples = d['data'].size(0) 65 | 66 | if n_query == -1: 67 | n_query = n_examples - n_support 68 | 69 | example_inds = torch.randperm(n_examples)[:(n_support+n_query)] 70 | support_inds = example_inds[:n_support] 71 | query_inds = example_inds[n_support:] 72 | 73 | xs = d['data'][support_inds] 74 | xq = d['data'][query_inds] 75 | 76 | return { 77 | 'class': d['class'], 78 | 'xs': xs, 79 | 'xq': xq 80 | } 81 | 82 | def load(opt, splits): 83 | split_dir = os.path.join(OMNIGLOT_DATA_DIR, 'splits', opt['data.split']) 84 | 85 | ret = { } 86 | for split in splits: 87 | if split in ['val', 'test'] and opt['data.test_way'] != 0: 88 | n_way = opt['data.test_way'] 89 | else: 90 | n_way = opt['data.way'] 91 | 92 | if split in ['val', 'test'] and opt['data.test_shot'] != 0: 93 | n_support = opt['data.test_shot'] 94 | else: 95 | n_support = opt['data.shot'] 96 | 97 | if split in ['val', 'test'] and opt['data.test_query'] != 0: 98 | n_query = opt['data.test_query'] 99 | else: 100 | n_query = opt['data.query'] 101 | 102 | if split in ['val', 'test']: 103 | n_episodes = opt['data.test_episodes'] 104 | else: 105 | n_episodes = opt['data.train_episodes'] 106 | 107 | transforms = [partial(convert_dict, 'class'), 108 | load_class_images, 109 | partial(extract_episode, n_support, n_query)] 110 | if opt['data.cuda']: 111 | transforms.append(CudaTransform()) 112 | 113 | transforms = compose(transforms) 114 | 115 | class_names = [] 116 | with open(os.path.join(split_dir, "{:s}.txt".format(split)), 'r') as f: 117 | for class_name in f.readlines(): 118 | class_names.append(class_name.rstrip('\n')) 119 | ds = TransformDataset(ListDataset(class_names), transforms) 120 | 121 | if opt['data.sequential']: 122 | sampler = SequentialBatchSampler(len(ds)) 123 | else: 124 | sampler = EpisodicBatchSampler(len(ds), n_way, n_episodes) 125 | 126 | # use num_workers=0, otherwise may receive duplicate episodes 127 | ret[split] = torch.utils.data.DataLoader(ds, batch_sampler=sampler, num_workers=0) 128 | 129 | return ret 130 | -------------------------------------------------------------------------------- /protonets/engine.py: -------------------------------------------------------------------------------- 1 | from tqdm import tqdm 2 | 3 | class Engine(object): 4 | def __init__(self): 5 | hook_names = ['on_start', 'on_start_epoch', 'on_sample', 'on_forward', 6 | 'on_backward', 'on_end_epoch', 'on_update', 'on_end'] 7 | 8 | self.hooks = { } 9 | for hook_name in hook_names: 10 | self.hooks[hook_name] = lambda state: None 11 | 12 | def train(self, **kwargs): 13 | state = { 14 | 'model': kwargs['model'], 15 | 'loader': kwargs['loader'], 16 | 'optim_method': kwargs['optim_method'], 17 | 'optim_config': kwargs['optim_config'], 18 | 'max_epoch': kwargs['max_epoch'], 19 | 'epoch': 0, # epochs done so far 20 | 't': 0, # samples seen so far 21 | 'batch': 0, # samples seen in current epoch 22 | 'stop': False 23 | } 24 | 25 | state['optimizer'] = state['optim_method'](state['model'].parameters(), **state['optim_config']) 26 | 27 | self.hooks['on_start'](state) 28 | while state['epoch'] < state['max_epoch'] and not state['stop']: 29 | state['model'].train() 30 | 31 | self.hooks['on_start_epoch'](state) 32 | 33 | state['epoch_size'] = len(state['loader']) 34 | 35 | for sample in tqdm(state['loader'], desc="Epoch {:d} train".format(state['epoch'] + 1)): 36 | state['sample'] = sample 37 | self.hooks['on_sample'](state) 38 | 39 | state['optimizer'].zero_grad() 40 | loss, state['output'] = state['model'].loss(state['sample']) 41 | self.hooks['on_forward'](state) 42 | 43 | loss.backward() 44 | self.hooks['on_backward'](state) 45 | 46 | state['optimizer'].step() 47 | 48 | state['t'] += 1 49 | state['batch'] += 1 50 | self.hooks['on_update'](state) 51 | 52 | state['epoch'] += 1 53 | state['batch'] = 0 54 | self.hooks['on_end_epoch'](state) 55 | 56 | self.hooks['on_end'](state) 57 | -------------------------------------------------------------------------------- /protonets/models/__init__.py: -------------------------------------------------------------------------------- 1 | from protonets.models.factory import get_model, register_model 2 | 3 | import protonets.models.few_shot 4 | -------------------------------------------------------------------------------- /protonets/models/factory.py: -------------------------------------------------------------------------------- 1 | MODEL_REGISTRY = {} 2 | 3 | def register_model(model_name): 4 | def decorator(f): 5 | MODEL_REGISTRY[model_name] = f 6 | return f 7 | 8 | return decorator 9 | 10 | def get_model(model_name, model_opt): 11 | if model_name in MODEL_REGISTRY: 12 | return MODEL_REGISTRY[model_name](**model_opt) 13 | else: 14 | raise ValueError("Unknown model {:s}".format(model_name)) 15 | -------------------------------------------------------------------------------- /protonets/models/few_shot.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | from torch.autograd import Variable 6 | 7 | from protonets.models import register_model 8 | 9 | from .utils import euclidean_dist 10 | 11 | class Flatten(nn.Module): 12 | def __init__(self): 13 | super(Flatten, self).__init__() 14 | 15 | def forward(self, x): 16 | return x.view(x.size(0), -1) 17 | 18 | class Protonet(nn.Module): 19 | def __init__(self, encoder): 20 | super(Protonet, self).__init__() 21 | 22 | self.encoder = encoder 23 | 24 | def loss(self, sample): 25 | xs = Variable(sample['xs']) # support 26 | xq = Variable(sample['xq']) # query 27 | 28 | n_class = xs.size(0) 29 | assert xq.size(0) == n_class 30 | n_support = xs.size(1) 31 | n_query = xq.size(1) 32 | 33 | target_inds = torch.arange(0, n_class).view(n_class, 1, 1).expand(n_class, n_query, 1).long() 34 | target_inds = Variable(target_inds, requires_grad=False) 35 | 36 | if xq.is_cuda: 37 | target_inds = target_inds.cuda() 38 | 39 | x = torch.cat([xs.view(n_class * n_support, *xs.size()[2:]), 40 | xq.view(n_class * n_query, *xq.size()[2:])], 0) 41 | 42 | z = self.encoder.forward(x) 43 | z_dim = z.size(-1) 44 | 45 | z_proto = z[:n_class*n_support].view(n_class, n_support, z_dim).mean(1) 46 | zq = z[n_class*n_support:] 47 | 48 | dists = euclidean_dist(zq, z_proto) 49 | 50 | log_p_y = F.log_softmax(-dists, dim=1).view(n_class, n_query, -1) 51 | 52 | loss_val = -log_p_y.gather(2, target_inds).squeeze().view(-1).mean() 53 | 54 | _, y_hat = log_p_y.max(2) 55 | acc_val = torch.eq(y_hat, target_inds.squeeze()).float().mean() 56 | 57 | return loss_val, { 58 | 'loss': loss_val.item(), 59 | 'acc': acc_val.item() 60 | } 61 | 62 | @register_model('protonet_conv') 63 | def load_protonet_conv(**kwargs): 64 | x_dim = kwargs['x_dim'] 65 | hid_dim = kwargs['hid_dim'] 66 | z_dim = kwargs['z_dim'] 67 | 68 | def conv_block(in_channels, out_channels): 69 | return nn.Sequential( 70 | nn.Conv2d(in_channels, out_channels, 3, padding=1), 71 | nn.BatchNorm2d(out_channels), 72 | nn.ReLU(), 73 | nn.MaxPool2d(2) 74 | ) 75 | 76 | encoder = nn.Sequential( 77 | conv_block(x_dim[0], hid_dim), 78 | conv_block(hid_dim, hid_dim), 79 | conv_block(hid_dim, hid_dim), 80 | conv_block(hid_dim, z_dim), 81 | Flatten() 82 | ) 83 | 84 | return Protonet(encoder) 85 | -------------------------------------------------------------------------------- /protonets/models/utils.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | def euclidean_dist(x, y): 4 | # x: N x D 5 | # y: M x D 6 | n = x.size(0) 7 | m = y.size(0) 8 | d = x.size(1) 9 | assert d == y.size(1) 10 | 11 | x = x.unsqueeze(1).expand(n, m, d) 12 | y = y.unsqueeze(0).expand(n, m, d) 13 | 14 | return torch.pow(x - y, 2).sum(2) 15 | -------------------------------------------------------------------------------- /protonets/utils/__init__.py: -------------------------------------------------------------------------------- 1 | def filter_opt(opt, tag): 2 | ret = { } 3 | 4 | for k,v in opt.items(): 5 | tokens = k.split('.') 6 | if tokens[0] == tag: 7 | ret['.'.join(tokens[1:])] = v 8 | 9 | return ret 10 | 11 | def format_opts(d): 12 | ret = [] 13 | for k,v in d.items(): 14 | if isinstance(v, bool) and v == True: 15 | ret = ret + ["--" + k] 16 | elif isinstance(v, bool) and v == False: 17 | pass 18 | else: 19 | ret = ret + ["--" + k, str(v)] 20 | return ret 21 | 22 | def merge_dict(x, y): 23 | ret = x.copy() 24 | 25 | for k,v in y.items(): 26 | ret[k] = v 27 | 28 | return ret 29 | -------------------------------------------------------------------------------- /protonets/utils/data.py: -------------------------------------------------------------------------------- 1 | import protonets.data 2 | 3 | def load(opt, splits): 4 | if opt['data.dataset'] == 'omniglot': 5 | ds = protonets.data.omniglot.load(opt, splits) 6 | else: 7 | raise ValueError("Unknown dataset: {:s}".format(opt['data.dataset'])) 8 | 9 | return ds 10 | -------------------------------------------------------------------------------- /protonets/utils/log.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | import numpy as np 4 | 5 | def extract_meter_values(meters): 6 | ret = { } 7 | 8 | for split in meters.keys(): 9 | ret[split] = { } 10 | for field,meter in meters[split].items(): 11 | ret[split][field] = meter.value()[0] 12 | 13 | return ret 14 | 15 | def render_meter_values(meter_values): 16 | field_info = [] 17 | for split in meter_values.keys(): 18 | for field,val in meter_values[split].items(): 19 | field_info.append("{:s} {:s} = {:0.6f}".format(split, field, val)) 20 | 21 | return ', '.join(field_info) 22 | 23 | def convert_array(d): 24 | ret = { } 25 | for k,v in d.items(): 26 | if isinstance(v, dict): 27 | ret[k] = { } 28 | for kk,vv in v.items(): 29 | ret[k][kk] = np.array(vv) 30 | else: 31 | ret[k] = np.array(v) 32 | 33 | return ret 34 | 35 | def load_trace(trace_file): 36 | ret = { } 37 | 38 | with open(trace_file, 'r') as f: 39 | for i,line in enumerate(f): 40 | vals = json.loads(line.rstrip('\n')) 41 | 42 | if i == 0: 43 | for k,v in vals.items(): 44 | if isinstance(v, dict): 45 | ret[k] = { } 46 | for kk in v.keys(): 47 | ret[k][kk] = [] 48 | else: 49 | ret[k] = [] 50 | 51 | for k,v in vals.items(): 52 | if isinstance(v, dict): 53 | for kk,vv in v.items(): 54 | ret[k][kk].append(vv) 55 | else: 56 | ret[k].append(v) 57 | 58 | return convert_array(ret) 59 | -------------------------------------------------------------------------------- /protonets/utils/model.py: -------------------------------------------------------------------------------- 1 | from tqdm import tqdm 2 | 3 | from protonets.utils import filter_opt 4 | from protonets.models import get_model 5 | 6 | def load(opt): 7 | model_opt = filter_opt(opt, 'model') 8 | model_name = model_opt['model_name'] 9 | 10 | del model_opt['model_name'] 11 | 12 | return get_model(model_name, model_opt) 13 | 14 | def evaluate(model, data_loader, meters, desc=None): 15 | model.eval() 16 | 17 | for field,meter in meters.items(): 18 | meter.reset() 19 | 20 | if desc is not None: 21 | data_loader = tqdm(data_loader, desc=desc) 22 | 23 | for sample in data_loader: 24 | _, output = model.loss(sample) 25 | for field, meter in meters.items(): 26 | meter.add(output[field]) 27 | 28 | return meters 29 | -------------------------------------------------------------------------------- /scripts/predict/few_shot/eval.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import math 4 | from tqdm import tqdm 5 | 6 | import torch 7 | import torchnet as tnt 8 | 9 | from protonets.utils import filter_opt, merge_dict 10 | import protonets.utils.data as data_utils 11 | import protonets.utils.model as model_utils 12 | 13 | def main(opt): 14 | # load model 15 | model = torch.load(opt['model.model_path']) 16 | model.eval() 17 | 18 | # load opts 19 | model_opt_file = os.path.join(os.path.dirname(opt['model.model_path']), 'opt.json') 20 | with open(model_opt_file, 'r') as f: 21 | model_opt = json.load(f) 22 | 23 | # Postprocess arguments 24 | model_opt['model.x_dim'] = map(int, model_opt['model.x_dim'].split(',')) 25 | model_opt['log.fields'] = model_opt['log.fields'].split(',') 26 | 27 | # construct data 28 | data_opt = { 'data.' + k: v for k,v in filter_opt(model_opt, 'data').items() } 29 | 30 | episode_fields = { 31 | 'data.test_way': 'data.way', 32 | 'data.test_shot': 'data.shot', 33 | 'data.test_query': 'data.query', 34 | 'data.test_episodes': 'data.train_episodes' 35 | } 36 | 37 | for k,v in episode_fields.items(): 38 | if opt[k] != 0: 39 | data_opt[k] = opt[k] 40 | elif model_opt[k] != 0: 41 | data_opt[k] = model_opt[k] 42 | else: 43 | data_opt[k] = model_opt[v] 44 | 45 | print("Evaluating {:d}-way, {:d}-shot with {:d} query examples/class over {:d} episodes".format( 46 | data_opt['data.test_way'], data_opt['data.test_shot'], 47 | data_opt['data.test_query'], data_opt['data.test_episodes'])) 48 | 49 | torch.manual_seed(1234) 50 | if data_opt['data.cuda']: 51 | torch.cuda.manual_seed(1234) 52 | 53 | data = data_utils.load(data_opt, ['test']) 54 | 55 | if data_opt['data.cuda']: 56 | model.cuda() 57 | 58 | meters = { field: tnt.meter.AverageValueMeter() for field in model_opt['log.fields'] } 59 | 60 | model_utils.evaluate(model, data['test'], meters, desc="test") 61 | 62 | for field,meter in meters.items(): 63 | mean, std = meter.value() 64 | print("test {:s}: {:0.6f} +/- {:0.6f}".format(field, mean, 1.96 * std / math.sqrt(data_opt['data.test_episodes']))) 65 | -------------------------------------------------------------------------------- /scripts/predict/few_shot/run_eval.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | from eval import main 4 | 5 | parser = argparse.ArgumentParser(description='Evaluate few-shot prototypical networks') 6 | 7 | default_model_path = 'results/best_model.pt' 8 | parser.add_argument('--model.model_path', type=str, default=default_model_path, metavar='MODELPATH', 9 | help="location of pretrained model to evaluate (default: {:s})".format(default_model_path)) 10 | 11 | parser.add_argument('--data.test_way', type=int, default=0, metavar='TESTWAY', 12 | help="number of classes per episode in test. 0 means same as model's data.test_way (default: 0)") 13 | parser.add_argument('--data.test_shot', type=int, default=0, metavar='TESTSHOT', 14 | help="number of support examples per class in test. 0 means same as model's data.shot (default: 0)") 15 | parser.add_argument('--data.test_query', type=int, default=0, metavar='TESTQUERY', 16 | help="number of query examples per class in test. 0 means same as model's data.query (default: 0)") 17 | parser.add_argument('--data.test_episodes', type=int, default=1000, metavar='NTEST', 18 | help="number of test episodes per epoch (default: 1000)") 19 | 20 | args = vars(parser.parse_args()) 21 | 22 | main(args) 23 | -------------------------------------------------------------------------------- /scripts/train/few_shot/run_train.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | from train import main 4 | 5 | parser = argparse.ArgumentParser(description='Train prototypical networks') 6 | 7 | # data args 8 | default_dataset = 'omniglot' 9 | parser.add_argument('--data.dataset', type=str, default=default_dataset, metavar='DS', 10 | help="data set name (default: {:s})".format(default_dataset)) 11 | default_split = 'vinyals' 12 | parser.add_argument('--data.split', type=str, default=default_split, metavar='SP', 13 | help="split name (default: {:s})".format(default_split)) 14 | parser.add_argument('--data.way', type=int, default=60, metavar='WAY', 15 | help="number of classes per episode (default: 60)") 16 | parser.add_argument('--data.shot', type=int, default=5, metavar='SHOT', 17 | help="number of support examples per class (default: 5)") 18 | parser.add_argument('--data.query', type=int, default=5, metavar='QUERY', 19 | help="number of query examples per class (default: 5)") 20 | parser.add_argument('--data.test_way', type=int, default=5, metavar='TESTWAY', 21 | help="number of classes per episode in test. 0 means same as data.way (default: 5)") 22 | parser.add_argument('--data.test_shot', type=int, default=0, metavar='TESTSHOT', 23 | help="number of support examples per class in test. 0 means same as data.shot (default: 0)") 24 | parser.add_argument('--data.test_query', type=int, default=15, metavar='TESTQUERY', 25 | help="number of query examples per class in test. 0 means same as data.query (default: 15)") 26 | parser.add_argument('--data.train_episodes', type=int, default=100, metavar='NTRAIN', 27 | help="number of train episodes per epoch (default: 100)") 28 | parser.add_argument('--data.test_episodes', type=int, default=100, metavar='NTEST', 29 | help="number of test episodes per epoch (default: 100)") 30 | parser.add_argument('--data.trainval', action='store_true', help="run in train+validation mode (default: False)") 31 | parser.add_argument('--data.sequential', action='store_true', help="use sequential sampler instead of episodic (default: False)") 32 | parser.add_argument('--data.cuda', action='store_true', help="run in CUDA mode (default: False)") 33 | 34 | # model args 35 | default_model_name = 'protonet_conv' 36 | parser.add_argument('--model.model_name', type=str, default=default_model_name, metavar='MODELNAME', 37 | help="model name (default: {:s})".format(default_model_name)) 38 | parser.add_argument('--model.x_dim', type=str, default='1,28,28', metavar='XDIM', 39 | help="dimensionality of input images (default: '1,28,28')") 40 | parser.add_argument('--model.hid_dim', type=int, default=64, metavar='HIDDIM', 41 | help="dimensionality of hidden layers (default: 64)") 42 | parser.add_argument('--model.z_dim', type=int, default=64, metavar='ZDIM', 43 | help="dimensionality of input images (default: 64)") 44 | 45 | # train args 46 | parser.add_argument('--train.epochs', type=int, default=10000, metavar='NEPOCHS', 47 | help='number of epochs to train (default: 10000)') 48 | parser.add_argument('--train.optim_method', type=str, default='Adam', metavar='OPTIM', 49 | help='optimization method (default: Adam)') 50 | parser.add_argument('--train.learning_rate', type=float, default=0.001, metavar='LR', 51 | help='learning rate (default: 0.0001)') 52 | parser.add_argument('--train.decay_every', type=int, default=20, metavar='LRDECAY', 53 | help='number of epochs after which to decay the learning rate') 54 | default_weight_decay = 0.0 55 | parser.add_argument('--train.weight_decay', type=float, default=default_weight_decay, metavar='WD', 56 | help="weight decay (default: {:f})".format(default_weight_decay)) 57 | parser.add_argument('--train.patience', type=int, default=200, metavar='PATIENCE', 58 | help='number of epochs to wait before validation improvement (default: 1000)') 59 | 60 | # log args 61 | default_fields = 'loss,acc' 62 | parser.add_argument('--log.fields', type=str, default=default_fields, metavar='FIELDS', 63 | help="fields to monitor during training (default: {:s})".format(default_fields)) 64 | default_exp_dir = 'results' 65 | parser.add_argument('--log.exp_dir', type=str, default=default_exp_dir, metavar='EXP_DIR', 66 | help="directory where experiments should be saved (default: {:s})".format(default_exp_dir)) 67 | 68 | args = vars(parser.parse_args()) 69 | 70 | main(args) 71 | -------------------------------------------------------------------------------- /scripts/train/few_shot/run_trainval.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | from trainval import main 4 | 5 | parser = argparse.ArgumentParser(description='Re-run prototypical networks training in trainval mode') 6 | 7 | parser.add_argument('--model.model_path', type=str, default='results/best_model.pt', metavar='MODELPATH', 8 | help="location of pretrained model to retrain in trainval mode") 9 | 10 | args = vars(parser.parse_args()) 11 | 12 | main(args) 13 | -------------------------------------------------------------------------------- /scripts/train/few_shot/train.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | from functools import partial 4 | from tqdm import tqdm 5 | 6 | import numpy as np 7 | 8 | import torch 9 | import torch.optim as optim 10 | import torch.optim.lr_scheduler as lr_scheduler 11 | import torchvision 12 | import torchnet as tnt 13 | 14 | from protonets.engine import Engine 15 | 16 | import protonets.utils.data as data_utils 17 | import protonets.utils.model as model_utils 18 | import protonets.utils.log as log_utils 19 | 20 | def main(opt): 21 | if not os.path.isdir(opt['log.exp_dir']): 22 | os.makedirs(opt['log.exp_dir']) 23 | 24 | # save opts 25 | with open(os.path.join(opt['log.exp_dir'], 'opt.json'), 'w') as f: 26 | json.dump(opt, f) 27 | f.write('\n') 28 | 29 | trace_file = os.path.join(opt['log.exp_dir'], 'trace.txt') 30 | 31 | # Postprocess arguments 32 | opt['model.x_dim'] = list(map(int, opt['model.x_dim'].split(','))) 33 | opt['log.fields'] = opt['log.fields'].split(',') 34 | 35 | torch.manual_seed(1234) 36 | if opt['data.cuda']: 37 | torch.cuda.manual_seed(1234) 38 | 39 | if opt['data.trainval']: 40 | data = data_utils.load(opt, ['trainval']) 41 | train_loader = data['trainval'] 42 | val_loader = None 43 | else: 44 | data = data_utils.load(opt, ['train', 'val']) 45 | train_loader = data['train'] 46 | val_loader = data['val'] 47 | 48 | model = model_utils.load(opt) 49 | 50 | if opt['data.cuda']: 51 | model.cuda() 52 | 53 | engine = Engine() 54 | 55 | meters = { 'train': { field: tnt.meter.AverageValueMeter() for field in opt['log.fields'] } } 56 | 57 | if val_loader is not None: 58 | meters['val'] = { field: tnt.meter.AverageValueMeter() for field in opt['log.fields'] } 59 | 60 | def on_start(state): 61 | if os.path.isfile(trace_file): 62 | os.remove(trace_file) 63 | state['scheduler'] = lr_scheduler.StepLR(state['optimizer'], opt['train.decay_every'], gamma=0.5) 64 | engine.hooks['on_start'] = on_start 65 | 66 | def on_start_epoch(state): 67 | for split, split_meters in meters.items(): 68 | for field, meter in split_meters.items(): 69 | meter.reset() 70 | state['scheduler'].step() 71 | engine.hooks['on_start_epoch'] = on_start_epoch 72 | 73 | def on_update(state): 74 | for field, meter in meters['train'].items(): 75 | meter.add(state['output'][field]) 76 | engine.hooks['on_update'] = on_update 77 | 78 | def on_end_epoch(hook_state, state): 79 | if val_loader is not None: 80 | if 'best_loss' not in hook_state: 81 | hook_state['best_loss'] = np.inf 82 | if 'wait' not in hook_state: 83 | hook_state['wait'] = 0 84 | 85 | if val_loader is not None: 86 | model_utils.evaluate(state['model'], 87 | val_loader, 88 | meters['val'], 89 | desc="Epoch {:d} valid".format(state['epoch'])) 90 | 91 | meter_vals = log_utils.extract_meter_values(meters) 92 | print("Epoch {:02d}: {:s}".format(state['epoch'], log_utils.render_meter_values(meter_vals))) 93 | meter_vals['epoch'] = state['epoch'] 94 | with open(trace_file, 'a') as f: 95 | json.dump(meter_vals, f) 96 | f.write('\n') 97 | 98 | if val_loader is not None: 99 | if meter_vals['val']['loss'] < hook_state['best_loss']: 100 | hook_state['best_loss'] = meter_vals['val']['loss'] 101 | print("==> best model (loss = {:0.6f}), saving model...".format(hook_state['best_loss'])) 102 | 103 | state['model'].cpu() 104 | torch.save(state['model'], os.path.join(opt['log.exp_dir'], 'best_model.pt')) 105 | if opt['data.cuda']: 106 | state['model'].cuda() 107 | 108 | hook_state['wait'] = 0 109 | else: 110 | hook_state['wait'] += 1 111 | 112 | if hook_state['wait'] > opt['train.patience']: 113 | print("==> patience {:d} exceeded".format(opt['train.patience'])) 114 | state['stop'] = True 115 | else: 116 | state['model'].cpu() 117 | torch.save(state['model'], os.path.join(opt['log.exp_dir'], 'best_model.pt')) 118 | if opt['data.cuda']: 119 | state['model'].cuda() 120 | 121 | engine.hooks['on_end_epoch'] = partial(on_end_epoch, { }) 122 | 123 | engine.train( 124 | model = model, 125 | loader = train_loader, 126 | optim_method = getattr(optim, opt['train.optim_method']), 127 | optim_config = { 'lr': opt['train.learning_rate'], 128 | 'weight_decay': opt['train.weight_decay'] }, 129 | max_epoch = opt['train.epochs'] 130 | ) 131 | -------------------------------------------------------------------------------- /scripts/train/few_shot/trainval.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import subprocess 4 | 5 | from protonets.utils import format_opts, merge_dict 6 | from protonets.utils.log import load_trace 7 | 8 | def main(opt): 9 | result_dir = os.path.dirname(opt['model.model_path']) 10 | 11 | # get target training loss to exceed 12 | trace_file = os.path.join(result_dir, 'trace.txt') 13 | trace_vals = load_trace(trace_file) 14 | best_epoch = trace_vals['val']['loss'].argmin() 15 | 16 | # load opts 17 | model_opt_file = os.path.join(os.path.dirname(opt['model.model_path']), 'opt.json') 18 | with open(model_opt_file, 'r') as f: 19 | model_opt = json.load(f) 20 | 21 | # override previous training ops 22 | model_opt = merge_dict(model_opt, { 23 | 'log.exp_dir': os.path.join(model_opt['log.exp_dir'], 'trainval'), 24 | 'data.trainval': True, 25 | 'train.epochs': best_epoch + model_opt['train.patience'], 26 | }) 27 | 28 | subprocess.call(['python', os.path.join(os.getcwd(), 'scripts/train/few_shot/run_train.py')] + format_opts(model_opt)) 29 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='protonets', 4 | version='0.0.1', 5 | author='Jake Snell', 6 | author_email='jsnell@cs.toronto.edu', 7 | license='MIT', 8 | packages=['protonets'], 9 | install_requires=[ 10 | 'torch', 11 | 'tqdm' 12 | ]) 13 | --------------------------------------------------------------------------------