Guest User

Untitled

a guest
Aug 19th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.52 KB | None | 0 0
  1. import numpy as np
  2. from numpy.random import *
  3. import pickle
  4.  
  5. class FNeuron:
  6.     friends = np.array([])
  7.     w = np.array([])
  8.     cur_sum = 0.0
  9.     storage = 0.0
  10. #------------------------------    
  11.     def __init__(self,netSize):
  12.         self.w = np.zeros(netSize)
  13.         self.friends = np.zeros(netSize)
  14.         self.cur_sum = 0.0
  15. #------------------------------        
  16.     def AddLink(self,j):
  17.         self.w[j] = random_sample()
  18.         self.friends[j] = True
  19. #---------------------------------------------------------------------------------------
  20. class NeuralNet:
  21.     net = np.array([])
  22.     delta = np.array([])
  23.     I,N,K = 0, 0, 0
  24.     netSize = 0
  25.    
  26.     speed,eps = 0, 0
  27.     feedforward_prob = 0.75
  28.     feedback_prob = 0.4
  29.     selfconn_prob = 0.3
  30.     new_link_prob = 0.0005
  31. #------------------------------    
  32.     def __init__(self,I,N,K,speed,eps):
  33.         self.I = I
  34.         self.N = N
  35.         self.K = K
  36.        
  37.         self.netSize = I + N + K
  38.         self.net = []
  39.         self.speed = speed
  40.         self.eps = eps
  41.        
  42.         for i in range(self.netSize):
  43.             temp = FNeuron(self.netSize)
  44.             self.net.append(temp)
  45.         self.delta = np.zeros(self.netSize)
  46.         self.GenerateNet()
  47. #------------------------------        
  48.     def GenerateNet(self):
  49.         for i in range(self.I + self.N):
  50.             for j in range(self.netSize):
  51.                 p = random_sample()
  52.                 if (p <= self.feedforward_prob and i < j):
  53.                     self.net[i].AddLink(j)
  54.        
  55.         i = self.I + self.N + self.K - 1
  56.         while(i >= 0):
  57.             for j in range(self.netSize):
  58.                 p = random_sample()
  59.                 if(p <= self.feedback_prob and i > j):
  60.                     self.net[i].AddLink(j)
  61.             i -= 1
  62.            
  63.         i = self.I
  64.         j = self.I
  65.         while(i < self.I + self.N):
  66.             p = random_sample()
  67.             if(p <= self.selfconn_prob and i == j):
  68.                 self.net[i].AddLink(j)
  69.             i+=1
  70.             j+=1
  71. #------------------------------
  72.     def Sigmoid(self,x):
  73.         return 1 / (1 + np.exp(-x))
  74. #------------------------------
  75.     def Compute(self, vector):
  76.         for i in range(self.netSize):
  77.             self.net[i].cur_sum = 0.0
  78.            
  79.         for i in range(len(vector)):
  80.             self.net[i].cur_sum = vector[i]
  81.            
  82.         i = self.I
  83.         while(i < self.netSize):
  84.             val = 0.0
  85.             tmp = 0.0
  86.             for j in range(self.netSize):
  87.                 if(self.net[j].friends[i] and j < i):
  88.                     val += self.net[j].w[i] * self.net[j].cur_sum
  89.                 elif(self.net[j].friends[i] and j >= i):
  90.                     tmp += self.net[j].w[i] * self.net[j].cur_sum      
  91.            
  92.             self.net[i].cur_sum = self.Sigmoid(val) + self.net[i].storage
  93.             self.net[i].storage = tmp
  94.             i+=1
  95.            
  96.         result = np.zeros(self.K)
  97.         for i in range(self.K):
  98.             result[i] = self.net[self.I + self.N + i].cur_sum
  99.         return result
  100. #------------------------------      
  101.     def BackPropagation(self, vector, optim):
  102.         self.Compute(vector)
  103.        
  104.         for i in range(self.I + self.N, self.netSize):
  105.             yi = self.net[i].cur_sum
  106.             val = 0.0
  107.             for j in range(self.netSize):
  108.                 if(self.net[i].friends[j]):
  109.                     val += self.delta[j] * self.net[i].w[j]
  110.            
  111.             self.delta[i] = ((optim[i - self.I - self.N] - yi) + val) * yi * (1 - yi)
  112.            
  113.             for j in range(self.netSize):
  114.                 if(self.net[j].friends[i]):
  115.                     self.net[j].w[i] += self.speed * self.delta[i] * self.net[j].cur_sum
  116.        
  117.         i = self.I + self.N - 1
  118.         while(i >= self.I):
  119.             val = 0
  120.             for j in range(self.netSize):
  121.                 if(self.net[i].friends[j]):
  122.                     val += self.delta[j] * self.net[i].w[j]
  123.            
  124.             yi = self.net[i].cur_sum
  125.             self.delta[i] = val * yi * (1 - yi)
  126.            
  127.             for j in range(self.netSize):
  128.                 if(self.net[j].friends[i]):
  129.                     self.net[j].w[i] += self.speed * self.delta[i] * self.net[j].cur_sum
  130.            
  131.             i -= 1
  132. #------------------------------            
  133.     def IsLearned(self,y,opt):
  134.         max = 0.0
  135.         n = len(y[0])
  136.         for q in range(len(y)):
  137.             for i in range(n):
  138.                 if (abs(opt[q][i] - y[q][i]) > max):
  139.                     max = abs(opt[q][i] - y[q][i])
  140.         if(max >= self.eps):return False
  141.         return True
  142. #------------------------------
  143.     def Training(self, vectors, opt, maxIter=0, exit_on_epochs=False):
  144.         for i in range(len(self.delta)):
  145.             self.delta[i] = 0
  146.        
  147.         y = []
  148.        
  149.         for i in range(len(vectors)):
  150.             y.append(self.Compute(vectors[i]))
  151.        
  152.         cur_epoch = 0
  153.         while(not self.IsLearned(y,opt)):
  154.             cur_epoch += 1
  155.             if(cur_epoch >= maxIter and exit_on_epochs):
  156.                 return cur_epoch
  157.            
  158.             for i in range(len(vectors)):
  159.                 self.BackPropagation(vectors[i], opt[i])
  160.            
  161.             for i in range(len(vectors)):
  162.                 y[i] = self.Compute(vectors[i])
  163.            
  164.         self.New_Link()
  165.         return cur_epoch
  166. #------------------------------
  167.     def New_Link(self):
  168.         p = random_sample()
  169.         if(p <= self.new_link_prob):
  170.             for i in range(self.netSize):
  171.                 for j in range(self.netSize):
  172.                     if(not self.net[i].friends[j]):
  173.                         self.net[i].AddLink(j)
  174.                         return
  175. #------------------------------
  176.     def PrintLinks(self):
  177.         for i in range(self.netSize):
  178.             for j in range(self.netSize):
  179.                 if(self.net[i].friends[j]):
  180.                     print "1",
  181.                 else:
  182.                     print "0",
  183.             print
  184. #---------------------------------------------------------------------------------------
  185. net = NeuralNet(2, 10, 1, 0.3, 0.03)
  186. vec = []
  187. res = []
  188.  
  189. for i in  range(10):
  190.     for j in range(10):
  191.         vec.append([i,j])
  192.         if (i == j):
  193.             res.append([1])
  194.         else:
  195.             res.append([0])
  196.  
  197. a = net.Training(vec, res)
  198.  
  199. for i in range(15):
  200.     for j in range(15):
  201.         print i," ",j," ",
  202.         print net.Compute([i,j])
  203.  
  204. print a
  205. net.PrintLinks()
Add Comment
Please, Sign In to add comment