Я немного запутался в использовании функции tf.matmul()
в TensorFlow. Однако мой вопрос может быть больше о теории глубокого обучения. Скажем, у вас есть вход X и весовая матрица W (при условии нулевого смещения), я хочу вычислить WX как результат, который может быть сделан tf.matmul(W, X)
. Тем не менее, в учебнике MNIST for beginners он обратный, и вместо него используется tf.matmul(X, W)
. С другой стороны, в следующем учебнике TensorFlow Mechanics 101 используется tf.matmul(W, X)
. Поскольку размеры матрицы важны для умножения, мне интересно, может ли кто-нибудь прояснить эту проблему.Использование функции умножения матрицы в TensorFlow
ответ
Я мало знаю о TensorFlow, но интуитивно чувствую, что путаница касается представления данных ввода. Когда вы говорите, что хотите умножить вход X
с весом W
Я думаю, что вы имеете в виду, что вы хотите умножить каждое измерение (функцию) с его соответствующим весом и взять сумму. Поэтому, если у вас есть вход x
с указанием размеров m
, вы должны иметь весовой вектор w
с m
значениями (m+1
, если учесть смещение).
Теперь, если вы выбираете, чтобы представить различные примеры обучения в виде строк матрицы X
, вы должны выполнить X * w
, а если вы выбираете, чтобы представить их в виде столбцов, вы могли бы сделать w^T * X
Я думаю, что вы, должно быть, неправильно читаете учебник по механике 101 или можете указать на конкретную строку?
В общем, для сетевого уровня я думаю о входах, «проходящих» по весам. Чтобы представить это, я пишу tf.matmul(Inputs, Weights)
для получения вывода этого слоя. Этот результат может затем иметь смещение b
, добавленное к нему, и результат его подачи в нелинейную функцию, такую как relu, а затем в другую tf.matmul
в качестве входа для следующего слоя.
Во-вторых, помните, что матрица весов может иметь размер для создания нескольких выходов. Вот почему это матрица, а не только вектор. Например, если вам нужны два скрытых устройства, и у вас было пять входных функций, вы бы использовали весовую матрицу формы [5, 2]
, как это (показано в numpy для удобства изложения - вы можете сделать то же самое в тензорном потоке):
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
, он по-прежнему работает: а = np.array [[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, чтобы перейти от входа в особенности скрытых блоков, или от одного слоя скрытых единиц к другому.
Спасибо за ответ, но Я все еще смущен. Нам нужно вычислить Входы веса *, поэтому почему бы не tf.matmul (Weights, Inputs)? tf.matmul (a, W) создает вместо W * a * W. – sergulaydore
Я думаю об этом так: Представьте, что у вас есть 5 активации, поступающих в вашу весовую матрицу, и вы хотите, чтобы на этом выводе было 2 выхода. Ваш «размер ввода» для слоя равен 5, а ваш «выходной» размер со слоя - 2. Кроме того, у вас есть размер партии B. Я считаю, что естественным образом это означает, что ваш вход «[B, 5] 'с первым измерением, являющимся партией. Если вы настроите весовую матрицу как матрицу '[5x2]', вы можете умножить размер партии в: '[B x 5] * [5 x 2] -> [B, 2]'. Вы могли бы, конечно, перенести обе матрицы и умножить 'W_t * a_t'. – dga
К сожалению, как обсуждалось здесь: http://stackoverflow.com/a/34908326/281545 np.точка не соответствует семантике tf.matmul - в частности, оба операнда должны быть матрицами. Любые обходные пути? –
- 1. Ошибка умножения матричной матрицы (для цикла) Tensorflow
- 2. Использование семафоров для умножения матрицы
- 3. Использование MPI для умножения матрицы
- 4. Использование Cuda для умножения не квадратной матрицы
- 5. Использование ThreadPool для параллелизации умножения матрицы
- 6. Использование встроенной сборки для ускорения умножения матрицы
- 7. Использование pthread для выполнения умножения матрицы
- 8. Функция умножения матрицы C++
- 9. специальный случай умножения матрицы
- 10. Поиск основной матрицы (ошибка умножения матрицы)
- 11. Функция умножения матрицы
- 12. Операция умножения матричной матрицы
- 13. cellarray векторизации умножения матрицы
- 14. Разница в тензоре умножения матрицы против numpy
- 15. формы умножения матрицы numpy
- 16. Вариации умножения матрицы Python
- 17. Настройка умножения матрицы MPI_Bcast
- 18. Результат умножения матрицы - 'nan'
- 19. Неверные значения умножения матрицы
- 20. Шаги умножения матрицы печати
- 21. Логический алгоритм умножения матрицы
- 22. Ошибка умножения матрицы
- 23. Theano градиент умножения разреженной матрицы
- 24. Ошибка умножения матрицы в C
- 25. Пример умножения неоновой матрицы ARM
- 26. Использование умножения матрицы для поворота куба в opengl
- 27. Получить диагональ матрицы в TensorFlow
- 28. Порядок умножения матрицы C/C++
- 29. Быстрое преобразование/преобразование матрицы умножения
- 30. Hadoop input SequenceFile умножения матрицы
Если вам нужно несколько экземпляров обучения в пакете, вам нужно использовать 'tf.batch_matmul', который внутренне обрабатывает первое измерение как размер партии. Помните, что весы могут быть матрицей, а не вектором: вы можете создавать несколько выходов на основе различных весов входных функций. Я обновил свой ответ, чтобы указать на это. – dga
Спасибо @jMathew. Я думаю, вы правы. Я предполагал, что вход должен быть представлен как (n_Features x n_Samples), но, похоже, в большинстве примеров это похоже на другое. dga, это не имеет никакого отношения к тому, является ли W вектором или мы кормим бани. – sergulaydore