Векторизация с использованием тензоров Tensorflow

#python #tensorflow

#python #tensorflow

Вопрос:

У меня есть тензор x формы (10,2)
У меня есть тензор y формы (10,)
У меня есть тензор y_pred формы (10,)

Я хочу вычислить тензор dw формы (2,1), используя следующую формулу.

Пусть dw1 и dw2 будут элементами в тензоре dw.
dw1 = tf.reduce_sum(x1 * (yy_pred)) * (-2/n)
где ,
x1 = 1-й столбец тензора x
n = скалярный

dw2 = tf.reduce_sum(x2 * (yy_pred)) * (-2/n)
где ,
x2 = 2-й столбец тензора x
n = скалярный

Однако тензор x будет иметь динамическую форму.
Если тензор x имеет форму (10,3)
, dw будет иметь форму (3,1)

В перспективе ML я вычисляю градиенты функции потерь с учетом весов.r.t.
Функция потерь — MSE.

Я знаю, как реализовать это с помощью цикла for.
Но я не понимаю, как я должен реализовать это, используя векторизацию ie. Не использует никаких циклов for

Ответ №1:


Попробуйте старое матричное умножение:

 x = tf.ones((10,2), dtype=tf.float32)
y = tf.ones((10,1), dtype=tf.float32) * 2
y_pred = tf.ones((10,1), dtype=tf.float32) * 3
n = 3

result = tf.matmul(tf.transpose(x), y-y_pred) / (-n/2)
  

Объяснение:

tf.ones создает матрицу для демонстрационных целей. Первый аргумент обозначает его форму. x имеет форму 10 на 2, чтобы умножить это на матрицу формы 10 на 1, вам нужно транспонировать x .
Затем вы просто выполняете умножение матрицы, которое делает именно то, что вам нужно.

Обратите внимание, что dtype=tf.float32 это необходимо, без этого вы могли бы получить ошибку приведения.