def get_error(deltas, sums, weights): """ compute error on the previous layer of network deltas - ndarray of shape (n, n_{l+1}) sums - ndarray of shape (n, n_l) weights - ndarray of shape (n_{l+1}, n_l) """ return np.mean(np.dot(deltas, weights) * sigmoid_prime(sums), axis=0).T
def summatory(self, input_matrix): """ Вычисляет результат сумматорной функции для каждого примера из input_matrix. input_matrix - матрица примеров размера (n, m), каждая строка - отдельный пример, n - количество примеров, m - количество переменных. Возвращает вектор значений сумматорной функции размера (n, 1). """ return np.dot(input_matrix, self.w)
def vectorized_forward_pass(self, input_matrix): """ Метод рассчитывает ответ перцептрона при предъявлении набора примеров input_matrix - матрица примеров размера (n, m), каждая строка - отдельный пример, n - количество примеров, m - количество переменных Возвращает вертикальный вектор размера (n, 1) с ответами перцептрона (элементы вектора - boolean или целые числа (0 или 1)) """ return np.dot(input_matrix, self.w) + self.b > 0
def sigmoid_prime(x): return sigmoid(x) * ( 1 - sigmoid(x) ) # производная сигмоидальной функции, работает и с числами, и с векторами (поэлементно) def get_error(deltas, sums, weights): """ compute error on the previous layer of network deltas - ndarray of shape (n, n_{l+1}) sums - ndarray of shape (n, n_l) weights - ndarray of shape (n_{l+1}, n_l) """ return np.mean(np.dot(deltas, weights) * sigmoid_prime(sums), axis=0).T deltas = np.random.random((2, 3)) sums = np.random.random((2, 4)) weights = np.random.random((3, 4)) print("deltas\n", deltas, "\n", "sums\n", sums, "\n", "weights\n", weights) a = np.dot(deltas, weights) print("deltas.dot(weights)\n", a) b = a * sigmoid_prime(sums) print("*sigmoid_prime(sums)\n", b) c = np.mean(b, axis=0) print("average delta\n", c) d = c.T print("delta = average transpose\n", d)
[0.8, 0.3, 0.6]]) # задаем матрицу весво между слоями 0 и 1 weights1_2 = np.array([[0.2, 0.4]]) # задаем матрицу весво между слоями 1 и 2 print("weights0_1\n", weights0_1, "\nweights1_2\n", weights1_2) b1 = np.zeros((2, 1)) b2 = np.zeros((1, 1)) input_a = np.array([[0], [1], [1]]) # задаем вектор входных активаций print("input_activations\n", input_a, input_a.shape) y = np.ones((1, 1)) # задаем вектор правильных ответов print("answer y\n", y, y.shape) # прямое распространение активаций z1 = np.dot(weights0_1, input_a) + b1 a1_1 = max(z1[0][0]) a1_2 = sigmoid(z1[1][0]) # вектор активаций 1го слоя (помежуточного) a1 = np.array([[a1_1], [a1_2]]) print("activations1\n", a1_1, a1.shape) z2 = np.dot(weights1_2, a1) + b2 a2 = sigmoid(z2) # вектор активаций 2го слоя (выходного) print("activations2\n", a2, a2.shape) # обратное распространение ошибки deltas2 = (a2 - y) * sigmoid_prime( z2) # считаем вектор дельт (ошибок) 2го слоя (выходного) print("deltas2\n", deltas2, deltas2.shape) deltas1_1 = weights1_2[0][0] * deltas2[0][0] * max_prime(z1[0][0]) deltas1_2 = weights1_2[0][1] * deltas2[0][0] * sigmoid_prime(