Mercurial > pylearn
diff sandbox/rbm/model.py @ 395:70019965f888
Basic, broken RBM implementation
author | Joseph Turian <turian@gmail.com> |
---|---|
date | Tue, 08 Jul 2008 20:14:21 -0400 |
parents | sandbox/simple_autoassociator/model.py@36baeb7125a4 |
children | e0c9357456e0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sandbox/rbm/model.py Tue Jul 08 20:14:21 2008 -0400 @@ -0,0 +1,66 @@ +""" +The model for an autoassociator for sparse inputs, using Ronan Collobert + Jason +Weston's sampling trick (2008). +""" + +import parameters + +import globals +from globals import LR + +import numpy +from numpy import dot +import random +random.seed(globals.SEED) + +import pylearn.nnet_ops + +def sigmoid(v): +# if x < -30.0: return 0.0 +# if x > 30.0: return 1.0 + return 1.0 / (1.0 + numpy.exp(-v)) + +def sample(v): + assert len(v.shape) == 1 + x = numpy.zeros(v.shape) + for i in range(v.shape[0]): + assert v[i] >= 0 and v[i] <= 1 + if random.random() < v[i]: x[i] = 0 + else: x[i] = 1 + return x + +class Model: + def __init__(self): + self.parameters = parameters.Parameters(randomly_initialize=True) + + def update(self, instance): + """ + Update the L{Model} using one training instance. + @param instance: A dict from feature index to (non-zero) value. + @todo: Should assert that nonzero_indices and zero_indices + are correct (i.e. are truly nonzero/zero). + """ + v0 = numpy.zeros(globals.INPUT_DIMENSION) + for idx in instance.keys(): + v0[idx] = instance[idx] + + q0 = sigmoid(self.parameters.b + dot(v0, self.parameters.w)) + h0 = sample(q0) + p0 = sigmoid(self.parameters.c + dot(h0, self.parameters.w.T)) + v1 = sample(p0) + q1 = sigmoid(self.parameters.b + dot(v1, self.parameters.w)) + print + print "v[0]:", v0 + print "Q(h[0][i] = 1 | v[0]):", q0 + print "h[0]:", h0 + print "P(v[1][j] = 1 | h[0]):", p0 + print "v[1]:", v1 + print "Q(h[1][i] = 1 | v[1]):", q1 + + print h0.shape + print v0.T.shape + print dot(h0, v0.T) + print dot(q1, v1.T) + self.parameters.w += LR * (dot(h0, v0.T) - dot(q1, v1.T)) + self.parameters.b += LR * (h0 - q1) + self.parameters.c += LR * (v0 - v1)