Advertisement
MARSHAL327

LinearClassifier

Dec 26th, 2023
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.96 KB | None | 0 0
  1. from __future__ import print_function
  2.  
  3. import numpy as np
  4. from dlcv.classifiers.linear_svm import *
  5. from dlcv.classifiers.softmax import *
  6.  
  7. class LinearClassifier(object):
  8.  
  9. def __init__(self):
  10. self.W = None
  11.  
  12. def train(self, X, y, learning_rate=1e-3, reg=1e-5, num_iters=100,
  13. batch_size=200, verbose=False):
  14. """
  15. Обучение линейного классификатора на основе стохастического градиентного спуска.
  16.  
  17. Входы:
  18. - X: numpy масссив формы (N, D),содержащий обучающие данные;
  19. N обучающих выборок каждая размерностью D.
  20. - y: numpy масссив формы (N,) содержащий обучающие метки; y[i] = c
  21. означает что X[i] имеет метку 0 <= c < C , где C число классов.
  22. - learning_rate: (float) скорость обучения .
  23. - reg: (float) коэффициент регуляризации .
  24. - num_iters: (integer) число шагов оптимизации
  25. - batch_size: (integer) число обучающих примеров в мини-блоке.
  26. - verbose: (boolean) Если true, то печаются промежуточные данные в ходе оптимизации.
  27.  
  28. Выходы:
  29. Список, содержаший значения функции потерь на каждом шаге обучения.
  30. """
  31. num_train, dim = X.shape
  32. num_classes = np.max(y) + 1 # y принимает значения 0...K-1, где K число классов
  33. if self.W is None:
  34. # Ленивая инициализация W
  35. self.W = 0.001 * np.random.randn(dim, num_classes)
  36.  
  37. # Выполнение стохастического градиентного спуска для оптимизации W
  38. loss_history = [] #список для хранения значений потерь
  39. for it in range(num_iters):
  40.  
  41. #########################################################################
  42. # ЗАДАНИЕ: #
  43. # Сделайте выборку batch_size элементов из обучающих данных и их #
  44. # меток для применения при градиентном спуске. #
  45. # Сохраните данные в X_batch и сответсвующие метки в y_batch; #
  46. # Блок X_batch должен иметь размерность (D, batch_size), #
  47. # а блок y_batch - размерность (batch_size,) #
  48. # #
  49. # Совет: Используйте np.random.choice для генерации индексов. Выборка с #
  50. # с заменой быстрее, чем выборка без замены. #
  51. #########################################################################
  52.  
  53. sample_indices = np.random.choice(num_train, batch_size, replace=True) # Выборка индексов
  54. X_batch = X[sample_indices]
  55. y_batch = y[sample_indices]
  56.  
  57.  
  58. #########################################################################
  59. # КОНЕЦ ВАШЕГО КОДА #
  60. #########################################################################
  61.  
  62. # оценка потерь и градиента
  63. loss, grad = self.loss(X_batch, y_batch, reg)
  64. loss_history.append(loss) #добавляем значение потерь в список
  65.  
  66. # обновление параметров
  67. #########################################################################
  68. # ЗАДАНИЕ: Реализуйте SGD #
  69. # Для этого обновите веса, используя градиент и скорость обучения. #
  70. #########################################################################
  71.  
  72. self.W -= learning_rate * grad
  73.  
  74. #########################################################################
  75. # КОНЕЦ ВАШЕГО КОДА #
  76. #########################################################################
  77.  
  78. if verbose and it % 100 == 0:
  79. print('итерация %d / %d: потери %f' % (it, num_iters, loss))
  80.  
  81. return loss_history
  82.  
  83. def predict(self, X):
  84. """
  85. Использует обученные веса линейного классификатора для предсказания меток
  86. данных
  87.  
  88. Входы:
  89. - X: numpy масссив формы (N, D), содержащий обучающие данные;
  90. N обучающих выборок каждая размером D.
  91.  
  92. Выходы:
  93. - y_pred: Предсказанные метки данных в X.
  94. y_pred - 1-мерный массив длиной N,
  95. где каждый элемент - это целое число,
  96. соотвествующее предсказанной метке класса.
  97. """
  98. y_pred = np.zeros(X.shape[0])
  99. ###########################################################################
  100. # ЗАДАНИЕ: #
  101. # Реализуте этот метод. Сохраните предсказанные метки в y_pred. #
  102. ###########################################################################
  103.  
  104. scores = X.dot(self.W) # вычислить скалярное произведение между X и весами
  105. y_pred = np.argmax(scores, axis=1) # получить индексы максимальных значений по столбцам
  106.  
  107. ###########################################################################
  108. # КОНЕЦ ВАШЕГО КОДА #
  109. ###########################################################################
  110. return y_pred
  111.  
  112. def loss(self, X_batch, y_batch, reg):
  113. """
  114. Вычисляет функцию потерь и её производную.
  115. Подклассы ниже переопределяют её
  116.  
  117. Входы:
  118. - X_batch: numpy масссив формы (N, D),содержащий миниблок данных;
  119. N обучающих выборок каждая размерностью D.
  120. - y_batch: numpy масссив формы (N,) содержащий метки выборок миниблока;
  121. - reg: (float) коэффициент регуляризации.
  122.  
  123. Возвращает кортеж:
  124. - потери в виде single float
  125. - градиент по отношению к self.W; массив такой формы как и W
  126. """
  127. pass
  128.  
  129.  
  130. class LinearSVM(LinearClassifier):
  131. """ Подкласс, который использует мультиклассовую SVM функцию потерь """
  132. # переопределение функции потерь базового класса LinearClassifier
  133. def loss(self, X_batch, y_batch, reg):
  134. return svm_loss_vectorized(self.W, X_batch, y_batch, reg)
  135.  
  136.  
  137. class Softmax(LinearClassifier):
  138. """ Подкласс, который использует Softmax + кросс-энтропийную функцию потерь """
  139. # переопределение функции потерь базового класса LinearClassifier
  140. def loss(self, X_batch, y_batch, reg):
  141. return softmax_loss_vectorized(self.W, X_batch, y_batch, reg)
  142.  
  143.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement