Использование функции перемножения матриц в TensorFlow
Я немного смущен использованием функции tf.matmul()
в TensorFlow. Однако мой вопрос может быть больше о теории глубокого обучения. Скажем, у вас есть вход X и весовая матрица W (при условии нулевого смещения), я хочу вычислить WX как выход, который может быть выполнен tf.matmul(W, X)
. Однако, в учебнике MNIST для начинающих он перевернут и tf.matmul(X, W)
используется вместо этого. С другой стороны, в следующем уроке Механика TensorFlow 101, есть. Поскольку размеры матрицы важны для умножения, интересно, может ли кто-нибудь прояснить эту проблему.
2 ответов
Я мало знаю о TensorFlow, но интуитивно чувствую, что путаница связана с представлением данных ввода. Когда вы говорите, что хотите умножить вход X
весом W
Я думаю, что вы имеете в виду, что вы хотите умножить каждое измерение (функцию) с соответствующим весом и взять сумму. Итак, если у вас есть вход x
С m
размеры, вы должны иметь вектор веса w
С m
значения (m+1
если вы считаете предвзятость.)
теперь, если вы решите представить различные учебные экземпляры в виде строк матрицы X
, вам придется выполнить X * w
, вместо этого, если вы решите представить их как столбцы, вы бы сделали w^T * X
Я думаю, вы, должно быть, неправильно читаете учебник по механике 101 - или вы можете указать на конкретную строку?
в общем, для сетевого слоя я думаю о входах, "протекающих" через веса. Чтобы представить это, я пишу tf.matmul(Inputs, Weights)
для получения вывода этого слоя. Этот вывод может иметь смещение b
добавлен к нему, и результат этого подается в нелинейную функцию, такую как relu, а затем в другую tf.matmul
как входной сигнал для следующего слой.
во-вторых, помните, что матрица весов может иметь размер для получения нескольких выходов. Вот почему это матрица, а не просто вектор. Например, если вам нужны два скрытых блока и у вас есть пять входных объектов, вы должны использовать shape [5, 2]
матрица веса, как это (показано в numpy для удобства экспозиции - вы можете сделать то же самое в tensorflow):
import numpy as np
a = np.array([1, 2, 3, 4, 5])
W = np.array([[.5, .6], [.7, .8], [.9, .1], [.2, .3], [.4, .5]])
>>> np.dot(a, W)
array([ 7.4, 6.2])
это имеет хорошее поведение, если вы затем добавите пакетное измерение в a
, он все еще работает:
ля = НП.массив[[1, 2, 3, 4, 5],
[6, 7, 8, 9, 0]]
>>> np.dot(a, W)
array([[ 7.4, 6.2],
[ 20.9, 17.7]])
это именно то, что вы делаете, когда используете tf.matmul для перехода от входных объектов к скрытым единицам или от одного слоя скрытых единиц к другому.