Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class LinearRegression:
- def get_loss(self, preds, y):
- """
- @param preds: предсказания модели
- @param y: истиные значения
- @return mse: значение MSE на переданных данных
- """
- # возьмите средний квадрат ошибки по всем выходным переменным
- # то есть сумму квадратов ошибки надо поделить на количество_элементов * количество_таргетов
- return torch.sum((y-preds)**2)/(y.shape[0]*y.shape[1])#YOUR_CODE
- def init_weights(self, input_size, output_size):
- """
- Инициализирует параметры модели
- W - матрица размерности (input_size, output_size)
- инициализируется рандомными числами из
- нормального распределения (np.random.normal)
- со средним 0 и стандартным отклонением 0.01
- b - вектор размерности (1, output_size)
- инициализируется нулями
- """
- torch.manual_seed(0)
- np.random.seed(0)
- self.W = np.random.normal(size=(input_size, output_size), scale=0.01)#YOUR_CODE
- self.W = np.vstack((self.W, np.zeros((1, output_size))))
- self.W = torch.from_numpy(self.W)
- self.W.requires_grad = True
- def fit(self, X, y, num_epochs=1000, lr=0.001):
- """
- Обучение модели линейной регрессии методом градиентного спуска
- @param X: размерности (num_samples, input_shape)
- @param y: размерности (num_samples, output_shape)
- @param num_epochs: количество итераций градиентного спуска
- @param lr: шаг градиентного спуска
- @return metrics: вектор значений MSE на каждом шаге градиентного
- спуска.
- """
- self.init_weights(X.shape[1], y.shape[1])
- metrics = []
- for _ in range(num_epochs):
- preds = self.predict(X)
- self.get_loss(preds, y).backward()
- with torch.no_grad():
- self.W -= lr*self.W.grad
- # сделайте вычисления градиентов c помощью Pytorch и обновите веса
- # осторожнее, оберните вычитание градиента в
- # with torch.no_grad():
- # #some code
- # иначе во время прибавления градиента к переменной создастся очень много нод в дереве операций
- # и ваши модели в будущем будут падать от нехватки памяти
- #YOUR_CODE
- #YOUR_CODE
- #YOUR_CODE
- #YOUR_CODE
- self.W.grad.data.zero_()
- metrics.append(self.get_loss(preds, y).data)
- return metrics
- def predict(self, X):
- """
- Думаю, тут все понятно. Сделайте свои предсказания :)
- """
- nnX = X.numpy()
- nnX = np.hstack((nnX, (np.ones((nnX.shape[0], 1)))))
- nnX = torch.from_numpy(nnX)
- return [email protected]#YOUR_CODE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement