Advertisement
Guest User

Untitled

a guest
May 25th, 2021
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.23 KB | None | 0 0
  1. from math import *
  2. import random
  3.  
  4. def sig(x):
  5.     return 1 / (1 + exp(-x))
  6.  
  7. def sig_prime(x): # x already sigmoided
  8.     return x * (1 - x)
  9.  
  10. def tanh_prime(x): # x already tanhed
  11.     return 1 - x * x
  12.  
  13. class Network:
  14.     def __init__(self, input_size, hidden_size, alpha, mom):
  15.         self.hidden_size = hidden_size
  16.         self.input_size = input_size
  17.         self.input_weights = []
  18.         self.input_biases = []
  19.         self.output_weights = []
  20.         self.output_bias = random.uniform(-0.5,0.5)
  21.         self.input_momentum_weights = []
  22.         self.output_momentum_weights = []
  23.         self.alpha = alpha
  24.         self.mom = mom
  25.         for i in range(hidden_size):
  26.             input_weight_list = []
  27.             input_momentum_list = []
  28.            
  29.             for i in range(input_size):
  30.                 input_weight_list.append(random.uniform(-0.5,0.5))
  31.            
  32.             for i in range(input_size):
  33.                 input_momentum_list.append(0)
  34.                
  35.             self.input_weights.append(input_weight_list)
  36.             self.input_biases.append(random.uniform(-0.5,0.5))
  37.             self.output_weights.append(random.uniform(-0.5,0.5))
  38.             self.input_momentum_weights.append(input_momentum_list)
  39.             self.output_momentum_weights.append(0)
  40.  
  41.     def forward(self, inputs):
  42.         h = [] # hidden node value
  43.         for i in range(len(self.input_weights)):
  44.             result = self.input_biases[i]
  45.             for j in range(self.input_size):
  46.                 result += self.input_weights[i][j]*inputs[j]
  47.             h.append(sig(result))
  48.         o = 0 # output value
  49.         for i in range(len(self.output_weights)):
  50.             o += self.output_weights[i] * h[i]
  51.         o += self.output_bias
  52.         return tanh(o)
  53.  
  54.     def learn(self,inputs,t):
  55.         h = [] # hidden node value
  56.         for i in range(len(self.input_weights)):
  57.             result = self.input_biases[i]
  58.             for j in range(self.input_size):
  59.                 result += self.input_weights[i][j]*inputs[j]
  60.             h.append(sig(result))
  61.         o = 0 # output value
  62.         for i in range(len(self.output_weights)):
  63.             o += self.output_weights[i] * h[i]
  64.         o += self.output_bias
  65.         o = tanh(o)
  66.      
  67.         e = t - o
  68.         do = e * tanh_prime(o)
  69.      
  70.         eh = []
  71.         for i in range(len(self.output_weights)):
  72.             eh.append(do * self.output_weights[i])
  73.      
  74.         dh = []
  75.         for i in range(len(self.output_weights)):
  76.             dh.append(eh[i] * sig_prime(h[i]))
  77.      
  78.         for i in range(len(self.output_weights)):
  79.             self.output_momentum_weights[i] = self.mom * self.output_momentum_weights[i] + self.alpha * h[i] * do
  80.             self.output_weights[i] += self.output_momentum_weights[i]
  81.         self.output_bias += self.alpha * do
  82.      
  83.         for i in range(len(self.input_weights)):
  84.             for j in range(self.input_size):
  85.                 self.input_momentum_weights[i][j] = self.mom * self.input_momentum_weights[i][j] + self.alpha * inputs[j] * dh[i]
  86.             for j in range(self.input_size):
  87.                 self.input_weights[i][j] += self.input_momentum_weights[i][j]
  88.             self.input_biases[i] += self.alpha * dh[i]
  89.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement