https://github.com/GPflow/GPflow
Tip revision: 1156bc1e27768cd878835f4c91df17d8c784adcb authored by alexggmatthews on 13 September 2016, 13:03:29 UTC
Readding mnist demo.
Readding mnist demo.
Tip revision: 1156bc1
mnist_demo.py
import numpy as np
import GPflow
import cPickle as pickle
import time
import tensorflow as tf
import urllib2
import os.path
data_directory = 'data/'
mnist_file_name = 'mnist_pickle'
def downloadMnistData():
url = "http://mlg.eng.cam.ac.uk/matthews/GPflow/datasets/mnist/"+mnist_file_name
u = urllib2.urlopen(url)
f = open(data_directory+mnist_file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (mnist_file_name, file_size)
file_size_dl = 0
block_sz = 8192
while True:
buffer = u.read(block_sz)
if not buffer:
break
file_size_dl += len(buffer)
f.write(buffer)
status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
status = status + chr(8)*(len(status)+1)
print status,
f.close()
np.random.seed(0)
ndata = None # none for all data
num_inducing = 500
vb_max_iters = [20000,30000,40000,50000,60000]
beta = 0.5
step_rates = [ 1e-3 * (beta ** elem ) for elem in range(5) ]
nClasses = 10
vb_batchsize = 1000
thin = 2
if not(os.path.exists(mnist_file_name)):
downloadMnistData()
data = pickle.load(open(data_directory+mnist_file_name,'r'))
X_train, Y_train, X_test, Y_test = data['Xtrain'], data['Ytrain'], data['Xtest'], data['Ytest']
X_train = X_train.reshape(X_train.shape[0], -1)
X_test = X_test.reshape(X_test.shape[0], -1)
#scale data
X_train = X_train/255.0
X_train = X_train*2. - 1.
X_test = X_test/255.0
X_test = X_test*2. - 1.
#randomize order
rng = np.random.RandomState(0)
i = rng.permutation(X_train.shape[0])
i = i[:ndata]
X_train, Y_train = X_train[i,:], Y_train[i,:]
from scipy.cluster.vq import kmeans
skip = 20
initZ, _ = kmeans(X_train[::skip,:], num_inducing)
def getKernel():
k = GPflow.kernels.RBF(X_train.shape[1], ARD=False) + GPflow.kernels.White(1, 1e-3)
return k
m_vb = GPflow.svgp.SVGP(X=X_train, Y=Y_train.astype(np.int32), kern=getKernel(), likelihood=GPflow.likelihoods.MultiClass(nClasses), num_latent=nClasses, Z=initZ.copy(), minibatch_size=vb_batchsize, whiten=False)
m_vb.q_mu = m_vb.q_mu.value+np.random.randn(*m_vb.q_mu.value.shape)*0.5 #Add jitter to initial function values to move away from local extremum of objective.
m_vb.likelihood.invlink.epsilon = 1e-3
m_vb.likelihood.fixed=True
#Takes a long time to run.
for repeatIndex in range(len(vb_max_iters)):
print "repeatIndex ", repeatIndex
start_time = time.time()
m_vb.optimize( tf.train.AdadeltaOptimizer(learning_rate=step_rates[repeatIndex], rho=0.9, epsilon=1e-4, use_locking=True) , maxiter=vb_max_iters[repeatIndex] )
mu, _ = m_vb.predict_y(X_test)
percent = np.mean(np.argmax(mu,1)==Y_test.flatten())
new_time = time.time()
print "percent ", percent
print "cycle_diff ", new_time - start_time
start_time = new_time
#achieves 97.94% error.