Advertisement
Ilya_Bykonya

Untitled

Oct 12th, 2022
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. # -*- coding: cp1251 -*-
  2.  
  3. #Задания 1 и 2
  4. #Нужная функция-активатор подставляется в конструктор нейронной сети
  5. #Да здравствует ООП и инкапсуляция! Нет сишному подходу с кучей несявязанных данных!
  6. import typing
  7. import math
  8.  
  9.  
  10.  
  11. class AbstractNeuronInput:
  12. def calculate(self) -> float:
  13. pass
  14.  
  15. #Decorator pattern
  16. #Взвешенный вход нейросети
  17. class NeuronWeightedInput(AbstractNeuronInput):
  18. __weight: float
  19. __input: AbstractNeuronInput
  20.  
  21. def __init__(self, weight: float, input: AbstractNeuronInput):
  22. self.__weight = weight
  23. self.__input = input
  24.  
  25. def calculate(self) -> float:
  26. return self.__weight * self.__input.calculate()
  27.  
  28. #Первичный вход нейросети, получающий
  29. #числа на вход
  30. class PrimaryNeuronInput(AbstractNeuronInput):
  31. __value: float = 0.0
  32.  
  33. def upgrade(self, value: float) -> None:
  34. self.__value = value;
  35.  
  36. def calculate(self) -> float:
  37. return self.__value
  38.  
  39.  
  40. InputsList = typing.List[NeuronWeightedInput]
  41. PrimaryInputsList = typing.List[PrimaryNeuronInput]
  42. ActivatorFunction = typing.Callable[[float], float]
  43. #Каждый нейрон может стать входом для другого нейрона
  44. class Neuron(AbstractNeuronInput):
  45. __activator: ActivatorFunction
  46. __inputs: InputsList
  47. __bias: float
  48.  
  49. def __init__(self, bias: float, activator: ActivatorFunction, inputs: InputsList):
  50. self.__activator = activator
  51. self.__inputs = inputs
  52. self.__bias = bias
  53.  
  54. def calculate(self) -> float:
  55. return self.__activator(sum(input.calculate() for input in self.__inputs) + self.__bias)
  56.  
  57.  
  58. #Строится нейросеть из нейронов
  59. #При этом любая нейросеть может
  60. #быть частью другой нейросети
  61. class CustomNeuralNetwork(AbstractNeuronInput):
  62. __inputs: PrimaryInputsList = []
  63. __root: AbstractNeuronInput
  64.  
  65. def __init__(self, activator: ActivatorFunction) -> None:
  66. input_1 = PrimaryNeuronInput()
  67. input_2 = PrimaryNeuronInput()
  68.  
  69. internal_1 = Neuron(0, activator, [
  70. NeuronWeightedInput(0, input_1),
  71. NeuronWeightedInput(1, input_2),
  72. ])
  73. internal_2 = Neuron(0, activator, [
  74. NeuronWeightedInput(0, input_1),
  75. NeuronWeightedInput(1, input_2),
  76. ])
  77.  
  78. self.__root = Neuron(0, activator, [
  79. NeuronWeightedInput(0, internal_1),
  80. NeuronWeightedInput(1, internal_2),
  81. ])
  82.  
  83. self.__inputs.append(input_1)
  84. self.__inputs.append(input_2)
  85.  
  86. def calculate(self) -> float:
  87. return self.__root.calculate()
  88.  
  89. #Обновляем только в случае, если
  90. #нам прислали на вход столько же
  91. #значений, сколько входов у нейросети
  92. def upgrade(self, values: typing.List[float]):
  93. if(len(self.__inputs) == len(values)):
  94. for index in range(len(values)):
  95. self.__inputs[index].upgrade(values[index])
  96.  
  97. return self
  98.  
  99.  
  100.  
  101. def sigmoid(x: float) -> float:
  102. return 1 / (1 + math.exp(-x))
  103. def relu(x: float) -> float:
  104. return max(x, 0)
  105.  
  106. #Можно подставить любую функцию-активатор
  107. #activator = math.tanh
  108. #activator = sigmoid
  109. activator = relu
  110.  
  111. network = CustomNeuralNetwork(activator)
  112. print(network.upgrade([2, 3]).calculate())
  113.  
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement