#python #tensorflow
#python #tensorflow
Вопрос:
У меня есть тензор x формы (10,2)
У меня есть тензор y формы (10,)
У меня есть тензор y_pred формы (10,)
Я хочу вычислить тензор dw формы (2,1), используя следующую формулу.
Пусть dw1 и dw2 будут элементами в тензоре dw.
dw1 = tf.reduce_sum(x1 * (y — y_pred)) * (-2/n)
где ,
x1 = 1-й столбец тензора x
n = скалярный
dw2 = tf.reduce_sum(x2 * (y — y_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
это необходимо, без этого вы могли бы получить ошибку приведения.