Skip to content

Commit

Permalink
simple refactoring code
Browse files Browse the repository at this point in the history
add modules test_rbm and test_rtrbm
test_rbm generate some difference images. it is good
  • Loading branch information
gavrmike committed Feb 21, 2013
1 parent 31d2300 commit af6d6fd
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 141 deletions.
8 changes: 0 additions & 8 deletions rbm/gavr_rbm.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,6 @@ def eDataCalc(x, mat, vecV, vecH):
# save function
self.grad_step = theano.function([sizeOfBlockForLearn, learningRate, countGibbsSteps, data], egrad, updates=updates)

# TODO: return not all gradient, only information about max, min, ExpectValue by W, hBias, vBias

def saveTo(self, strIo):
if isinstance(strIo, StringIO.StringIO):
func = lambda theano_func: re.sub('array\(|\)|\n|\t|\[|\][^,]', '',repr(theano_func()))
Expand Down Expand Up @@ -155,9 +153,6 @@ def convertVectorToImage(appearance, vector):
return im

def Learn(rbm, data, countStep, learningRate, gibbsStep, func=None, zipper=None, appereance=None):
# TODO tic-toc time;
# TODO work with ZipManager
# TODO test ZipManager
if func is None:
func = lambda index, data: data
if zipper is None:
Expand All @@ -184,9 +179,6 @@ def myUpdate(index):
strIO.close()
return time

#TODO test rbm Learn
#TODO loadRbmFromZipManager

'''
Example
'''
Expand Down
115 changes: 1 addition & 114 deletions rbm/rbm.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
__author__ = 'gavr'

import time
import PIL.Image
import PIL.ImageDraw
import PIL.ImagePalette
# save
import utils
import StringIO

import numpy
from math import sqrt
import theano
import theano.tensor as T
from numpy.oldnumeric.random_array import random_integers
from theano.tensor.shared_randomstreams import RandomStreams

import re
import os
import sys

