Skip to content

Commit 2e4a794

Browse files
committed
make data externally available
1 parent 18106ae commit 2e4a794

File tree

14 files changed

+195
-8
lines changed

14 files changed

+195
-8
lines changed

data/0.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/1.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/2.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/3.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/4.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/5.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/6.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/7.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/8.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/9.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

package-lock.json

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
"private": true,
55
"dependencies": {
66
"deeplearn": "0.3.13",
7-
"mnist": "^1.1.0",
87
"react": "^16.1.1",
98
"react-dom": "^16.1.1",
109
"react-scripts": "1.0.17"
1110
},
1211
"scripts": {
12+
"postinstall": "ln -s '../data' node_modules/data",
1313
"start": "react-scripts start",
1414
"build": "react-scripts build",
1515
"test": "react-scripts test --env=jsdom",

src/App.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { Component } from 'react';
2-
import mnist from 'mnist';
2+
import mnist from './mnist';
33

44
import './App.css';
55

@@ -17,8 +17,8 @@ class App extends Component {
1717

1818
constructor() {
1919
super();
20-
2120
const { training, test } = mnist.set(TRAINING_SET_SIZE, TEST_SET_SIZE);
21+
2222
this.testSet = test;
2323
this.trainingSet = training;
2424

src/mnist.js

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
import json0 from 'data/0.json';
2+
import json1 from 'data/1.json';
3+
import json2 from 'data/2.json';
4+
import json3 from 'data/3.json';
5+
import json4 from 'data/4.json';
6+
import json5 from 'data/5.json';
7+
import json6 from 'data/6.json';
8+
import json7 from 'data/7.json';
9+
import json8 from 'data/8.json';
10+
import json9 from 'data/9.json';
11+
12+
// MNIST digits
13+
var MNIST = [];
14+
15+
// size of the sample images (28 x 28)
16+
var size = 28;
17+
18+
// raw data
19+
var raw = [
20+
json0.data,
21+
json1.data,
22+
json2.data,
23+
json3.data,
24+
json4.data,
25+
json5.data,
26+
json6.data,
27+
json7.data,
28+
json8.data,
29+
json9.data,
30+
];
31+
32+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(function (id) {
33+
// mnist digit
34+
var digit = {
35+
id: id
36+
};
37+
38+
// raw data
39+
digit.raw = raw[digit.id];
40+
41+
// number of samples
42+
digit.length = digit.raw.length / (size * size) | 0;
43+
44+
// get one sample
45+
digit.get = function (_which) {
46+
var which = _which;
47+
// if not specified, or if invalid, pick a random sample
48+
if ('undefined' == typeof which || which > digit.length || which < 0) {
49+
which = Math.random() * digit.length | 0;
50+
}
51+
52+
// generate sample
53+
var sample = [];
54+
for (
55+
var length = size * size,
56+
start = which * length,
57+
i = 0;
58+
i < length;
59+
sample.push(digit.raw[start + i++])
60+
);
61+
return sample;
62+
}
63+
64+
// get a range of samples
65+
digit.range = function (start, end) {
66+
if (start < 0)
67+
start = 0;
68+
if (end >= digit.length)
69+
end = digit.length - 1;
70+
if (start > end) {
71+
var tmp = start;
72+
start = end;
73+
end = tmp;
74+
}
75+
var range = [];
76+
for (
77+
var i = start;
78+
i <= end;
79+
range.push(digit.get(i++))
80+
);
81+
return range;
82+
}
83+
84+
// get set of digits, ready to be used for training or testing
85+
digit.set = function (start, end) {
86+
var set = [];
87+
var output = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
88+
output[digit.id] = 1;
89+
var range = digit.range(start, end);
90+
for (
91+
var i = 0;
92+
i < range.length;
93+
set.push({
94+
input: range[i++],
95+
output: output
96+
})
97+
);
98+
return set;
99+
}
100+
101+
// add mnist digit
102+
MNIST.push(digit);
103+
});
104+
105+
// Generates non-overlaping training and a test sets, with the desired ammount of samples
106+
MNIST.get = function (count) {
107+
var range = [];
108+
for (var i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
109+
range = range.concat(this[i].set(0, this[i].length));
110+
}
111+
range = shuffle(range);
112+
if (Number(count)) {
113+
range = range.slice(0, Number(count));
114+
}
115+
return range;
116+
}
117+
118+
119+
// Generates non-overlaping training and a test sets, with the desired ammount of samples
120+
MNIST.set = function (_training, _test) {
121+
var training = _training / 10 | 0;
122+
var test = _test / 10 | 0;
123+
124+
if (training < 1)
125+
training = 1;
126+
if (test < 1)
127+
test = 1;
128+
129+
// check that there are enough samples to make the sets, and change the ammounts if they are too big
130+
if (training + test + 1 > MNIST.__MINLENGTH) {
131+
console.warn('There are not enough samples to make a training set of ' + training + ' elements and a test set of ' + test + ' elements.');
132+
if (training > test) {
133+
test = MNIST.__MINLENGTH * (test / training);
134+
training = MNIST.__MINLENGTH - training;
135+
}
136+
else {
137+
training = MNIST.__MINLENGTH * (training / test);
138+
test = MNIST.__MINLENGTH - test;
139+
}
140+
}
141+
142+
// make both sets
143+
var trainingSet = [];
144+
var testSet = [];
145+
146+
for (var i = 0; i < 10; i++) {
147+
trainingSet = trainingSet.concat(MNIST[i].set(0, training - 1));
148+
testSet = testSet.concat(MNIST[i].set(training, training + test - 1));
149+
}
150+
151+
// return the sets, shuffled
152+
return {
153+
training: shuffle(trainingSet),
154+
test: shuffle(testSet)
155+
}
156+
}
157+
158+
// draws a given digit in a canvas context
159+
MNIST.draw = function (digit, context, offsetX, offsetY) {
160+
var imageData = context.getImageData(offsetX || 0, offsetY || 0, size, size);
161+
for (var i = 0; i < digit.length; i++) {
162+
imageData.data[i * 4] = digit[i] * 255;
163+
imageData.data[i * 4 + 1] = digit[i] * 255;
164+
imageData.data[i * 4 + 2] = digit[i] * 255;
165+
imageData.data[i * 4 + 3] = 255;
166+
}
167+
context.putImageData(imageData, offsetX || 0, offsetY || 0);
168+
}
169+
170+
// takes an array of 10 digits representing a number from 0 to 9 (ie. any output in a dataset) and returns the actual number
171+
MNIST.toNumber = function (array) {
172+
return array.indexOf(Math.max.apply(Math, array));
173+
}
174+
//+ Jonas Raoni Soares Silva
175+
//@ http://jsfromhell.com/array/shuffle [rev. #1]
176+
177+
function shuffle(v) {
178+
for (var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
179+
return v;
180+
};
181+
182+
export default MNIST;

0 commit comments

Comments
 (0)