2015-12-15 7 views
7

Я немного запутался в использовании функции 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

ответ

2

Я мало знаю о TensorFlow, но интуитивно чувствую, что путаница касается представления данных ввода. Когда вы говорите, что хотите умножить вход X с весом W Я думаю, что вы имеете в виду, что вы хотите умножить каждое измерение (функцию) с его соответствующим весом и взять сумму. Поэтому, если у вас есть вход x с указанием размеров m, вы должны иметь весовой вектор w с m значениями (m+1, если учесть смещение).

Теперь, если вы выбираете, чтобы представить различные примеры обучения в виде строк матрицы X, вы должны выполнить X * w, а если вы выбираете, чтобы представить их в виде столбцов, вы могли бы сделать w^T * X

+1

Если вам нужно несколько экземпляров обучения в пакете, вам нужно использовать 'tf.batch_matmul', который внутренне обрабатывает первое измерение как размер партии. Помните, что весы могут быть матрицей, а не вектором: вы можете создавать несколько выходов на основе различных весов входных функций. Я обновил свой ответ, чтобы указать на это. – dga

+0

Спасибо @jMathew. Я думаю, вы правы. Я предполагал, что вход должен быть представлен как (n_Features x n_Samples), но, похоже, в большинстве примеров это похоже на другое. dga, это не имеет никакого отношения к тому, является ли W вектором или мы кормим бани. – sergulaydore

5

Я думаю, что вы, должно быть, неправильно читаете учебник по механике 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, чтобы перейти от входа в особенности скрытых блоков, или от одного слоя скрытых единиц к другому.

+0

Спасибо за ответ, но Я все еще смущен. Нам нужно вычислить Входы веса *, поэтому почему бы не tf.matmul (Weights, Inputs)? tf.matmul (a, W) создает вместо W * a * W. – sergulaydore

+0

Я думаю об этом так: Представьте, что у вас есть 5 активации, поступающих в вашу весовую матрицу, и вы хотите, чтобы на этом выводе было 2 выхода. Ваш «размер ввода» для слоя равен 5, а ваш «выходной» размер со слоя - 2. Кроме того, у вас есть размер партии B. Я считаю, что естественным образом это означает, что ваш вход «[B, 5] 'с первым измерением, являющимся партией. Если вы настроите весовую матрицу как матрицу '[5x2]', вы можете умножить размер партии в: '[B x 5] * [5 x 2] -> [B, 2]'. Вы могли бы, конечно, перенести обе матрицы и умножить 'W_t * a_t'. – dga

+0

К сожалению, как обсуждалось здесь: http://stackoverflow.com/a/34908326/281545 np.точка не соответствует семантике tf.matmul - в частности, оба операнда должны быть матрицами. Любые обходные пути? –

Смежные вопросы