"""
freeEnergy(visibleSample) - calculate freeEnergy for sample of visible energy
Expand Down Expand Up @@ -139,29 +132,6 @@ def createSimpleRBM(hidden, visible):
theanoRng = RandomStreams(numpyRng.randint(2 ** 30))
return RBM(hidden, visible, numpyRng, theanoRng)

def convertImageToVector(image):
return numpy.asarray(list(image.getdata()))

def convertVectorToImage(appearance, vector):
im = appearance.copy()
im.putdata(vector)
return im

# save Data
def saveData(strio):
file = open('data.txt', 'w')
file.write(strio)
file.close()

# readData from data.txt
def getStringData():
file = open('data.txt', 'r')
s = StringIO.StringIO()
output = file.readlines()
s.writelines(output)
file.close()
return s.getvalue()

# create RBM from string-text
def openRBM(strio):
print strio
Expand All @@ -176,87 +146,4 @@ def openRBM(strio):
theanoRng = RandomStreams(numpyRng.randint(2 ** 30))
return RBM(int(array[1]), int(array[0]), numpyRng, theanoRng, W, hBias, vBias)

"""
Example
"""


def generatorImage(size):
image = PIL.Image.new(mode = "P", size = (size, size))
image.putpalette([255, 255, 255, 0, 0, 0])
draw = PIL.ImageDraw.Draw(image)
f = lambda x, y: random_integers(y, minimum=x)
draw.line((f(1, size/2), f(1, size/2), f(size/2, size), f(size/2, size)), fill = 1)
return image

def generatorWrongImage(size):
image = PIL.Image.new(mode = "P", size = (size, size))
image.putpalette([255, 255, 255, 0, 0, 0])
draw = PIL.ImageDraw.Draw(image)
f = lambda x, y: random_integers(y, minimum=x)
draw.line((f(size / 2, size), f(1, size / 2), f(1, size / 2), f(size / 2, size)), fill = 1)
return image

size = 20
# generate Data
datasize = 100
data = [convertImageToVector(generatorImage(size)) for i in range(0, datasize)]
rbm = createSimpleRBM(100, size * size)
#saveData(rbm.saveTo().getvalue())
#rbm = openRBM(getStringData())
print 'start train'

for idx in range(0, 200):
# for inneridx in range(0, datasize):
print idx, rbm.grad_step(data, numpy.asarray(0.01, dtype='float32'), 3)

print 'control train data'

for obj in data:
print rbm.freeEnergy(obj)

print 'control train data'

data = [convertImageToVector(generatorImage(size)) for i in range(0, 10)]

for obj in data:
print rbm.freeEnergy(obj)

print 'randomInfo'

for idx in range(0, 5):
x = rbm.generateVisibles()
print rbm.freeEnergy(x)
x1 = rbm.gibbs(x, 1)
print rbm.freeEnergy(x1)
x2 = rbm.gibbs(x, 10)
print rbm.freeEnergy(x2)

print 'WringImage'

for idx in range(0, 5):
x = generatorWrongImage(size)
x = convertImageToVector(x)
print rbm.freeEnergy(x)
x1 = rbm.gibbs(x, 1)
print rbm.freeEnergy(x1)
x2 = rbm.gibbs(x, 10)
print rbm.freeEnergy(x2)

generatorImage(size).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 1)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 2)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 5)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 10)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 20)).show()

convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(2)).show()
convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(5)).show()
convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(10)).show()
convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(20)).show()


saveData(rbm.saveTo().getvalue())
print 'saving has been made'
22 changes: 19 additions & 3 deletions rbm/rtrbm.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from re import template
import re

__author__ = 'gavr'
import time
Expand Down Expand Up @@ -174,14 +175,29 @@ def calc_grad_Energy_For_Input_Objects_By_Rnd(samples):
for u, v in zip(block, alls[1:]):
upds[u] = u - learningRate * v
self.grad_step_rnd = theano.function([data, countGibbsSteps, learningRate], alls[0], updates=upds)
print self.grad_step_rnd


alls, upds = calc_grad_Energy_For_Input_Objects_By_Data(shuffleData)
block = [W1, W2, hBias, vBias, W]
for u, v in zip(block, alls[1:]):
upds[u] = u - learningRate * v
self.grad_step = theano.function([data, countGibbsSteps, learningRate], alls[0], updates=upds)
print self.grad_step

def save(self):
strIo = StringIO.StringIO()
convertingVector = lambda x: '[ '+', '.join(map(str, x)) + '] '
convertingMatrix = lambda y: '[' + '], '.join(map(convertingVector, y)) + '] '
func = lambda str: re.sub('array\(|\)|\n|\t|\[|\][^,]', '', str)
fget = lambda var: theano.function([], var)
strIo.write(repr(self.visible) + "\n")
strIo.write(repr(self.hidden) + "\n")
strIo.write(func(convertingVector(fget(self.hBias)())) + "\n")
strIo.write(func(convertingVector(fget(self.vBias)())) + "\n")
strIo.write(func(convertingMatrix(fget(self.W)())) + "\n")
strIo.write(func(convertingMatrix(fget(self.W1)())) + "\n")
strIo.write(func(convertingMatrix(fget(self.W2)())) + "\n")
return strIo


# TODO save RTRBM
# TODO test RTRBM
# TODO Apply RTRBM for clocks.
Expand Down
17 changes: 1 addition & 16 deletions rbm/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,4 @@
import os
import sys


q = T.tensor3()

print q
z = numpy.asarray([[[1, 2, -1], [3, 4, -1]], [[5, 6, -1], [7, 8, -1]]])
print z
q.dimshuffle(0, 2, 1)
#f1, upd = theano.scan(lambda a: T.dot(a, a.T), sequences=q)
#f2 = T.sum(f1, axis=(1, 2))
#f2 = T.addbroadcast(f2)
#f3 = theano.function([q], [f2, q[0], (f2 + q[0])])
a, b, c = q.shape
eee = T.zeros((a, b))
f4 = theano.function([q], eee)
#print f3(z)
print f4(z)
import rbm
91 changes: 91 additions & 0 deletions rbm/test_rbm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import utils

__author__ = 'gavr'

from rbm import RBM
from rbm import createSimpleRBM
from utils import convertImageToVector
from utils import convertVectorToImage
from utils import saveData
from PIL import Image
from PIL import ImageDraw
from numpy.oldnumeric.random_array import random_integers
import numpy

def generatorImage(size):
image = Image.new(mode = "P", size = (size, size))
image.putpalette([255, 255, 255, 0, 0, 0])
draw = ImageDraw.Draw(image)
f = lambda x, y: random_integers(y, minimum=x)
draw.line((f(1, size/2), f(1, size/2), f(size/2, size), f(size/2, size)), fill = 1)
return image

def generatorWrongImage(size):
image = Image.new(mode = "P", size = (size, size))
image.putpalette([255, 255, 255, 0, 0, 0])
draw = ImageDraw.Draw(image)
f = lambda x, y: random_integers(y, minimum=x)
draw.line((f(size / 2, size), f(1, size / 2), f(1, size / 2), f(size / 2, size)), fill = 1)
return image

size = 20
# generate Data
datasize = 2000
data = [convertImageToVector(generatorImage(size)) for i in range(0, datasize)]
rbm = createSimpleRBM(100, size * size)
#saveData(rbm.saveTo().getvalue())
#rbm = openRBM(getStringData())
print 'start train'

for idx in range(0, 80):
for index in range(0, 20):
print idx, rbm.grad_step(data[index * 100: (index+1) * 100 - 1], numpy.asarray(0.01, dtype='float32'), 20)

print 'control train data'

for obj in data:
print rbm.freeEnergy(obj)

print 'control train data'

data = [convertImageToVector(generatorImage(size)) for i in range(0, 10)]

for obj in data:
print rbm.freeEnergy(obj)

print 'randomInfo'

for idx in range(0, 5):
x = rbm.generateVisibles()
print rbm.freeEnergy(x)
x1 = rbm.gibbs(x, 1)
print rbm.freeEnergy(x1)
x2 = rbm.gibbs(x, 10)
print rbm.freeEnergy(x2)

print 'WringImage'

for idx in range(0, 5):
x = generatorWrongImage(size)
x = convertImageToVector(x)
print rbm.freeEnergy(x)
x1 = rbm.gibbs(x, 1)
print rbm.freeEnergy(x1)
x2 = rbm.gibbs(x, 10)
print rbm.freeEnergy(x2)

convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 1)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 5)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 10)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 20)).show()
convertVectorToImage(generatorImage(size), rbm.gibbs(convertImageToVector(generatorImage(size)), 30)).show()

convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(1)).show()
convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(5)).show()
convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(10)).show()
convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(20)).show()
convertVectorToImage(generatorImage(size), rbm.gibbsFromRnd(30)).show()


saveData(rbm.saveTo().getvalue())
print 'saving has been made'
2 changes: 2 additions & 0 deletions rbm/test_rtrbm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
__author__ = 'gavr'

29 changes: 29 additions & 0 deletions rbm/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
__author__ = 'gavr'

import StringIO
import numpy

def convertImageToVector(image):
return numpy.asarray(list(image.getdata()))

def convertVectorToImage(appearance, vector):
im = appearance.copy()
im.putdata(vector)
return im

# save Data
def saveData(strio):
file = open('data000.txt', 'w')
file.write(strio)
file.close()

# readData from data.txt
def getStringData():
file = open('data.txt', 'r')
s = StringIO.StringIO()
output = file.readlines()
s.writelines(output)
file.close()
return s.getvalue()


0 comments on commit af6d6fd

Please sign in to comment.