Advertisement
Guest User

Untitled

a guest
Aug 14th, 2019
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. import math
  3.  
  4. class Lianer:
  5.     def __init__(self, typeN, matrix=[[0, 0]], bias=[0], func=lambda x: x):
  6.         self.typeN = typeN
  7.         if (typeN == 'linear'):
  8.             if (len(bias) != len(matrix)):
  9.                 print("Error")
  10.             for i in range(len(matrix)):
  11.                 if (len(matrix[0]) != len(matrix[i])):
  12.                     print("Error")
  13.             self.matrix = matrix
  14.             self.bias = bias
  15.         else:
  16.             self.func = func
  17.     def typeN(self):
  18.         return self.typeN
  19.  
  20.     def matrix(self):
  21.         return self.matrix
  22.  
  23.     def bias(self):
  24.         return self.bias
  25.  
  26.     def func(self, h=7):
  27.         return self.func(h)
  28.  
  29.     def printLia(self):
  30.         print("Тип: %s" % self.typeN)
  31.         if (self.typeN == 'linear'):
  32.             print("Веса: %s" % self.matrix)
  33.             print("Смещение: %s" % self.bias)
  34.         else:
  35.             print("Функция: %s" % self.func)
  36.  
  37. def matrixmult(m1, m2, b):
  38.     s = 0
  39.     m3 = []
  40.     if len(m2[0]) != len(m1):
  41.         print("Матрицы не могут быть перемножены")
  42.     else:
  43.         c1 = len(m1)
  44.         c2 = len(m2)
  45.         for j in range(c2):
  46.             for i in range(c1):
  47.                 s += m1[i] * m2[j][i]
  48.             s -= b[j]
  49.             m3.append(s)
  50.             s = 0
  51.     return m3
  52.  
  53. class make_feedforward_nn:
  54.     def __init__(self, input_count, output_count):
  55.         self.input_count = input_count
  56.         self.output_count = output_count
  57.         self.lian = [Lianer]
  58.  
  59.     def add_layer(self, typeN, matrix=[[0, 0]], bias=[0], func=lambda x: x):
  60.         linr = Lianer(typeN, matrix, bias, func)
  61.         self.lian.append(linr)
  62.  
  63.     def check_dimensions(self):
  64.         inp = self.input_count
  65.         for i in range(len(self.lian)):
  66.             if (self.lian[i].typeN== 'linear'):
  67.                     if(inp != len(self.lian[i].matrix[0])):
  68.                         print("Error")
  69.                     else:
  70.                         inp = len(self.lian[i].bias)
  71.  
  72.     def __call__(self, x1, x2):
  73.         x = [x1, x2]
  74.         for i in range(len(self.lian)):
  75.             if (self.lian[i].typeN == 'linear'):
  76.                 x = matrixmult(x, self.lian[i].matrix, self.lian[i].bias)
  77.             else:
  78.                 #fun = (self.lian[i].func)
  79.                 for j in range(len(x)):
  80.                     h = x[j]
  81.                     x[j] = self.lian[i].func(h)
  82.         sum = 0
  83.         for j in range(len(x)):
  84.             sum += x[j]
  85.         return sum
  86.  
  87. nn = make_feedforward_nn(
  88.     input_count=2, # число входных нейронов
  89.     output_count=1 # число выходных нейронов
  90. )
  91.  
  92. nn.add_layer(
  93.     'linear',
  94.     matrix=[
  95.         [0.3, -0.1],
  96.         [0.4, 0],
  97.         [0.5, 1],
  98.         [-0.23, -0.3],
  99.     ],
  100.     bias=[0, 0, 0, 0.3]
  101. ) # Обрати внимание, что этот слой отображает исходный 2-хмерный вектор в 4-хмерный
  102.  
  103. nn.add_layer(
  104.     'function',
  105.     func=lambda x: 1.0 / (1 + math.exp(-x)) # передаем сигмоиду
  106. ) # Обрати внимание, что этот слой не меняет размерности вектора
  107.  
  108.  
  109. nn.add_layer(
  110.     'linear',
  111.     matrix=[
  112.         [0.3, -0.0, 0, 0.3],
  113.         [0.4, 0, 0.2, 0.7],
  114.     ],
  115.     bias=[0, 0.1]
  116. ) # Обрати внимание, что этот слой отображает исходный 4-хмерный вектор в 2-хмерный
  117.  
  118. nn.add_layer(
  119.     'function',
  120.     func=lambda x: 1.0 / (1 + math.exp(-x)) # передаем сигмоиду
  121. ) # Обрати внимание, что этот слой не меняет размерности вектора
  122.  
  123. nn.check_dimensions() # внутри проверка того, что нейросеть
  124.                       #соответствует объявлению (2 числа на входе, 1 на выходе)
  125.  
  126.  
  127. result = nn(0.4, 0.1)
  128. print(result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement