Guest User

Untitled

a guest
Oct 10th, 2014
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.05 KB | None | 0 0
  1. ############################################base.py###############################################
  2. import numpy as np
  3.  
  4.  
  5.  
  6. class BpropComponent(object):
  7.  
  8. __slots__ = [
  9. "inp",
  10. "out",
  11. "inp_dim",
  12. "out_dim",
  13. "grads",
  14. "W",
  15. "activateparams", # tuple!
  16. "ETA",
  17. "bias", # number!
  18. ]
  19.  
  20. def __init__(self, inp_dim, out_dim, bias, **kwargs):
  21.  
  22. self.activateparams = (1.7159, 2./3) # default params for tanh only
  23. self.ETA = .2
  24.  
  25. self.inp_dim = inp_dim
  26. self.out_dim = out_dim
  27. self.bias = bias
  28.  
  29. for key in kwargs.keys():
  30. if key in self.__slots__:
  31. object.__setattr__(self, key, kwargs[key])
  32.  
  33. def forward(self, inp):
  34. print "ABSTRACT, override this"
  35. return
  36.  
  37. def backward(self):
  38. print "ABSTRACT, override this"
  39. return
  40.  
  41. # default activate function is tanh sigmoid
  42. def FI(self, data):
  43. return self.activateparams[0] * np.tanh(self.activateparams[1] * data)
  44.  
  45. def dFI(self):
  46. return (self.activateparams[0]*self.activateparams[1]) * (1. - self.out) * (1. + self.out)
  47.  
  48.  
  49. class BpropLayer(BpropComponent):
  50.  
  51. __slots__ = BpropComponent.__slots__ + ["size", "nextlayer"]
  52.  
  53. def __init__(self, inp_dim, out_dim, size, bias, **kwargs):
  54. self.nextlayer = None
  55. BpropComponent.__init__(self, inp_dim, out_dim, bias, **kwargs)
  56. self.size = size
  57.  
  58. def bind(self, otherlayer):
  59. print "ABSTRACT, override this"
  60. return
  61.  
  62. ###################################################fullcon.py###############################################################
  63. import numpy as np
  64. import logging
  65.  
  66. from base import BpropLayer
  67.  
  68.  
  69.  
  70. class TanhFullConLayer(BpropLayer):
  71.  
  72. def __init__(self, size, inp_dim, bias, **kwargs):
  73.  
  74. out_dim = 1 # for simple backpropagation neuron
  75. BpropLayer.__init__(self, inp_dim, out_dim, size, bias, **kwargs)
  76.  
  77. self.W = np.random.normal(0, .01, (self.size, self.inp_dim))
  78.  
  79. def bind(self, otherlayer):
  80. assert isinstance(otherlayer, BpropLayer)
  81. assert self.size == otherlayer.inp_dim
  82. self.nextlayer = otherlayer
  83.  
  84. def forward(self, data):
  85. assert len(data) == self.inp_dim
  86. self.inp = data
  87. Sum = np.array(map(np.sum, self.W[:, :] * data[:])) + self.bias
  88. self.out = self.FI(Sum)
  89. return self.out
  90.  
  91. def backward(self, err): # ошибка скорее всего тут, т.к. градиенты становятся какими-то совсем огромными
  92. if err is None:
  93. assert self.nextlayer is not None
  94. err = map(np.sum, self.nextlayer.W[:, :].T * self.nextlayer.grads[:])
  95. err = np.array(err)
  96. self.grads = err * self.dFI()
  97. logging.debug(str(self) + ' localgradients: ' + str(self.grads))
  98. dw = self.ETA * np.outer(self.grads, self.inp)
  99. logging.debug('sum of deltaW on ' + str(self) +': ' + str(np.sum(dw)))
  100. self.W += dw
  101.  
  102. def __str__(self):
  103. if self.nextlayer:
  104. return 'hidden layer'
  105. else:
  106. return 'output layer'
  107.  
  108.  
  109. class MLP(object):
  110.  
  111. layers = []
  112.  
  113. def __init__(self, topology, LayerClass):
  114.  
  115. self.size = len(topology)
  116.  
  117. for layerparams in topology:
  118. self.layers.append(LayerClass(*layerparams[:-1], **layerparams[-1]))
  119.  
  120. for i in xrange(self.size-2, -1, -1):
  121. self.layers[i].bind(self.layers[i+1])
  122.  
  123. def forward(self, inp):
  124. for layer in self.layers:
  125. out = layer.forward(inp)
  126. inp = out
  127. return out
  128.  
  129. def backward(self, err):
  130. for i in xrange(self.size-1, -1, -1):
  131. self.layers[i].backward(err)
  132. err = None
  133.  
  134. def train(self, dataset):
  135. for data, target in dataset:
  136. recog = self.forward(data)
  137. err = target - recog
  138. logging.debug('Mean squared error: ' + str(np.sum(err**2)))
  139. self.backward(err)
  140.  
  141. def test(self, testset):
  142. for data, target in testset:
  143. recog = self.forward(data)
  144. logging.info('target: ' + str(target))
  145. logging.info('net out: ' + str(recog))
  146.  
  147.  
  148. if __name__=="__main__":
  149.  
  150. from mnistmanager import data_set
  151. import sys
  152.  
  153. data = data_set(100, "train", "vector", path=r"C:\Users\home\numpyprojects\ml")
  154. test = data_set(100, "test", "vector", path=r"C:\Users\home\numpyprojects\ml")
  155.  
  156. topology = [
  157. (1000, 28*28, {'bias':0, 'ETA': .1}),
  158. (10, 1000, {'bias': 0, 'ETA': .1})
  159. ]
  160.  
  161. level = logging.INFO
  162. filepath = "ml/logs/mlp.log"
  163.  
  164. if '-d' in sys.argv:
  165. level = logging.DEBUG
  166. index = sys.argv.index('-d')
  167. if len(sys.argv) > index+1:
  168. filepath = sys.argv[index+1]
  169.  
  170. logging.basicConfig(filename=filepath, level=level, filemode='w')
  171.  
  172. net = MLP(topology, TanhFullConLayer)
  173.  
  174. net.train(data)
  175. net.test(test)
Advertisement
Add Comment
Please, Sign In to add comment