提交 a8cfe8f2 authored 作者: Olivier Breuleux's avatar Olivier Breuleux

some autoassociator code

上级 bb5d63fd
......@@ -11,6 +11,7 @@ import core
def to_func(inputs, outputs):
print gof.Env(inputs, outputs)
p = prog(inputs, outputs)
print p.env
def f(*args):
......
......@@ -51,6 +51,16 @@ def print_graph(*rs):
print as_string(*rs)
def input(x):
if isinstance(x, numpy.ndarray):
return NumpyR(x)
elif isinstance(x, (int, float)):
return NumpyR(numpy.array(x))
elif isinstance(x, gof.Result):
raise TypeError("%s is already a result." % x)
else:
return PythonR(x)
def wrap(x):
if isinstance(x, NumpyR):
return x
......@@ -60,12 +70,34 @@ def wrap(x):
return x.out
elif isinstance(x, Proxy):
return wrap(x._obj)
else:
return input(x)
# elif isinstance(x, numpy.ndarray):
# return NumpyR(x)
# elif isinstance(x, (int, float)):
# return NumpyR(numpy.array(x))
# else:
# return PythonR(x)
def literal(x):
try:
present = x in gof.literals_db
except TypeError: # x is unhashable
present = False
if present:
return gof.literals_db.get(x)
elif isinstance(x, numpy.ndarray):
return NumpyR(x)
ret = NumpyR(x, constant = True)
elif isinstance(x, (int, float)):
return NumpyR(numpy.array(x))
ret = NumpyR(numpy.array(x), constant = True)
elif isinstance(x, gof.Result):
raise TypeError("%s is already a result." % x)
else:
return PythonR(x)
return PythonR(x, constant = True)
gof.literals_db[x] = ret
return ret
inplace = gof.Destroyer
......
......@@ -63,24 +63,28 @@ import grad
############################
# core.build_mode()
# dim = core.wrap(())
# dim2 = core.wrap((2, 2))
# a = core.zeros(dim, dtype='int32') #(core.NumpyR(numpy.ones((3, 3))))
# b = core.ones(dim2, 'int32') #(core.NumpyR(numpy.ones((3, 3))))
# c = core.zeros(dim, dtype='int32')
# d = a + (b + b) + c + numpy.ones(())
# e = d + (b * c)
# core.pop_mode()
#core.build_mode()
dim = core.wrap(())
dim2 = core.wrap((2, 2))
a = core.zeros(dim, dtype='int32') #(core.NumpyR(numpy.ones((3, 3))))
b = core.ones(dim2, 'int32') #(core.NumpyR(numpy.ones((3, 3))))
c = core.zeros(dim, dtype='int32')
d = a + (b + b) + c + numpy.ones(())
e = d + (b * c)
# #print e
# #print gof.graph.ops([dim], [e])
# #1/0
#core.pop_mode()
# #print gof.Env([dim], [e])
print e
#print e
#print gof.graph.ops([dim], [e])
#1/0
#print gof.Env([dim], [e])
#f = compile.to_func([dim], [e])
# #f = compile.to_func([dim], [e])
# f = compile.to_func([a, b, c], [e])
# print f(1, 2, 3)
......@@ -108,20 +112,46 @@ import grad
############################
a = core.ones((2, 2))
b = core.ones((2, 2))
# a = core.ones((2, 2))
# b = core.ones((2, 2))
# def f():
# return (a + b) + (a + b)
# r = core.build(f)
# g = grad.grad(r, a)
# core.print_graph(g)
# print [id(input) for input in g.owner.inputs]
# print gof.literals_db
# core.print_graph(r)
def f():
return (a + b) + (a + b)
r = core.build(f)
class sigmoid(core.omega_op):
def impl(x):
return 1.0 / (1.0 + numpy.exp(-x))
def grad(x, gz):
return gz * sigmoid(x) * (1 - sigmoid(x))
g = grad.grad(r, a)
core.print_graph(g)
core.print_graph(r)
def autoassociator(w, x):
forward = sigmoid(core.dot(w.T, sigmoid(core.dot(w, x))))
w -= 0.01 * grad.grad(core.sqr(x - forward(x)), w)
w = core.input(numpy.random.rand())
x = core.input(numpy.random.rand())
for i in xrange(10000):
autoassociator(w, dataset.next())
# 1 = mul(mul(neg(scal(mul(sub(0.736213102665, sigmoid(*3)), 1.0), 2.0)), sigmoid(*3)), sub(1, sigmoid(*3)))
# 2 = transpose(0.11474051836)
# 3 = dot(*2, *5)
# 4 = dot(0.11474051836, 0.736213102665)
# 5 = sigmoid(*4)
# add(transpose(dot(*1, transpose(*5))), dot(mul(mul(dot(transpose(*2), *1), sigmoid(*4)), sub(1, sigmoid(*4))), transpose(0.736213102665)))
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论