Last active
December 25, 2017 15:55
-
-
Save antimon2/4cf58ca0ee974a90ab51e84be53187dc to your computer and use it in GitHub Desktop.
CIFAR10Record_ShowAsPng.jl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Define Record Type" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:33.168Z", | |
"end_time": "2017-12-26T00:09:33.647000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# 24584 == 3073 * 8\nprimitive type CIFAR10Record 24584 end\n\n# for v0.5.x\n# bitstype 24584 CIFAR10Record", | |
"execution_count": 1, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:34.347Z", | |
"end_time": "2017-12-26T00:09:34.826000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "isbits(CIFAR10Record)", | |
"execution_count": 2, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 2, | |
"data": { | |
"text/plain": "true" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:35.604Z", | |
"end_time": "2017-12-26T00:09:35.817000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "sizeof(CIFAR10Record)", | |
"execution_count": 3, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 3, | |
"data": { | |
"text/plain": "3073" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:36.600Z", | |
"end_time": "2017-12-26T00:09:36.603000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "function Base.read(stream::IO, ::Type{CIFAR10Record})\n bytes = read(stream, UInt8, 3073)\n reinterpret(CIFAR10Record, bytes)[1]\nend", | |
"execution_count": 4, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "※Assumed that `https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz` has been downloaded and expanded." | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:38.028Z", | |
"end_time": "2017-12-26T00:09:38.397000+09:00" | |
}, | |
"scrolled": true, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "record0 = open(\"cifar-10-batches-bin/test_batch.bin\", \"r\") do f\n return read(f, CIFAR10Record)\nend;", | |
"execution_count": 5, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Show (by default)" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:40.643Z", | |
"end_time": "2017-12-26T00:09:43.032000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "record0", | |
"execution_count": 6, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 6, | |
"data": { | |
"text/plain": "CIFAR10Record(0x6e817c91afb6a7917b8283919889766459626c686c656972737b8486868495a06b7e82a4bec5aa907f7f86989c90878078736c6a6d666873707d868b8f8494a87f6c92a8b5b39a857d8388898a8b898380898780756969728571848b928994b188678ca4b2978a87888a8b88878278767883878b82807977d39f7d8a8d8f93a18b8eb0b699858b93948b8a8c84827e7a77747b857c817e8ceae98a7e858a95a2a9b6b29e8a8c8d969a968d837f7b777777777781837b7299f7eaa47e7a8293a5b6a7989a959398968a86837b7571707173797f7f7d8076cdf9d18fa7887c8ca2958c90928e8e9186827d7d787173757574787977767faff5f2b589bfb086828d858b868789898b84807e7d7d74717873656b69696f99e4f1eda4aec0bcbca8878489848e8d8782837d736e6f65687794989ca2959de8fcf7d17196b6b1c0d58573707078777a6f6e6657443a3e6d8fb5c5d0c0a49390e1fa9f5b93b3a8b0c87c3f453d4c524b5345293336393f426594b1ad745649576fb9926fa0b4acafbb922e323440443c5d34322c4e7669674976a87b566c337e8782846398b8b9b5bbb42e2d363e3b283c27343a565c5d785d5d8564606c37506f8d8f6085bcc1bdc0cd364044404e4135333d73692040665f58624959595f693d6f916669bac2b8b4d72e372d37525e4d4861767e6d683a575c5a58758d9b852552717e5aacbcb2a0cc3030365d6363574450658a92764b5f65708289e6d3745d344d584d8eb5ae88c52f35506f685a5b53697a7faa95465f7d868c9fa9a9675822373e436dbcac70c4224551635e48464c506888ae93446d6b759dc89b7f677827323a4262c0a367c1184049595155504f536f8cb28c2f6d696281b7945e7e982c2f354485b99069c21a30374e515e584b52828ec071224f595f6a9f9785a4bc502c373b88b29974bd2e1f213b494f604d5c8a899a4d284d456868849b83bce2b32f33327aa89e7aaf392c0f2b474e4e4a59727a703a35474f4f6b7d9177a6c6923c2f337095698fa32d3b231b35434c45465d7b703d49524d4a6580794e3b5f4232292b52713b699027333220313a4a545851708c6b4552584f5d6b4d3133333127242a3829265c5a27303a2427454d675e5a6c84794a404839464b3b3427252a2b282b301c115039282c3a31252f566160747a786e4c2d2b1f2b3a4e552a27252929272c3539403624242e302d2f46435d69766f62381f32473c386ba43b2a292c2f282b2f3130292427272b2e2d27343242544c412f433a362f294b5f392d2c30302e2b2c1f20282122222327333730322f323431362f272325263339302b2b2d2d2c2a3024212f22201f22262d2e32303437353229211e212829343629262e2d2f2b31382d283321242426292b272c2b2d2d2c2b2726282c2d29313429292c2d2f292e35332f3143544d638792836d575f606f776857463a3f49454942454f51575c595659696b40525273919c826958585f71776d655f565049474a43485551585c5a5b556674554061748384705b53585e5f6163635e5c66645d52474d596b4f59575b58647c5d3c5a6e7d665d5a5c5d5f5c5c58504f536064675f5e6164c5855458585c616c60627e8165555d65665d5c615959575452505761575e687ee4db6a535659626e7d8a826c5b5f61696e6a615a585653545352525c5e575c8ff5e5915f53566372897b696c6c6d6e6c5f5c59565350515252535a5a585b5dc6fdd588946a555e6f675e63666567675c595556534f52545654535554545e9ff5fabd88b39966575b5a5f5e60605e5d5957595a565251514f484b4c505888e7fbf5a6aab6aea889595f61616c68605b5e5d55545452575d7c85858d848fe0fdfcd37092b1acb7c5695a5c606865635455514636313e6d85acc0c4b69c8d8cdef7995790b3a9b2c87869716d7b7d644739212e343d4d4e6494b6ad765a4d5a69af87679db5adb2c19c6b6f7179765b5a31333156817c774b76b08661763b86887c795a95b6b3b0bdc06f73787769453e293b44636d758b605c8f756f79405a80948b5883b8b5afb8d36e74705e5d463838457e78386080675b6e5b696669745d89956066b6b8a7a6d7686c58535b5d4f4c69828d8a8f5a65656a6a8498a38f50797e7d56aab6a492cb6860566e6d685848556c939f8658687079828aecdd83785e7d785389b2a781c55f5560746e605d566d8085af984764888f8ca5b4b97b6a4a7a77596dbaa76bc44959586564504950556e90b59847727583acd8ae957d8448747c6a6ebc9a5fc0374a4957575f5453587695bb933272727195caa672909a446d7b7b9cb48660c23837354b57685d50598b98c9792654626b77aba18eabb65f5d7b78a7af906cbf512e243b4f586653649393a5552c504c6f6c899f87bfe0c55976709ca99774b7674b1e314c555551627c857d44394a54556e839983b4d6b4767474959a648bb0676a3b233949524d4f67877d474e5551506f8f8d695987797a75717c793a69a16167532f353c515d625d7c99764d585f576a836e5e6d71777472756f402b60735d63623d2f47536f6663768e82544b5343576c626b787475767376754a255f645f6269543a3a5b6460747a797153383a324b667a8a76746f737471737064686d5d5e656053494e485e66726e674535506c6f729cd6807471747871727273726b5e63656662553e463f4b5a5a57506f7072736f82927b75737778756e706d6e6b595f626363676056554d4e5a606f72747172736f6d7273737575736a6f6f6d6e585b5f62616666696466686e73706f73737577716e6f6e747275717074726e70555b5f616162656b6a6b6b6d706f71757775756f6f74716f71736d7076746f7015221830596959432d3435424a3d2f2012131d191d161a24262828282b2d3836141d1a3c5d6d553c2b2b31454b423e382f241d1b1e171b2a282c2a272b23313d280d2638494f3e2a21272d3235393c38353a3831261b1f31472a2b25261f2a44330f1f2f3f2c282527282a2e312e292a2d363a3d35343640aa682e2921202332332e4343281c272f302727332e2f302f2d28303a30364161d3ca4e2c231d23324c554933242b2e363a362d2c2c2b2b2e2f2c2c3638313a7cf0e08042291f2334534632363b403e3b2e2b28282724292b2d2e3434323642bbffd7808049221e30332e32383b3e382d2a26272322272a2f32313332323d8df1fec284a6833b1d1d2d333537322e2e2a2b2e2e262a2e2a2d303131353c6ee3fdf6a5a5b2a89060292a2b303b332b3338383332343c4444687a747c727cd0fcfdd36d8cb1b0aeaf4f373b454e48453a3d3a3122233d6e7da8c2beb0958685dbf596538ab5b2b1c375787f8090906c3c2e18262e3c57596496bfb27a5d505d67ab836398b5b1b3c3a5959ea4aba3795a2f3433598689834974b8916c814690897a775690b1aeabbbc7979aa09b8556412c404b6b7584965c5593817c864d6887998d567cb0ada7b2d48c968f7466473a3c4b858044769065567366747276816a949c605eb0b7a4a3d690977d6b655e4f4e6d87949cab70696571718ca2ad9a608a8a7e4ea8bfa892cb8879677870695747577098a8905f6c79838791f2e68f82739b8c4e82b8ac84c5756164736d5f5b556e8289b3984767929a91acbec68a7364a79c6369baa86cc25e615a6463504850577295ba9a47757e8db4e2bda7919367a7ad8877b9985dbd494f4954565f54545b7b9bc2963273787ba0d8ba89a8a8619fb2a6aeaf7f5abd4c3e374955685e535d92a0d27d2654667586bdb9aac7c27586ada6bbaa8764bc683b293b4e5867576b9b9daf5b2d504e787d9cb7a4dcedd57a9f9bb1a58e6cb7845f28324b5457566a858f894c3b4a565d7d94ae9ccfedcf999c9eae9a5e86b489854a28384756535771928a5150545256799c9d7d71aea5a6a3a1997c3667aa888a6b39313655646a6688a37c4d555b58749082788ca1aba8a5a78f462a6383868d844f2e3f55736b697c928453484e44647f8193a4a6a9aaa8aa99582f6d7f868a8c6c433a5b635e72777a765942454261809db4a3a5a3a7a7a5a19382859481858a806955544a5d616a7071554e6f8e9297c3f6ada4a4a6a9a3a9aaa19c9b7f888c8c847153564a505c626768959ea4a29db1bfa7a5a5a9a9a7a7aea09b9b78828b8e8c8f86787265626e79919faaa9a7a6a19d9ea2a3a5a5a3a0a79e9797777d888f8e9193958d8c8b91979aa0a9ababaaa39f9b9ca3a2a4a0a2a69f9798747e898f8d8c8f959496959ca0a0a2a7aaa9a6a1a0a19f9e9fa29ca0a6a59f9e03)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Show `CIFAR10Record` as Simple String representation" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:43.799Z", | |
"end_time": "2017-12-26T00:09:43.803000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "function Base.show(io::IO, record::CIFAR10Record)\n bytes = reinterpret(UInt8, [record])\n ## print(io, \"CIFAR10Record($(repr(bytes[1])), $(repr(hash(bytes[2:end]))))\")\n print(io, \"CIFAR10Record(\")\n # show 1st byte(=label)\n show(io, bytes[1])\n print(io, \", \")\n # show hashcode of the rest of bytes(=image)\n show(io, hash(bytes[2:end]))\n print(io, ')')\nend", | |
"execution_count": 7, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:45.290Z", | |
"end_time": "2017-12-26T00:09:46.307000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "record0", | |
"execution_count": 8, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 8, | |
"data": { | |
"text/plain": "CIFAR10Record(0x03, 0xd0b45b812aae12b1)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Show `CIFAR10Record` as Image" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "refer-to:\n\n+ https://github.com/fhs/CRC32.jl\n+ http://www.setsuki.com/hsp/ext/png.htm\n+ http://www.ietf.org/rfc/rfc1950.txt\n+ http://www.ietf.org/rfc/rfc1951.txt" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### prepare1: CRC32" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:48.425Z", | |
"end_time": "2017-12-26T00:09:48.725000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "const CRC32_TABLE = let poly::UInt32=0xedb88320\n tab = zeros(UInt32, 256)\n for i in 0:255\n crc = UInt32(i)\n for _ in 1:8\n if (crc & 1) == 1\n crc = (crc >> 1) ⊻ poly\n else\n crc >>= 1\n end\n end\n tab[i+1] = crc\n end\n tab\nend;\n\nfunction crc32(data::Vector{UInt8}, crc::UInt32=zero(UInt32))\n crc = ~crc\n for b in data\n crc = CRC32_TABLE[(UInt8(crc & 0xff) ⊻ b) + 1] ⊻ (crc >> 8)\n end\n ~crc\nend", | |
"execution_count": 9, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 9, | |
"data": { | |
"text/plain": "crc32 (generic function with 2 methods)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### prepare2: Adler32" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:50.439Z", | |
"end_time": "2017-12-26T00:09:50.518000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "const MOD_ADLER = UInt32(65521)\n\nfunction adler32(data::Vector{UInt8})\n a = one(UInt32)\n b = zero(UInt32)\n l = length(data)\n for i in 1:5550:l\n e = min(i + 5549, l)\n for v in data[i:e]\n a += v\n b += a\n end\n a %= MOD_ADLER\n b %= MOD_ADLER\n end\n (b << 16) | a\nend", | |
"execution_count": 10, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 10, | |
"data": { | |
"text/plain": "adler32 (generic function with 1 method)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### prepare3: PNG format" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### PNG Signature (8 bytes)" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:52.206Z", | |
"end_time": "2017-12-26T00:09:52.281000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "const PNG_SIGNATURE = b\"\\x89PNG\\r\\n\\x1a\\n\";\nwrite_png_signature(io::IO) = write(io, PNG_SIGNATURE)", | |
"execution_count": 11, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 11, | |
"data": { | |
"text/plain": "write_png_signature (generic function with 1 method)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### IHDR Chunk (25 bytes)" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:53.641Z", | |
"end_time": "2017-12-26T00:09:53.644000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "const IHDR_00 = b\"\\0\\0\\0\\rIHDR\";", | |
"execution_count": 12, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:54.171Z", | |
"end_time": "2017-12-26T00:09:54.175000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# True color (24bit-depth) RGB\nconst IHDR_10 = b\"\\b\\x02\\0\\0\\0\";", | |
"execution_count": 13, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:54.737Z", | |
"end_time": "2017-12-26T00:09:54.829000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "function write_png_ihdr(io::IO, width::Int, height::Int)\n # write IHDR_00, width, height, IHDR_10, crc to IO\n c = write(io, IHDR_00)\n crc = crc32(IHDR_00[5:end])\n ihdrw = reinterpret(UInt8, [hton(width % UInt32)])\n ihdrh = reinterpret(UInt8, [hton(height % UInt32)])\n c += write(io, ihdrw)\n crc = crc32(ihdrw, crc)\n c += write(io, ihdrh)\n crc = crc32(ihdrh, crc)\n c += write(io, IHDR_10)\n crc = crc32(IHDR_10, crc)\n c += write(io, hton(crc))\n c\nend", | |
"execution_count": 14, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 14, | |
"data": { | |
"text/plain": "write_png_ihdr (generic function with 1 method)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### IDAT Chunk" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:56.360Z", | |
"end_time": "2017-12-26T00:09:56.362000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "const IDAT_04 = b\"IDAT\";", | |
"execution_count": 15, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:57.137Z", | |
"end_time": "2017-12-26T00:09:57.139000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# 圧縮方式+フラグ(Deflate, 圧縮レベル0)\nconst CMF_FLG = b\"\\b\\x1d\";", | |
"execution_count": 16, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:57.672Z", | |
"end_time": "2017-12-26T00:09:57.675000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# Deflate ブロックヘッダ(最終ブロック、無圧縮)\nconst BH = b\"\\x01\";", | |
"execution_count": 17, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:09:58.312Z", | |
"end_time": "2017-12-26T00:09:58.411000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "function write_png_idat(io::IO, img_src::AbstractArray{UInt8,3})\n depth, width, height = size(img_src)\n # @assert depth == 3\n # write length, IDAT_04, CM_FLG, BH, LEN, NLEN, DAT, ADL, crc to IO\n l = height * (1 + width * depth)\n c = write(io, hton((l + 11) % UInt32))\n c += write(io, IDAT_04)\n crc = crc32(IDAT_04)\n c += write(io, CMF_FLG)\n crc = crc32(CMF_FLG, crc)\n c += write(io, BH)\n crc = crc32(BH, crc)\n LEN = htol(l % UInt16)\n c += write(io, LEN)\n crc = crc32(reinterpret(UInt8, [LEN]), crc)\n NLEN = ~LEN\n c += write(io, NLEN)\n crc = crc32(reinterpret(UInt8, [NLEN]), crc)\n IDAT_DAT = vec([zeros(UInt8, 1, height);reshape(img_src, :, height)])\n c += write(io, IDAT_DAT)\n crc = crc32(IDAT_DAT, crc)\n ADL = hton(adler32(IDAT_DAT))\n c += write(io, ADL)\n crc = crc32(reinterpret(UInt8, [ADL]), crc)\n c += write(io, hton(crc))\n c\nend", | |
"execution_count": 18, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 18, | |
"data": { | |
"text/plain": "write_png_idat (generic function with 1 method)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "※↑`LEN`の制限から、あまり大きな画像はこの方法では処理できない(だいたい 147x147 くらいまで) \n (CIFAR10の画像は 32x32 なので大丈夫)" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### IEND Chunk (12 bytes)" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:10:00.037Z", | |
"end_time": "2017-12-26T00:10:00.148000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "const IEND = b\"\\0\\0\\0\\0IEND\\xaeB`\\x82\";\nwrite_png_iend(io::IO) = write(io, IEND)", | |
"execution_count": 19, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 19, | |
"data": { | |
"text/plain": "write_png_iend (generic function with 1 method)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### format to PNG" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:10:00.772Z", | |
"end_time": "2017-12-26T00:10:00.855000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "function write_png(io::IO, record::CIFAR10Record)\n img_src = permutedims(reshape(reinterpret(UInt8, [record])[2:end], (32, 32, 3)), (3, 1, 2))\n c = write_png_signature(io)\n c += write_png_ihdr(io, 32, 32)\n c += write_png_idat(io, img_src)\n c += write_png_iend(io)\n c\nend", | |
"execution_count": 20, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 20, | |
"data": { | |
"text/plain": "write_png (generic function with 1 method)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Check" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:10:02.324Z", | |
"end_time": "2017-12-26T00:10:03.136000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "open(\"sample1.png\", \"w\") do f\n write_png(f, record0)\nend", | |
"execution_count": 21, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 21, | |
"data": { | |
"text/plain": "3172" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2017-12-20T08:54:32.397000+09:00", | |
"start_time": "2017-12-19T23:54:31.583Z" | |
} | |
}, | |
"cell_type": "markdown", | |
"source": "``↓ \n" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Show MIME" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:10:06.393Z", | |
"end_time": "2017-12-26T00:10:06.397000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "Base.mimewritable(::MIME\"image/png\", ::CIFAR10Record) = true\n\nfunction Base.show(io::IO, ::MIME\"image/png\", record::CIFAR10Record)\n write_png(io, record)\nend", | |
"execution_count": 22, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:10:07.710Z", | |
"end_time": "2017-12-26T00:10:08.598000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "record0", | |
"execution_count": 23, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 23, | |
"data": { | |
"text/plain": "CIFAR10Record(0x03, 0xd0b45b812aae12b1)", | |
"image/png": "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" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Load Multiple and Random data" | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:13:00.094Z", | |
"end_time": "2017-12-26T00:13:00.545000+09:00" | |
} | |
}, | |
"cell_type": "code", | |
"source": "records5 = open(\"cifar-10-batches-bin/test_batch.bin\", \"r\") do f\n _randidxs = shuffle(0:9999)\n _read(f::IO, idx::Int) = (seek(f, idx * 3073); read(f, CIFAR10Record))\n return [_read(f, _randidxs[i]) for i=1:5]\nend;", | |
"execution_count": 24, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:13:05.968Z", | |
"end_time": "2017-12-26T00:13:07.051000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "records5", | |
"execution_count": 25, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 25, | |
"data": { | |
"text/plain": "5-element Array{CIFAR10Record,1}:\n CIFAR10Record(0x08, 0xba65649d8b8a8b2b)\n CIFAR10Record(0x00, 0xf0209500d9acf5a2)\n CIFAR10Record(0x06, 0xdf512a631374e8de)\n CIFAR10Record(0x07, 0x4adfc7cb47e7111e)\n CIFAR10Record(0x00, 0x310f064e20cace12)" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:31:24.619Z", | |
"end_time": "2017-12-26T00:31:24.623000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "Base.mimewritable(::MIME\"text/html\", ::CIFAR10Record) = true\n\nfunction Base.show(io::IO, ::MIME\"text/html\", record::CIFAR10Record)\n print(io, \"<img src=\\\"data:image/png;base64,\")\n iobuf = IOBuffer()\n b64pipe = Base64EncodePipe(iobuf)\n write_png(b64pipe, record)\n write(io, read(seekstart(iobuf)))\n print(io, \"\\\">\")\nend", | |
"execution_count": 26, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:34:20.623Z", | |
"end_time": "2017-12-26T00:34:20.628000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "Base.mimewritable(::MIME\"text/html\", ::AbstractArray{CIFAR10Record}) = true\n\nfunction Base.show(io::IO, mime::MIME\"text/html\", records::AbstractArray{CIFAR10Record})\n print(io, \"<table>\")\n for record in records\n print(io, \"<tr><td>\")\n show(io, mime, record)\n print(io, \"</td></tr>\")\n end\n print(io, \"</table>\")\nend", | |
"execution_count": 27, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2017-12-25T15:34:26.732Z", | |
"end_time": "2017-12-26T00:34:27.373000+09:00" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "records5", | |
"execution_count": 28, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 28, | |
"data": { | |
"text/plain": "5-element Array{CIFAR10Record,1}:\n CIFAR10Record(0x08, 0xba65649d8b8a8b2b)\n CIFAR10Record(0x00, 0xf0209500d9acf5a2)\n CIFAR10Record(0x06, 0xdf512a631374e8de)\n CIFAR10Record(0x07, 0x4adfc7cb47e7111e)\n CIFAR10Record(0x00, 0x310f064e20cace12)", | |
"text/html": "<table><tr><td><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAMK0lEQVQIHQEgDN/zAE5PRlBRTFJUT1heWGZqZWRpZE9SSUpNQkRGO1NUTVxcVklMQHJ0aoCJikFDO0JEN0JENkJDNmJlWo6PiUpNPzw+NDo7Njg5NDk6NDs8NDw+NT5ANjk7MTg5MT9AN3JzcwBJSkNKTEZPUUtRVk9eYVxlaWVNUEhKTEJHSD5SVEpaXFVHST1rcGZ3hIU1OTU7QDU+QzZGSjxbYVWOkY1QUU41NjA6OzQ+PzhFRzpKTT5KTT9MTkBGSDo8PTMyMy1oamwASEg+REU9S0xEUVNLWltXZWZjT1FJTU5ES0tBVFNLX11XTkxBa25lfISKOz03OTsuQUQ3SUtAUFJHgIF7W1xWQkM0UlI+UVFAUVJCWFdMVllOSU1BSE1DaW5sa3BzeHyBAFFRSlhZUVBRSVBRSVdXU2RjXlxZU1dVTlNTSVlYT2dhXlpVVGltaoOIjz5BOERHN0hKPkZIPUxOQm5vaG5uY01PPFBPPUhHOkxPSHyCh36HiE1UTTpCPV5maYaMlIqOlABvcG1/gHt0dm9eX1haXFVnZ19paGFnZl9YWE1RUEdkZGBfbn1od4WDjZFDRkFGRz1CRDhHST1HST9iZFyAgnhZW1FVVUxKSUNNTkpjZGRjZWVLTEg8PTc9QDpobW2MjpUAamlneXp3bG5pUVNNWFtSYGNaUlZNVFVOTlFNQkxJWGZyQmWMVmp8hZCTRUhEOToxPT41Q0Q6P0A4VlZPjI2HbnFsaGplS0xGRUlEW2Bdb3NxYmhlQkU/Nzoxb3Z2io6QAGZlaGRlY1FUT0BEPVBUS1pdVExOREtXW16CnWuOpHSLpVBtkXGAjIKNkTo8NzQ1LT4/OTo7Njk6NkNEQYyNi21vbVpcWUdIQzs+OlpjX2t1cU5UUT1AOjo9NYyTk4mRkwBobXpfYlxTWVpET1dHUldQVVNNTURcZWd8l6uLnrCIkp56hoiAiYuDjJA6PTQxMS06Ozk3OTA8PjdJTEePj4xqaGRHRkNJSkg4OjBNUkZWX1NLT0hBQzs9QDqco6OCiIsAaW1qZGRYcHR0goqWmJ6prK+xpKako6WlpausmJuek5SXg4aBf4WElJygTlFEREY7RkhAPUAwSUo7bGxfmpuUfoB5Y2ZfeHx8b3RubXRqa3JqbXJta29rWF1dc3d5dnp7AIOIhn+Cf3+FhYmSl5mfoq6ytKGmqZ2hppyip5ygpq2xuKWpr4qQkJefpV9iW0JEOERFPDY4LkxNSJ+gm7O4uauys5OcmIuSlIOLjXuBgnN1eHd7fYKHinqAhHh5enF0dQBYXVtrcG9kamlcZWVgaGhwdHeBhIeXnp+ttLqwtLy0u8S/xs6dpamaoqijpKaGhoNXWVE9PzFNUElaXVd0eHeDiIdiamlRV1VJUUpPWFFZYV5VXVpka2hkZ2V0dXNsb24ATFFMYmdjXWFdX2hkeYF+nKGgwcXGxsrP3eLtsLbAeH+Hu8PKnqitoKissbW2qayvnqWkbm5cXltHUFZOY2hld3p3YGZkXWBZTlJJVVpVX2RiXmNfZWtnb3Z0hYqJgIaHAHZ6dG5za1hdVFlgWYGIgcjMyLzAwpaYn8TJ0LO8w2Rqcm1zeaSqsK20ubK4u5mdo42RmaeppI+NfJWalpygop+ioJmdnpycnZOUkZKUkZmbm5qcnJ2foJ6kpp+lp6CorABqcWt1enGQlIqeoZ6ztbHJzMueoqVydX2Zn6XI0NhudHtFR0ufoabP1d3N1Ny3vcVkZm56f4S4vr7Cx8jMz9O+wMHO0dPFyNCoqa6ur7G2vL/Dy9DByM29w8a/xsmyvMIAbXVvp66s1dvf5Ofp0tPTtri6gYSMYmRwbnR6vMbOiJGbS1BWh42Q0dviz9njy9Tfj5SeeoOLt8DIw8zO0dXYurq8wcPEvL/Dq66zp6ywrri8wc7Ry9fbydPYzNbbws3TAJOVkeLl59ni7Nbc4+Ln6tDW3LvByqCmr4aNlbG6w8nT3ZmhqJigo8PN0tPd59bg69rh7b/J0rC3v83T2u3y+Njb39DU1rm+vquxtKiwta65vaq0t663vK21vbrCysHK0ACgpKLKy83w9vvX3ufU3ebb5e/k7fTe6O3b5e3b5O3k7fbCy9SnrrTGzdTf6PHi6/Tj7Pbi6/Lc4unh5e7n7vTR2d7Jz9XW2uHa3+O+w8SepKWbpaeQmp2Kk5iPmZ6PmZ4AaHBvjpGV1NXX4ebo5/D43eby2+Ts2+Tp5u/35u/44uv04ur05Ov15Ov14urz4Onx1t/mrba4sbq/z9ffw87TtMDDiJWbqrfBx9HYvMPGr7a5xM/Qxc/QrLa4j5mbg4yQAHN4eHN6eZ+kpbe+wNni5Orz+OXt9Nvj6tzj7Nff6N/n8Njf6c7W4MTR2bvI0bPAyJ6rtHqFjYaUm5KkrY2irJmssIeboo6ms5Osvp2zwqm8xLfGy8bR1M3Y27fBxJ6lpwCuramaoZyGkZGRm5+osLPBx8na3eDa3+PHz9TCyc7c4+jAytCZq7eQqLWLoq6Inqp/l6WBmKeKoK6NorCQoq+IlpyYpKyouMKuwM6svcimtb2grLGXo6WTn6CQnJ2bpaYAuryznaCZhIqLc3t/j5eboKitq7K5vcTJztbY3ubn8Pb32ePkmK+8lrLFmbC8orjDpr7KrMTRucvXvMjQoqywanJvYWZoe4SGh4+Ren+CZ29yYWlqYm5ranZ1e4eIh5OWAK+xq4iKhIGCgH2Eh3+Ij4uUnJqkq6WutKu1uLrDw9PY2eDl5rnGzrPDz6+8w6ezuZykqYeOknB2eF9kZFFUUkZIRUdNSk5YVVhiYF9pZ2Jsa2Vub2Zxcml0eXB7gW54fADExcCZm5VfYV51fHyAiY2CjJOBjpSTnqWiq7Giq66lrbCzur2uuLxlbG9OUE86PTwuLiwmJSQeHx8eICAqLCo4OTY/REFGTUtUXFpfaGdncG9sdnV1f393goR8h4leZmMA09bQnZ+aVVdWUVdXbnd5g4+TiJWZhZCXipWemaOpoauwpa+xh5CSKi0rICEfISIhIiQjJSYmJSUlJiUkJiclKConLC8sMzY0PUNCSFFRVF9eYW1rcXp6dH+BfoiLU1hWAMLHwJ2fm3Jzc0NGR0tSVXN9gIqUlpKdoYqVnYGLlY2Vn6Cqr3yEhigpKSUlIyUlIyQkIiQkIiQkIiUlIyYnJScpJiUnJCYnJCouLDM6OjxFRUdRVFdeY2ZvdHB4fmFlaQC1uLSEhoFXWVUzNDIvMjJRWVt3gYOMlZmVnKGTmqCIkZiKk5xnb3IjJCQkIyEkJCIjIyEjIyEkJCIlJSMlJiQnKSYnKSYmKCUlJyQmKiYsLy40OD0+RUlJUldSW19XXFwAn6CggoWCW19aMzYyKCsoMTMyU1xeeIOIjpaalJyfmKKlmaKoXWNjISIgJCQjJCQjJCQiJCQiJCQiJCQiIyUiJSckKConKSsoKConJyklJyglJSclKC0rMjc4Oz8/MDIwAJaWmJCTknN4dD9EQC0vLCoqKDI3OFFaYXV+hIyWmJKboJqkqVZZWSEiHiQlJSQkJCUlIyUlIyUlIyUkIiUmIyYoJSgqJyosKSkrKCosKSkrKCcpJiYoJSYoJy0vLjAwLgCampyLj410eXRDSUUvMi8tLy0pKikyNzZPWFtweYCNlpuWn6RIS0siIh8kJSQkJCQlJSMlJSMlJiMmJiQmKCUnKSYpKygrLSorLSosLissLissLisqLCopKyoyNTMxMS8Ag4WGiIyMbHFtQkdDMjYyMDMwKy0qJyolMzk2TVZca3V8ho2RP0JDIiIgJCUjJCQjJiYkJiYkJiclJiglJykmKConKiwpKy0qLC4rLC4rLS8sLzEuLzAuKy4tNTs5NDc1AHR0cIWHiWdsaE9UUDM4NDI2Mi0vLCkqKSYnJzA3N01WXWJsczY5OyQkIiUlIyUlIycnJScnJScpJicpJigqJyosKSstKiwuKystKiosKSwtKiwuKy4wLSwvLjpCP0JIRgB4dWmChIJna2haXlo7QDwzNjMyNTEvLy8rKismKSUxNzZIUlMuMTEmJyUnKCUnJyUoKCYpKScpKygpKygrLSosLisvMS4wMi8uLy0tLywqLSsxNDA0NjMtMC47QT9HT0xIt3KoRXJmdQAAAABJRU5ErkJg\"></td></tr><tr><td><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAMK0lEQVQIHQEgDN/zAIeTqnuJpnqFqXqJsHuNtIKUuoSWvIuewpOmyJanyJysyJ+uzKCty6KwzZ2typSlwpWlx5KhxZKiwZKjv5Kkw5KmxYyewoOUvHiNtW+JsmuFsGR8rFx0pFZun1Jpmk5ikwAwTHc2TnwySHwqRn8vTYcxTok0Uo0tSIQzT4g1U4w4VYw8V4lBWYtCWIpDWIhBWIg9VYc4UII3T4E4T4I5UoY7VYk2UIY2UIg8VopDXI1EXI0+Vos4UYc0ToUsRX8pP3oAVmB8UFh8R1N9OEt7MUJ1PUp6TVaBTFN9Qkp2O0p2MUR0KT5uKUB0KjxxKzxuMUFyMkJzOkt7RFWFPU59N0p6N0p7MUV3OEx8Q1eCS16EUGCDT2GGTVyHU16HVmCHWmGLAFlbclxfe09XeD1NeSlAcSs9ckNMe1tehV9fglxdej9Ibi09bS0+czdDb0VNbkZNcE5Td1xhhVpih1Baf05Zgk9ciFBZhWdulW93mnN4moWFoYiIpH9+n4WFoYB/lHFtiQBOUmZkYHRsZ35raoFpaodTW4E4SXcuP3I0P244Q3I0QHA/R29TVXZoZHptZXxOVnZBT3JJVXVMWnlcaIdyd5aAfZhtc5ZcaY1gbYxud5NnbYtrbI1gX4NpZYJoY4NWV3wATE9fWVhsY190dGx9i4GQlYiYlYibdnGJVVd3R0tzQ0p0NENwQ0xyWFt+Wl1+UVZyUFhxV2J9eHqPh3+WjoWakoiXSVJ3LUBwM0d4RlJ3U1p2UFd0X159e2yDdmyDWVV1AHtweHZvfZSGjqCTmn18jH15jZSHmpaGl5SFlJOIlomBkXZ3kEVMdjdCbzpHbklOc2VjfGFgd21mdX1ufGVabV5ddUJJbTNBbTNDcUZRel5khFNYdVxce3dvhW1pflxZcACdioiMf4aYjJSMgoyLiJGRjpeVkZyIfoubipKsmp2jk5uZi5eBdX9kXm1UU2hJTGs/SG09R205RmxCSGlFR2JJS2FBRWEvOF8sOGEoNVwsNlc5Plw7QF8+RGNBRGRMT2gArpeMtZ6ZuaWjw7Gx08C+3crF49HJ1cC9xKuuwKWmxamqtpibrI6Lpo6QkH+KfHB5dGp0ZmFvUFBoQUZkOUBiRUZkSkxjPEFeNzpaMjhVMThXNzdWNjdUPDxWQkNdMjdSANO1nta3pty/seDHvOPLxuLMyOTRye3b09nGwcKvrsmxrceYlrSPi6+TkLihoqmWmpuLkYh8hHRnbXBiZlpRXUlGW0dGXj9BVzs/Vjg7VjQ3VTI0UC8xSi4xSC4ySSwxSADNr5fVt6TUtKjcwLXfycHiz8nj0MndysXZyMLj0MbazMTEi4rGpJ+/qKXApqC6oJ23nqK3oKOvl5eSgoaFdXttX2ddWWFWU15PTFpDQlM+PVE1Nkg0NkgtNEsrMkgtMEUAvJ2LzrKjzrGo3cC22MG43crD38vE4MzF59TM6dnQ29HKyWp01qGeyru6x6ajxqekq5GUrpaVtpyaxKalv6Gioo+Vg3mCZVtlU01XWFFXYVVYUEdROzlINTlMMzdKMjVGAM+xn8qxos20rN7FvOPMw9zIwdvGwNvJxOHT0N3O0MS9wrCMkt24utvSy7uoobefnLCWmLSal7icmLKVlb+vqtTKyLekqq2anJF+hG9ibGVaY11TW01DS0pCTE5FTkZCTgDYvKXFrZ7RvK7bxbnfyb7fysPOubbYxMDk0srTv7ekl5WTiYrOxcPk4d/UzcrGtLO0nZyukpHAo563m5nWz8vX1dSQg4l+eomrm6C2nZ+Zg4heXW5OTFxEPUlJQk5ORE0A2Lykx6+izLeo1L6wx7Gm0bu0wKuoxa6pvKafmIiFaWFnYFRfkG5vy7W35N7f5d7f1srGwrCssJyXu6in9/PvxMLCbmZxYlhlgXN3r5aZsZaYfmhthXB0hGpnWU5WSEBIAM6yl9e+qc+4qsmxptW9ssGtqJKDhYJxdWZaZ0tIXkdKY05HU1dFSo5tb8Oem93R0uvl4+zm3tHIxdnPzv379r65umBaZWtgY4t1eZaAhaWNkbp+aL+Ke7yBaqSGgoJrcgDQtZrStqTNtaXCq5/Ltq2Ae4ZBRVw1OU4pNFApNV0oNl4wMUJGRVJ8dHWScnO3i4raw8Dk4t3u7Of17ez++/WvqaxvYGSJd3iFcnR0ZmmDb2+gcGKod2iOYVaxlJO4l5cA0baaya2axq2exbKkrJ2aWlx0REdhTE9oSk5nUFFjPUVlMzdRPD5YY2Byamt3XU1Zp3F51a+r3tXT5+Df9O/ovb2/g3+IhG9yalxgS0ZTU0lRfWJclnBha1VSfWdqlXx+AMyzltO6pdzDtdK/s9HEwsG5wcC0ucm/wcjAwMzFxr+7vru2uszGxs3Ix6+ssWt7k1ZafJVqds6dldbIxNbRz9vX2NDO06+qqWhgZS4rQi0uSUk+RXFZV3xkYYhwb3xlaADWuqDbv6jVuajKr5/GsKe3pJ/QvbbMvLbPw8Dfy8Paxr7WxsC6srPIwMDWzcrPysqXobZXZ5N9Z3m+hH/FpqfCurvQyMbd19TKwsRuZnAxKjkuJjM9NkZ5YGKJcHGHbmwAxamS07Ob0bGg17yt0Lqwwqie0LOjvaCTrZ+ir5yWsJKAq5aLR0JNSUVSamdsVktLXFFWP0VZPElbYk1PnV5cwZCPuK+uxru80MXFycLEc2tsJh8iLiguNy0wUUNCcVtUALujjOLGqNO4ot3BrtG0p7idlZJ+eoBubXFpcVBMU1RISkpETDAvQT07THZ4g0M7RSQdKykkLSclKigqNFVKT5JeYLN3c8OkncS2tbGnqnhxeGZda1hPVUc6PFJFP1NGQQCKfnmYj4xoYmdqYW1OT2U8RmM0Pl0sNlMrNVAnLUUiKkIkLEcsNFM1OEpMQ1BAM0ouMFAsLUIsLD8rLEE9O0Q5NkFuT0+yZWPDiH+3n5tqZ2ppVVmsg36Oc29MPDpANDMAVFRfVVdjUlJlTU5kV111VF50NT9ZLTlZQkpiR0NSP0BRTFFlR1FmNDpVOTJCOzdILTRVLC9NKjRaKDVcKjNUKio8Kyk4Sz5HjFVavGZnr3FxknuIy5mUnmFbalRNXEZCAGFXW7SgjsmwnsCmk9e6rL+poXhtdXRreKCOiKSJg7KXjcurm7Cfl1ZRYEY/RlNOUktFVC46YDA+aic0YiYzXywzUSwqPCIjKy4wOF1ETI1MUapeZsd3eJ41OGlRTEU2MwBPSlG5pJjdwa3Tt6TOsKG6npaskYzDpZrLqp3UtqnQuKnQtKShhnyAc3WBdnpmWl5tYGNQW3c0RHExPWklNWAkNFopNVIoLDcoJConISMyLStVNzuHLStvFRopICAjHh4AQkFLl3lp1KqRqop+oIJ1p4h7mn11vqKZyKuh2sKxt6GUtqGcsqCfu6WdqpuUc2twe21wkYuRRFJ+MD5nJTNYITVcJjddKTJKLCo9Jx0lKhsXKB8iVyksXCYqHxshIh0dAEFCTm1TR5FpU5h5caSIfqiKfaqPhrufl8epnsywpMWqo9W7sN7Dtc2vp6uXkq2empSFiMq0rJqWpTJHdCs4YSY3YSQ1YSc2Xiw0VyovRSslMDcrM1lWZIyBh21WWzEmKgBBQ09cTFN3WFCbe3Kbf3W5nY+1mo+skImzlY/LraPZvLTewLndv7TDqqPTtqvUvKypl5DKq6HRuK2AgZktQXIwQXEqOWMmMFYlLEguME4uLEYmIShIR1WemZ7VwLl+cHUAPkFNS0lRcmFaj3Zoe2JZtJmJvJ+Tk3t8poyJ0K+k07aq2cC42Ly30rWs4cO5zbaxkYJ+rZeQwayf0bmyaXGOMUZ2MEBwKjVhJSpCLStFMzBOLCc0Lis3VVJZv7mywri3AD1BTUJET19QUHRkXYVya7+ila6UkI17gLSal8mrpM6xqsGpode8sta3rN/Etrqqqa+doMeyrLimpuPIvtC7um1wjDBEcic5bSY0Xy0xVy4zVzMwRj44RSoqOUU/R3FmagA7Pkw9P05ZTVKOcmajh3qwmpOtl5G7pJ/Dp6PKrqrHq6i4npjatqzatKbavLHawLvdw7jYv7PVurflycPmyL7NtLNta4JLUndDTXY0P2opNmFEQl1kUFZnWmVCMj1OPUUcP+EYOPEOGAAAAABJRU5ErkJg\"></td></tr><tr><td><img src=\"data:image/png;base64,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\"></td></tr><tr><td><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAMK0lEQVQIHQEgDN/zAGVlZmVmZWloZ2hpZmVoY2ZpY2VoY2dqZGVoY2RnY2RmZmRlZmhqZ2ZpYWVoZGZoZWZoZWVnZWtta2psamlraGtta2hqaGdqaGltamhsZWdrYmZnYmdmZ2hnaGppamVlZQBnaGZma2VkbWRpdGhkb2NpdWhwfG9teWxqdWhpcmhmbmdiamRjbGFkbl5gaV1eZlxkbWNhaV9veG94gHp8hHyGj4RzfG9zfW9zfnJrdWZmb15kal5jaWBmcWVpcWhiZmEAa2xoVV1UQlFCU2ZTR1tHWm5ZWW1ZSFxITWBMTl5NR1VIO0g8PEs6QVA7PEo5OUc3Q1BAQU8+SldIT1xSTVtOW2lWT15HWGhQTl9LR1dAQlE5Qk87QU48QFQ9TFxKVl5VAGtsaVNcUTpLOUNaQjhQOE1kTT5VPjNKMjRKMzRGMy09LSk6KjJDMDhJMTZGMjJCMDdHNDlKNzlJNzZGNjhJNz9QOT1PNENWOjtPNz9SNz5QM0NTOzxONzJJLj1OOlJaUABqa2pTW1IxQC4wRC4qPyk4TDc3SzU0SDIyRjEvQC0nNycmNiYwQC02Ry80RDAyQi8yQjA0QzEzQzAvPyw3SDI8TTU7TTI7TTM0SDA/UzdDVTdATzY0RS4uQis6SThTWlIAbGttVVpTMDwsLj0oKzsnNEQxOUk2O0w4NkYyLz8tKzkrKjgrMD8tNEMtNUMxMkAvMkAvM0IwNEIwLj4oOEcxP043OkkzPEw2PE43RFY7P08zNkQsMT4rLjwrO0U5VVlUAGpralVcUDRBKjFBJy47JTNBMDRFNjZHNDVFKy4/Kyw8Lis7Li08KzJCLjZENDI9MC4/Li9DLzRFMDVIMjpMNTxMNTZDMDlIN0NWPUJTNDlFKTA7LDA7MzE8Lz1FPFZaVgBoaW5WX1U7TDA2SDAtNioyPi01SC41Ry80Qi4vPykxQi0tPSkzQys6Si42Ri8zPCoyQis2Sy1CUDM2STM4TDI9Ti86SS5CUzdNYzpGVjE5Qig0PSw2QjI6SDBIUkJVWVMAaWl0WWJdPlA4PVA9Nz84P0swVGg4WGlFPUg7MTwuMz8uOEQwQk8zP08pQFQsR1EvTVUyWmI5ZmU/OkMqRlQ1T2A4TWA2XHJEY3lG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\"></td></tr><tr><td><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAMK0lEQVQIHQEgDN/zANTl/tLi+9Pj/NHj+8/j+9Dk/NHl/NHl/NLm/NHl/NDk+9Dk+87j+s7j+s/j+s7j+sri+snh+8ri+8vj+8rk+8jj+sfi+sfi+cbh+sfg/MTe/MHb+7/Z+7nW/LbS+7TQ+wDS5P/Q4v/R4v/O4f7N4P3O4f7P4v/P4v/P4//O4v/M4P3M3/3L3v/L3f/K3P/J3P/F2v3D2f3D2f2/1fe90/jA1/+/1v6+1v291fy91Py70vu50Pq2zvmxy/mtx/iqw/gAyt3/yNv9yNv9x9r8x9n8yNr9yNv9yNr9x9n8xtj7xtn7xdf7wtT9wtP+wdL9wNH8vM78usz6u874pLfgnbHet8v+s8f7s8f6ssf5scb3r8T1rcHzqr/xprzxorjvnbPuAMLX/8DV/MHV/cLV/cLT/MDS+8DS+sDR+sDR+r/R+r/Q+L3O+LvL+7zM/bnJ+rXF9rfG+7jG+rfH9Zio0peo2a7A96e58ae58Kq88q2/9Ky/9Ku98qm88aW576C07Zyv7AC5z/y4zfq5zvu6zPq5yvi3yPa3x/a3yPa5yvi7y/q5yvi3yPe4yPu4yPuywvWsvPCwvfW1wfezwe+Wpcufr96svfKis+igsOWnt+youe2lteqouO2nue2ituqbr+WWqOMAr8T1rsPzr8T1scT1tsb5tsb5tcX3tMX2s8P2tMT3tcX3tMP2tcT2tMT1sMDxrbztrbjusbzvtMDpkZ7BoK/Yr7/vqbnooK/fpLTlqLjro7Llnq3fnq7gnq/gkqTXi53SAKW36Ke56qi66qe47Ki58K6+9K6/8q2+7qy97q687q+67bK877C877O/8bG+7LC76bi97ry/6rK31pGXsrC227e+6rO65rC346ex3qOv3auz3qiy3ai15Kmy4Kiy4Jaj0QCjtOWnt+eouOmnuOqjtOmnuO2lt+mitOWkteWmteWmsOKqseWnseSrteanst+stuG3ueS6ut+srsmKjaOvstSxtd+wtN2xs92kq9ansNqzttyvtdyqteCrr9qsstucp88Ao7Tjo7TipLXjprbjobHdobHfoLDin7DhmqzanavanajYo6vcpKvcpa3bpq/ZqrPasLTZoqXHmp67mZ2zsbXToqbMqq7UrLDWo6nQrrbburvdrrLVpKzUqqzSoKTJlZ3BAJ6v25qq1pus2J6t2KKx15+v052r2J6u3Y6gzJCfy5ql0p6m1Z+m06Kp06Kq0Kqy1q+106Kox3l+nKCnu7K405ufwqmtz6arzaetz6+z1LWzz7Ky0KKoyqyrzKSlxaSoxwCVp9GTpM2Tpc6WpNCsud2nttGYpceTosyNoMmTosyYo8+aos6YnsagpsyZoMOlrcyxutCqs85ka4qqs8arssmorcyyt9Wprs2us9Gwscy8ts24tc2ztdKyrcqvrMivsMoAmKrRkaPKkKLJk5/Qpa/VsL7QnarAk6PFk6XMnq7VlKDJjpfAl5zCoKXIoKXFmJ65rbjHsrzUWmODqbTHqbLFo6nDrrTOsbfRqq7JsrDIvrXIv7nOwL/YvLTNrKa9qKW8AJGjyoqcwo6fxYyWy5KbxLXD0ay5xZmowoeavpenzY2YwIuSuZebvp+jw6SqxpOZsLC9yL7K4WZuj4OOoJyltpKYsZSasouRqpmdtbOvwrmvvbexwZybsbq0yL65zbi2yACPnMSJl76Gk7uEj76Rm8Sst8u9yNClsL6WpsGZqs2EjbCOjqump76bn7O1u8y7xNK+z+C6yeV2fqBsc4lzeY9wdZN5fp2CiKicnri3sbu0rK6xsbx2gpmjsL6XorWRmq8AhpO5h5G4k5vCkJnFiZS6iZOrtb7Is73DobC/obPNhI2smZexpKOzk5emvMbTxtXjtMretMflfomrcXeTZGqIaW+RfoWllJu6nKC8paGzqqSttLXHdYGgd4qhaHeVd4OiAHiIrIyWu5ufxo6WwHWApY+asqqzv7vGyaW1uJ+uv5ehvJiZtJeYpK20wr3M3rXL36/L36O82W9/pF9qjFhhhV5ojX2IpZSgt4mRrJOUsKaktqGgtnN5mG17lnF8n3+HqgB7jK6EjrKKjrR8hKtjb5GCjKSbpLOuub21xMCfrLWeqL+WnrepsLvBzdu0yd+uy+Ojw9d/mrZYa5BZZolMWHtPWnxxfpV8iph3gpOIjqSFipeGiJV+gZSLl6ibpLuUmbIAgY+wcn6feYKkcHyeZHCPYGqDfYWXk52lvMnIqLK5maW3ssHWu8zZtcrbsMngpsPdlbTKaoOfR1l6XWuFRE5ndn6WjpingIyTkJqgqbG5p7O2tLzAvcPJv8nMn6awjJCbAJqjw2x6mGh6lmJykGl1k2t1joGJnY6Yp6+4wrzByrXAzbrR5KvK3KzJ3arF3J230aS91l5zkFNie4GMmI2Umr7DycjO0sjO0M3Q08/S17rIzp+uuJKbppOanW1xfISEkACFjKxsfJhbcoxWaYSBjKd9hp2HjqGzu8+fqLrJztnK1uStyN+ly+KnyN+Ys8qovdWmudR6iqanssXN1dfY3drW2dbQ09HBw8SsqrCEhJNqeIxSY35LVnFzd4h7fJN/fZQAZXWUbHmVaHONZ3CKkJOmmJSfbGx1dXuKi5env9Hfuc/oornYfJazlq7ImK3DqLrNpbPHrrvKxdHbusXOoa25j5qmcnqFcHR8ipCdY3CISVp3O01xRFN4ZHGPZG+MWmJ7AF9xjGlyjHBzi32Al6upuKSco316gFddaaa1wcLb7bLM6HqOsGZ4lY2fuJmrwJWlt4mWppCcp5qnrlpmdDxKX1VkeFJdbnV8iZmktVxvij5RcDNFaUJUeUFRcEBQakdUZwBTX3ZoboR/gJV9fZCWlKGZlJx5eIB4f4rJ2ee+1+ysxeFyg6NzgZp3hpxwgJNTZHVPXG50gIyZpq5cZ3dKWG09TF89SVtVX29ib4RKXXo1SGgzRWg7TW9CU2tGVWhUYW4AUlptbnKHiYqgeneHgn6JgX+KdHV/pay1zuHzttHno7rUeIWjanKGVF5xRlNkQE9gVGF0ZXF/ipaiWmV4UV5zMD9SMD5RQU9iSVlxPVBwMkVlPE9wNEdlS1tvaniHY253AFlhdFthd2dshX96iZWOmFdZZWRncrO7xrnO46jD2Yectl5og3N1hFFWZFBaaVBebkpWaz9KW0ZSYCw3TCw4TSg2SS09UjBBV0hadlBjhThLbDZKaTVHYz1LX11od19ncABaZHpMV3FNWHZzbXyNg41HS1trcHyirLqXrseOqcBid5BRWHCKh5JiY25RWmZKWGc/S2I9SFs1QE8gK0IWITccKj02R15NYns/U3JPYYY/UXMmOlcvQVo2QVk8RVhXXmsAU2B3WGaBWmmJfXiHiYGJQ0pYiI+azNbkjqO7ZHySTF93X2V7nJegXl5nS1NfR1NiPUhfMj5SJzNDGiY7GyY8GSY4NEVZVWuDS2GBPlB2MURkKDxXL0FbPklkOD5UTFBgAH2CkpSdr46ZrnZ3g4GAgkpSU36JjJmirFlgb1lkdE1abUNLXYOBildcaUZPX0NLWjA7TyMzRhgpOCAwO1tpfCUxP1NeZVxrekJVcS5EYiw/Wi0+VUFTbTlGZEZBVnFwgwB0d4KBh5SFjp1dXWt1cHZzcG9/foBycXhKSVFoanRSWWc6P0x0cHZWW2k+SVo4QlElMkMYKDkVJjIvQEd3hpcrN0RtdXhXYm4uQFkoPVcuQVkuPVIxQVdRWnBhWGd6e44AaWt1VVxnSVJfSklbW1Nfc2pseGxsd21xUk9TZmRrU1RdS0pRenN0UlZgLDlKJjREHio6GCQwGSYuP01VXGx8KzZDZW1zO0dTHi9FJzpRLDtRMj9SMj5PcXJ7cWduOkJRAHZ5gGNqc0pTXklPYEtOWU1NSlBKRlFKSkxJS1lWWVBOUV9bXIB4d0xRWSYzQiIvPiEtOSUtM0RJTWNudkhXZycyP0hQWSYxPhUlOCQyRzA8TzI8S0lQXHVvbV9VVyUyQABqbnJqcXhjbHVfa3hSXmQ/SUM5Pzk3OzpAQUVHR0hOTExZVlRnZGRBSFAvOkUxOkQqNDsxNTV7eXh/h5A6SlgnMkAlLDkYIzERHy8iLT42P05SWGRNUFlnX1tSS04bKztSpyjk7hmEEgAAAABJRU5ErkJg\"></td></tr></table>" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "", | |
"execution_count": null, | |
"outputs": [] | |
} | |
], | |
"metadata": { | |
"_draft": { | |
"nbviewer_url": "https://gist.github.com/4cf58ca0ee974a90ab51e84be53187dc" | |
}, | |
"gist": { | |
"id": "4cf58ca0ee974a90ab51e84be53187dc", | |
"data": { | |
"description": "CIFAR10Record_ShowAsPng.jl", | |
"public": true | |
} | |
}, | |
"kernelspec": { | |
"name": "julia-0.6", | |
"display_name": "Julia 0.6.2", | |
"language": "julia" | |
}, | |
"language_info": { | |
"file_extension": ".jl", | |
"name": "julia", | |
"mimetype": "application/julia", | |
"version": "0.6.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment