Advertisement
Guest User

Untitled

a guest
Nov 8th, 2019
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 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 torch.sum((y-preds)**2)/(y.shape[0]*y.shape[1])#YOUR_CODE
  11.  
  12. def init_weights(self, input_size, output_size):
  13. """
  14. Инициализирует параметры модели
  15. W - матрица размерности (input_size, output_size)
  16. инициализируется рандомными числами из
  17. нормального распределения (np.random.normal)
  18. со средним 0 и стандартным отклонением 0.01
  19. b - вектор размерности (1, output_size)
  20. инициализируется нулями
  21. """
  22. torch.manual_seed(0)
  23. np.random.seed(0)
  24. self.W = np.random.normal(size=(input_size, output_size), scale=0.01)#YOUR_CODE
  25. self.W = np.vstack((self.W, np.zeros((1, output_size))))
  26. self.W = torch.from_numpy(self.W)
  27. self.W.requires_grad = True
  28.  
  29. def fit(self, X, y, num_epochs=1000, lr=0.001):
  30. """
  31. Обучение модели линейной регрессии методом градиентного спуска
  32. @param X: размерности (num_samples, input_shape)
  33. @param y: размерности (num_samples, output_shape)
  34. @param num_epochs: количество итераций градиентного спуска
  35. @param lr: шаг градиентного спуска
  36. @return metrics: вектор значений MSE на каждом шаге градиентного
  37. спуска.
  38. """
  39. self.init_weights(X.shape[1], y.shape[1])
  40. metrics = []
  41. for _ in range(num_epochs):
  42. preds = self.predict(X)
  43. self.get_loss(preds, y).backward()
  44. with torch.no_grad():
  45. self.W -= lr*self.W.grad
  46. # сделайте вычисления градиентов c помощью Pytorch и обновите веса
  47. # осторожнее, оберните вычитание градиента в
  48. # with torch.no_grad():
  49. # #some code
  50. # иначе во время прибавления градиента к переменной создастся очень много нод в дереве операций
  51. # и ваши модели в будущем будут падать от нехватки памяти
  52. #YOUR_CODE
  53. #YOUR_CODE
  54. #YOUR_CODE
  55. #YOUR_CODE
  56. self.W.grad.data.zero_()
  57. metrics.append(self.get_loss(preds, y).data)
  58. return metrics
  59.  
  60. def predict(self, X):
  61. """
  62. Думаю, тут все понятно. Сделайте свои предсказания :)
  63. """
  64. nnX = X.numpy()
  65. nnX = np.hstack((nnX, (np.ones((nnX.shape[0], 1)))))
  66. nnX = torch.from_numpy(nnX)
  67. return [email protected]#YOUR_CODE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement