Mercurial > pylearn
view pylearn/algorithms/rbm.py @ 542:ee5324c21e60
changes to dbdict to use dict-like instead of object-like state
author | James Bergstra <bergstrj@iro.umontreal.ca> |
---|---|
date | Mon, 17 Nov 2008 18:38:32 -0500 |
parents | 85d3300c9a9c |
children | de6de7c2c54b |
line wrap: on
line source
import sys, copy import theano from theano import tensor as T from theano.tensor.nnet import sigmoid from theano.compile import module from theano import printing, pprint from theano import compile import numpy as N from ..datasets import make_dataset from .minimizer import make_minimizer from .stopper import make_stopper from ..dbdict.experiment import subdict class RBM(module.FancyModule): # is it really necessary to pass ALL of these ? - GD def __init__(self, nvis=None, nhid=None, input=None, w=None, hidb=None, visb=None): super(RBM, self).__init__() # symbolic theano stuff # what about multidimensional inputs/outputs ? do they have to be # flattened or should we used tensors instead ? self.w = w if w is not None else module.Member(T.dmatrix()) self.visb = visb if visb is not None else module.Member(T.dvector()) self.hidb = hidb if hidb is not None else module.Member(T.dvector()) # 1-step Markov chain self.hid = sigmoid(T.dot(self.w,self.input) + self.hidb) self.hid_sample = self.hid #TODO: sample! self.vis = sigmoid(T.dot(self.w.T, self.hid) + self.visb) self.vis_sample = self.vis #TODO: sample! self.neg_hid = sigmoid(T.dot(self.w, self.vis) + self.hidb) # cd1 updates: self.params = [self.w, self.visb, self.hidb] self.gradients = [ T.dot(self.hid, self.input) - T.dot(self.neg_hid, self.vis), self.input - self.vis, self.hid - self.neg_hid ] def __instance_initialize(self, obj): obj.w = N.random.standard_normal((self.nhid,self.nvis)) obj.genb = N.zeros(self.nvis) obj.hidb = N.zeros(self.nhid) def RBM_cd(): pass; def train_rbm(state, channel=lambda *args, **kwargs:None): dataset = make_dataset(**subdict_copy(state, prefix='dataset_')) train = dataset.train rbm_module = RBM( nvis=train.x.shape[1], nhid=state['size_hidden']) batchsize = state['batchsize'] verbose = state['verbose'] iter = [0] while iter[0] != state['max_iters']: for j in xrange(0,len(train.x)-batchsize+1,batchsize): rbm.cd1(train.x[j:j+batchsize]) if verbose > 1: print 'estimated train cost...' if iter[0] == state['max_iters']: break else: iter[0] += 1