MNISTのWebサイトで配布されている手書き数字のデータは、バイナリ形式です。これを、JSONデータに変換する方法をメモしました。
http://yann.lecun.com/exdb/mnist/
DBをダウンロードして、解凍します。
mnistdb2json.js
// MNIST手書きデータをJSONに変換する for Node.jsconstCONV_LIMIT=5000// 小さなJSONを作成する場合// サンプルファイルの保存先を指定varDIR_IMAGE=__dirname+"/image";// モジュールの取り込みvarfs=require('fs');// 変換処理convertToJSON("train");convertToJSON("t10k");functionconvertToJSON(basename){console.log("convert: "+basename);// 各種ファイル名を決定varfile_images=basename+"-images-idx3-ubyte";varfile_labels=basename+"-labels-idx1-ubyte";varfile_csv=basename+".json";// ファイルを開くvarf_img=fs.openSync(file_images,"r");varf_lbl=fs.openSync(file_labels,"r");// var f_out = fs.openSync(file_csv, "w+");if(!fs.existsSync(DIR_IMAGE)){fs.mkdirSync(DIR_IMAGE);}// ヘッダを読むvarbuf_i=newBuffer(16);fs.readSync(f_img,buf_i,0,buf_i.length);varbuf_l=newBuffer(8);fs.readSync(f_lbl,buf_l,0,buf_l.length);// ヘッダをチェックvarmagic=buf_i.readUInt32BE(0);varnum_images=buf_i.readUInt32BE(4);varnum_rows=buf_i.readUInt32BE(8);varnum_cols=buf_i.readUInt32BE(12);varnum_size=num_rows*num_cols;if(magic!=0x803){console.error("[ERROR] Broken file=",magic.toString(16));process.exit();}console.log("num_of_images="+num_images);console.log("num_of_rows="+num_rows);console.log("num_of_cols="+num_cols);console.log("num_of_pixel_size="+num_size);// 画像を取り出すvarbuf_img=newBuffer(num_size);varbuf_lbl=newBuffer(1);varmini_csv="";varlabels=[];vardatas=[];for(vari=0;i<num_images;i++){// 経過を表示if(i%1000==0)console.log(i+"/"+num_images);if(i>CONV_LIMIT)break;// 画像を読むvarpos_i=i*num_size+16;fs.readSync(f_img,buf_img,0,num_size,pos_i);// ラベルを読むvarpos_l=i*1+8;fs.readSync(f_lbl,buf_lbl,0,1,pos_l);varno=buf_lbl[0];// PGM形式として保存 (テスト用)if(i<30){vars="P2 28 28 255\n";for(varj=0;j<28*28;j++){s+=buf_img[j]+"";s+=(j%28==27)?"\n":"";}varimg_file=DIR_IMAGE+"/"+basename+"-"+i+"-"+no+".pgm";fs.writeFileSync(img_file,s,"utf-8");}// CSVとして保存varcells=[];for(varj=0;j<28*28;j++){constv=Math.floor(buf_img[j]/255*100)/100cells.push(v);}labels.push(no)datas.push(cells)}varobj={"label":labels,"data":datas}fs.writeFileSync(file_csv,JSON.stringify(obj),"utf-8")console.log("ok:"+basename);}