Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.47 KB | None | 0 0
  1. import numpy as np
  2.  
  3. def sigmoid (x):
  4.     return 1/(1 + np.exp(-x))
  5.  
  6. class NeuralNetwork:
  7.     def __init__(self, n_input, n_hidden, n_output,m,iters):
  8.         print("Входной слой: ",n_input," элемента")
  9.         print("Скрытый слой: ",n_hidden," элемента")
  10.         print("Выходной слой: ",n_output," элемента")
  11.         W1 = np.random.randn(n_hidden, n_input)
  12.         b1 = np.zeros((n_hidden, 1))
  13.         W2 = np.random.randn(n_output, n_hidden)
  14.         b2 = np.zeros((n_output, 1))
  15.         self.parameters = {
  16.             "weights1": W1,
  17.             "shifts1" : b1,
  18.             "weights2": W2,
  19.             "shifts2" : b2
  20.         }
  21.         print("Начальные веса между входным и скрытым:")
  22.         print(W1)
  23.         print("Начальные веса между скрытым и выходным:")
  24.         print(W2)
  25.         print("Коэффииенты сдвига скрытых элементов:")
  26.         print(b1)
  27.         print("Коэффициенты сдвига выходного элемента:")
  28.         print(b2)
  29.         self.learning_rate=0.3
  30.         print("норма обучения: ",self.learning_rate)
  31.         self.num_of_iters=iters
  32.         self.m = m
  33.  
  34.     def forward_prop(self,X):
  35.         W1 = self.parameters["weights1"]
  36.         b1 = self.parameters["shifts1"]
  37.         W2 = self.parameters["weights2"]
  38.         b2 = self.parameters["shifts2"]
  39.         Z1 = np.dot(W1, X) + b1
  40.         A1 = np.tanh(Z1)
  41.         Z2 = np.dot(W2, A1) + b2
  42.         A2 = sigmoid(Z2)
  43.         cache = {
  44.             "A1": A1,
  45.             "A2": A2
  46.         }
  47.         return A2, cache
  48.  
  49.     def calculate_cost(self,A2, Y):
  50.         cost = -np.sum(np.multiply(Y, np.log(A2)) +  np.multiply(1-Y, np.log(1-A2)))/m
  51.         cost = np.squeeze(cost)
  52.         return cost
  53.  
  54.     def backward_prop(self,X, Y, cache):
  55.         A1 = cache["A1"]
  56.         A2 = cache["A2"]
  57.         W2 = self.parameters["weights2"]
  58.         dZ2 = A2 - Y
  59.         dW2 = np.dot(dZ2, A1.T)/m
  60.         db2 = np.sum(dZ2, axis=1, keepdims=True)/m
  61.         dZ1 = np.multiply(np.dot(W2.T, dZ2), 1-np.power(A1, 2))
  62.         dW1 = np.dot(dZ1, X.T)/m
  63.         db1 = np.sum(dZ1, axis=1, keepdims=True)/m
  64.         grads = {
  65.             "dW1": dW1,
  66.             "db1": db1,
  67.             "dW2": dW2,
  68.             "db2": db2
  69.         }
  70.         return grads
  71.  
  72.     def update_parameters(self, grads):
  73.         W1 = self.parameters["weights1"]
  74.         b1 = self.parameters["shifts1"]
  75.         W2 = self.parameters["weights2"]
  76.         b2 = self.parameters["shifts2"]
  77.         dW1 = grads["dW1"]
  78.         db1 = grads["db1"]
  79.         dW2 = grads["dW2"]
  80.         db2 = grads["db2"]
  81.         W1 = W1 - self.learning_rate*dW1
  82.         b1 = b1 - self.learning_rate*db1
  83.         W2 = W2 - self.learning_rate*dW2
  84.         b2 = b2 - self.learning_rate*db2
  85.         new_parameters = {
  86.             "weights1": W1,
  87.             "weights2": W2,
  88.             "shifts1" : b1,
  89.             "shifts2" : b2
  90.         }
  91.         self.parameters=new_parameters
  92.  
  93.  
  94.     def train(self,X, Y):
  95.         print("Начинаем обучаться на данных")
  96.         print(X)
  97.         print(Y)
  98.         for i in range(0, self.num_of_iters+1):
  99.             a2, cache = self.forward_prop(X)
  100.             cost = self.calculate_cost(a2, Y)
  101.             grads = self.backward_prop(X, Y, cache)
  102.             parameters = self.update_parameters(grads)
  103.             if(i%200 == 0):
  104.                 print('Функция стоимости после итерации# {:d}: {:f}'.format(i, cost))
  105.         print("Параметры после обучения")
  106.         print("Начальные веса между входным и скрытым:")
  107.         print(self.parameters["weights1"])
  108.         print("Начальные веса между скрытым и выходным:")
  109.         print(self.parameters["weights2"])
  110.         print("Коэфициенты сдвига скрытых элементов:")
  111.         print(self.parameters["shifts1"])
  112.         print("Коэфициенты сдвига выходного элемента:")
  113.         print(self.parameters["shifts2"])
  114.  
  115.  
  116.     def getResult(self,X):
  117.         a2, cache = self.forward_prop(X)
  118.         yhat = a2
  119.         yhat = np.squeeze(yhat)
  120.         if(yhat >= 0.5):
  121.             y_predict = 1
  122.         else:
  123.             y_predict = 0
  124.      
  125.         return y_predict
  126.  
  127. def test(x1,x2,n):
  128.     X_test = np.array([[x1], [x2]])
  129.     y_predict = n.getResult(X_test)
  130.     print('На вход подано ({:d}, {:d}) на выходе получили {:d}'.format(
  131.         X_test[0][0], X_test[1][0], y_predict))
  132.  
  133.  
  134. def getTrain(operation):
  135.     if(operation=='AND'):
  136.         X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
  137.         Y = np.array([[0, 0, 0, 1]])
  138.         m = X.shape[1]
  139.         return X,Y,m        
  140.     if(operation=='OR'):
  141.         X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
  142.         Y = np.array([[0, 1, 1, 1]])
  143.         m = X.shape[1]
  144.         return X,Y,m
  145.     if(operation=='XOR'):
  146.         X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
  147.         Y = np.array([[0, 1, 1, 0]])
  148.         m = X.shape[1]
  149.         return X,Y,m
  150.  
  151. OPERATION = 'XOR'
  152. print("Тернируемся для операции ",OPERATION)
  153. np.random.seed(2)
  154. X,Y,m = getTrain(OPERATION)
  155. n = NeuralNetwork(2,2,1,m,1000)
  156. n.train(X,Y)
  157. print("Проверяем результат обучения")
  158. test(1,0,n)
  159. test(0,0,n)
  160. test(0,1,n)
  161. test(1,1,n)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement