ReLU нейрон в питоне - PullRequest
       52

ReLU нейрон в питоне

0 голосов
/ 02 апреля 2019

Я пытаюсь реализовать один нейрон ReLU в python без модулей для ANN. Я немного запутался в поиске производных функции потерь с активацией ReLU.

Я пытался найти это в Google, но мне удалось найти реализацию целой сети, поэтому это не помогло.

Так вот мой код: (обратите внимание, что у нас есть отдельные переменные для смещений и весов)

def relu(x):
    return np.maximum(x, 0)

def relu_derivative(y):
    return 1. * (y > 0)

class NeuronReLU:
    def __init__(self, w=None, b=0):
        self.w = w
        self.b = b

    def activate(self, x):
        return relu(np.dot(x, self.w) + self.b)

    def forward_pass(self, x):
        n = x.shape[0]
        y_pred = np.zeros((n, 1))  

        y_pred = self.activate(x)
        return y_pred.reshape(-1, 1)

    def backward_pass(self, x, y, y_pred, learning_rate=0.005):
        n = len(y)
        y = np.array(y).reshape(-1, 1)

        delta_w = ...
        delta_b = ...

        self.w -= learning_rate * delta_w
        self.b -= learning_rate * delta_b

    def fit(self, x, y, num_epochs=300):
        if self.w is None:
            self.w = np.zeros((x.shape[1], 1)) 
            self.b = 0 
        Loss_values = []  

        for i in range(num_epochs):
            y_pred = self.forward_pass(x)
            Loss_values.append(Loss(y_pred, y))
            self.backward_pass(x, y, y_pred)

        return Loss_values

Так что проблема в том, что я не знаю, как рассчитать частные производные. У меня есть 2 варианта:

1-й (без использования relu () и relu_derivative ()):

if np.dot(x, w) + b > 0: 
    delta_w = (np.dot(X.T, (y_pred - y)) / n)
    delta_b = np.mean(y_pred - y)
else: 
    delta_w = 0
    delta_b = 0

Нужно ли проверять np.dot (x, w) + b> 0 поэлементно или использовать .all ()?

2-й (с использованием relu () и relu_derivative ()):

delta_w = (relu_derivative(y_pred) * (y_pred - y))
delta_b = ?

На мой взгляд, наша функция relu_derivative () является функцией одной переменной, поэтому она не имеет частных производных. А также relu_derivative (y_pred) и (y_pred - y) являются векторами, поэтому delta_w имеет другое измерение.

...