|
# -*- encoding: utf-8 -*- |
|
import os, struct |
|
from array import array as pyarray |
|
import numpy as np |
|
from numpy import append, array, int8, uint8, zeros |
|
|
|
def _load_mnist(dataset="training", digits=np.arange(10), path="."): |
|
""" |
|
Loads MNIST files into 3D numpy arrays |
|
|
|
Adapted from: http://abel.ee.ucla.edu/cvxopt/_downloads/mnist.py |
|
""" |
|
|
|
if dataset == "training": |
|
fname_img = os.path.join(path, 'train-images-idx3-ubyte') |
|
fname_lbl = os.path.join(path, 'train-labels-idx1-ubyte') |
|
elif dataset == "testing": |
|
fname_img = os.path.join(path, 't10k-images-idx3-ubyte') |
|
fname_lbl = os.path.join(path, 't10k-labels-idx1-ubyte') |
|
else: |
|
raise ValueError("dataset must be 'testing' or 'training'") |
|
|
|
flbl = open(fname_lbl, 'rb') |
|
magic_nr, size = struct.unpack(">II", flbl.read(8)) |
|
lbl = pyarray("b", flbl.read()) |
|
flbl.close() |
|
|
|
fimg = open(fname_img, 'rb') |
|
magic_nr, size, rows, cols = struct.unpack(">IIII", fimg.read(16)) |
|
img = pyarray("B", fimg.read()) |
|
fimg.close() |
|
|
|
ind = [ k for k in range(size) if lbl[k] in digits ] |
|
N = len(ind) |
|
|
|
images = zeros((N, rows, cols), dtype=np.float32) |
|
labels = zeros((N, 1), dtype=int8) |
|
for i in range(len(ind)): |
|
images[i] = array(img[ ind[i]*rows*cols : (ind[i]+1)*rows*cols ], |
|
dtype=np.float32).reshape((rows, cols)) / 255.0 |
|
labels[i] = lbl[ind[i]] |
|
|
|
return images, labels |
|
|
|
|
|
def vectorized_result(j): |
|
"""Return a 10-dimensional unit vector with a 1.0 in the jth |
|
position and zeroes elsewhere. This is used to convert a digit |
|
(0...9) into a corresponding desired output from the neural |
|
network.""" |
|
e = np.zeros((10, 1)) |
|
e[j] = 1.0 |
|
return e |
|
|
|
|
|
def load_mnist(): |
|
img, lbs = _load_mnist(path='./data') |
|
tr_d = (img[:50000], lbs[:50000]) |
|
va_d = (tr_d[0][:10000], tr_d[1][:10000]) |
|
te_d = (img[50000:], lbs[50000:]) |
|
|
|
# tr_d, va_d, te_d = load_data() |
|
training_inputs = [np.reshape(x, (784, 1)) for x in tr_d[0]] |
|
training_results = [vectorized_result(y) for y in tr_d[1]] |
|
training_data = zip(training_inputs, training_results) |
|
validation_inputs = [np.reshape(x, (784, 1)) for x in va_d[0]] |
|
validation_data = zip(validation_inputs, va_d[1]) |
|
test_inputs = [np.reshape(x, (784, 1)) for x in te_d[0]] |
|
test_data = zip(test_inputs, te_d[1]) |
|
return ([_ for _ in training_data], |
|
[_ for _ in validation_data], |
|
[_ for _ in test_data]) |
|
|
|
|
|
def _load_data(): |
|
import cPickle |
|
import gzip |
|
f = gzip.open('./data/mnist.pkl.gz', 'rb') |
|
training_data, validation_data, test_data = cPickle.load(f) |
|
f.close() |
|
return (training_data, validation_data, test_data) |
|
|
|
|
|
def load_data_wrapper(): |
|
tr_d, va_d, te_d = _load_data() |
|
training_inputs = [np.reshape(x, (784, 1)) for x in tr_d[0]] |
|
training_results = [vectorized_result(y) for y in tr_d[1]] |
|
training_data = zip(training_inputs, training_results) |
|
validation_inputs = [np.reshape(x, (784, 1)) for x in va_d[0]] |
|
validation_data = zip(validation_inputs, va_d[1]) |
|
test_inputs = [np.reshape(x, (784, 1)) for x in te_d[0]] |
|
test_data = zip(test_inputs, te_d[1]) |
|
return (training_data, validation_data, test_data) |