Untitled
unknown
plain_text
2 years ago
2.9 kB
17
Indexable
def relu(x): return # ВАШ КОД ЗДЕСЬ (подсказка, воспользуйтесь np.maximum()) def relu_derivative(x): return x>0 class Perceptron_ReLU: def __init__(self, w=None, b=0): self.w = w self.b = b def activate(self, x): return relu(x) def forward(self, X): n = X.shape[0] y_pred = # ВАШ КОД ЗДЕСЬ (можно вставить из семинара) y_pred = # ВАШ КОД ЗДЕСЬ (можно вставить из семинара) return y_pred.reshape(-1,1) def backward(self, X, y, y_pred, learning_rate=0.005): n = len(y) y = np.array(y).reshape(-1, 1) dw = # ВАШ КОД ЗДЕСЬ (по аналогии с сигмоидой, только производная уже для relu) db = # ВАШ КОД ЗДЕСЬ (по аналогии с сигмоидой, только производная уже для relu) self.w -= learning_rate*dw self.b -= learning_rate*db def fit(self, X, y, num_epochs=5000): self.w = np.zeros((X.shape[1], 1)) # вектор весов self.b = 0 # смещение (число) loss_values = [] # значения функции потерь на различных итерациях обновления весов for i in range(num_epochs): y_pred = self.forward(X) loss_values.append(mse_loss(y_pred,y)) self.backward(X,y,y_pred) return np.array(loss_values) perceptron = Perceptron_ReLU() losses = perceptron.fit(X,y) plt.figure(figsize=(10, 8)) plt.plot(# ВАШ КОД ЗДЕСЬ) plt.title('График функция потерь', fontsize=15) plt.xlabel('Номер итерации', fontsize=14) plt.ylabel('$Loss(\hat{y}, y)$', fontsize=14) plt.show() #На графике прямая линия #веса изначально инициализированы нулями! Поэтому обучение и не происходит. #Заинициализируем их случайными числами (не забудьте закомментировать в классе инициализацию нулями): perceptron = Perceptron_ReLU(# ВАШ КОД ЗДЕСЬ) losses = perceptron.fit(X, y, num_epochs=5000) plt.figure(figsize=(10, 8)) plt.plot(losses.reshape(-1,)) plt.title('График функция потерь', fontsize=15) plt.xlabel('Номер итерации', fontsize=14) plt.ylabel('$Loss(\hat{y}, y)$', fontsize=14) plt.show() #должен получиться график с кривой - на 1500 шагу обучения падает в минимальное значение и к 5000 шагу уже идет по прямой
Editor is loading...