Advertisement
toropyga

LinReg_Tensors

Sep 13th, 2022
558
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.29 KB | None | 0 0
  1. # Не понял, умеет ли линейная регрессия работать с векторами и тензорами, а не только скалярами
  2. # и решил попробовать регрессию из tensorflow, благо, она точн с тензорами работает
  3.  
  4. # Сделал тензоры из векторов описаний (X) и изображений (Y)
  5. X = tf.convert_to_tensor(np.stack(X_train))
  6. Y = tf.convert_to_tensor(np.stack(y_train.apply(lambda x: x.T.flatten())))
  7. X.shape
  8. > TensorShape([493, 1338])
  9. Y.shape
  10. > TensorShape([493, 1338])
  11. # Завел переменные весов и смещений, vector_size=1338
  12. W = tf.Variable(np.random.randn(1, vector_size), name="W")
  13. b = tf.Variable(np.random.randn(1, vector_size), name="b")
  14.  
  15. def y_pred(x):
  16.     """Задаём линейную зависимость между входом и выходом"""
  17.     return tf.add(tf.multiply(x, W), b)
  18.  
  19.  
  20. def cost():
  21.     """в качестве меры используем MSE"""
  22.     cost = tf.reduce_sum(tf.pow(y_pred(X) - Y, 2)) / (2 * n)
  23.     return cost
  24.  
  25.  
  26. optimizer = tf.keras.optimizers.Adam(learning_rate)
  27.  
  28.  
  29. # Инициализируем веса и смещение
  30. pred = y_pred(X)
  31. trainable_vars = [W, b]
  32.  
  33. # когда начал обучать, вылетела ошибка
  34. for epoch in range(epochs):
  35.     optimizer.minimize(cost, trainable_vars)
  36.     pred = y_pred(X)
  37.     if (epoch + 1) % 50 == 0:
  38.         c = cost()
  39.         print("Epoch", (epoch + 1), ": cost =", c.numpy(), "W =",  W.numpy(),  "b =",  b.numpy() )
  40.  
  41. ### Error message
  42. # Очевидно, функции потерь не нравится многомерность X и Y. Как с этим справиться? Как вообще обучить линрег на векторах вместо скаляров?
  43. ---------------------------------------------------------------------------
  44. InvalidArgumentError                      Traceback (most recent call last)
  45. Cell In [160], line 2
  46.       1 for epoch in range(epochs):
  47. ----> 2     optimizer.minimize(cost, trainable_vars)
  48.       3     pred = y_pred(X)
  49.       4     if (epoch + 1) % 50 == 0:
  50.  
  51. File ~/.local/share/virtualenvs/00_Praktikum-W4BAQCOP/lib/python3.10/site-packages/keras/optimizers/optimizer_v2/optimizer_v2.py:576, in OptimizerV2.minimize(self, loss, var_list, grad_loss, name, tape)
  52.     545 def minimize(self, loss, var_list, grad_loss=None, name=None, tape=None):
  53.     546     """Minimize `loss` by updating `var_list`.
  54.    547
  55.    548     This method simply computes gradient using `tf.GradientTape` and calls
  56.   (...)
  57.    574
  58.    575     """
  59. --> 576     grads_and_vars = self._compute_gradients(
  60.     577         loss, var_list=var_list, grad_loss=grad_loss, tape=tape
  61.     578     )
  62.     579     return self.apply_gradients(grads_and_vars, name=name)
  63.  
  64. File ~/.local/share/virtualenvs/00_Praktikum-W4BAQCOP/lib/python3.10/site-packages/keras/optimizers/optimizer_v2/optimizer_v2.py:625, in OptimizerV2._compute_gradients(self, loss, var_list, grad_loss, tape)
  65.     623 if not callable(var_list):
  66.     624     tape.watch(var_list)
  67. --> 625 loss = loss()
  68.     626 if callable(var_list):
  69.     627     var_list = var_list()
  70.  
  71. Cell In [135], line 8, in cost()
  72.       6 def cost():
  73.       7     """в качестве меры используем MSE"""
  74. ----> 8     cost = tf.reduce_sum(tf.pow(y_pred(X) - Y, 2)) / (2 * n)
  75.       9     return cost
  76.  
  77. File ~/.local/share/virtualenvs/00_Praktikum-W4BAQCOP/lib/python3.10/site-packages/tensorflow/python/util/traceback_utils.py:153, in filter_traceback.<locals>.error_handler(*args, **kwargs)
  78.     151 except Exception as e:
  79.     152   filtered_tb = _process_traceback_frames(e.__traceback__)
  80. --> 153   raise e.with_traceback(filtered_tb) from None
  81.     154 finally:
  82.     155   del filtered_tb
  83.  
  84. File ~/.local/share/virtualenvs/00_Praktikum-W4BAQCOP/lib/python3.10/site-packages/tensorflow/python/framework/ops.py:7209, in raise_from_not_ok_status(e, name)
  85.    7207 def raise_from_not_ok_status(e, name):
  86.    7208   e.message += (" name: " + name if name is not None else "")
  87. -> 7209   raise core._status_to_exception(e) from None
  88.  
  89. InvalidArgumentError: cannot compute Sub as input #1(zero-based) was expected to be a double tensor but is a float tensor [Op:Sub]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement