Использование функции перемножения матриц в 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 для перехода от входных объектов к скрытым единицам или от одного слоя скрытых единиц к другому.