Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.30 KB | None | 0 0
  1. class LinearRegression:
  2.     def get_loss(self, preds, y):
  3.         """
  4.            @param preds: предсказания модели
  5.            @param y: истиные значения
  6.            @return mse: значение MSE на переданных данных
  7.        """
  8.         # возьмите средний квадрат ошибки по всем выходным переменным
  9.         # то есть сумму квадратов ошибки надо поделить на количество_элементов * количество_таргетов
  10.         return np.mean((preds - y)**2)
  11.    
  12.     def init_weights(self, input_size, output_size):
  13.         """
  14.            Инициализирует параметры модели
  15.            W - матрица размерности (input_size, output_size)
  16.            инициализируется рандомными числами из
  17.            uniform распределения (torch.rand())
  18.            b - вектор размерности (1, output_size)
  19.            инициализируется нулями
  20.        """
  21.         torch.manual_seed(0) #необходимо для воспроизводимости результатов
  22.         self.W = torch.rand(input_size, output_size,  requires_grad=True)
  23.         self.b = torch.zeros(1, output_size, requires_grad=True)
  24.  
  25.     def fit(self, X, y, num_epochs=1000, lr=0.001):
  26.         """
  27.            Обучение модели линейной регрессии методом градиентного спуска
  28.            @param X: размерности (num_samples, input_shape)
  29.            @param y: размерности (num_samples, output_shape)
  30.            @param num_epochs: количество итераций градиентного спуска
  31.            @param lr: шаг градиентного спуска
  32.            @return metrics: вектор значений MSE на каждом шаге градиентного
  33.            спуска.
  34.        """
  35.         self.init_weights(X.shape[1], y.shape[1])
  36.         metrics = []
  37.         for _ in range(num_epochs):
  38.  
  39.             # сделайте вычисления градиентов c помощью Pytorch и обновите веса
  40.             # осторожнее, оберните вычитание градиента в
  41. #                 with torch.no_grad():
  42. #                     #some code
  43.             # иначе во время прибавления градиента к переменной создастся очень много нод в дереве операций
  44.             # и ваши модели в будущем будут падать от нехватки памяти
  45.             preds = self.predict(X)
  46.             loss = self.get_loss(preds, y)
  47.             with torch.no_grad():
  48.               loss.backward()
  49.             self.W -= lr * self.W.grad
  50.             self.b -= lr * self.b.grad
  51.             self.W.zero_grad()
  52.             self.b.zero_grad()
  53.             metrics.append(self.get_loss(preds, y).data)
  54.         return metrics
  55.  
  56.     def predict(self, X):
  57.         """
  58.            Думаю, тут все понятно. Сделайте свои предсказания :)
  59.        """
  60.         return X @ self.W + self.b
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement