2015-12-15 11 views
7

Sono un po 'confuso sull'uso della funzione tf.matmul() in TensorFlow. La mia domanda potrebbe essere più sulla teoria dell'apprendimento profondo, però. Supponiamo che tu abbia un input X e una W matrix (assumendo un bias zero), voglio calcolare WX come output che potrebbe essere fatto da tf.matmul(W, X). Tuttavia, nel tutorial MNIST for beginners viene invertito e viene utilizzato tf.matmul(X, W). D'altra parte, nel prossimo tutorial TensorFlow Mechanics 101, viene utilizzato tf.matmul(W, X). Poiché le dimensioni della matrice sono importanti per la moltiplicazione, mi chiedo se qualcuno possa chiarire questo problema.Uso della funzione di moltiplicazione della matrice in TensorFlow

risposta

2

Non so molto di TensorFlow, ma intuitivamente sento che la confusione riguarda la rappresentazione dei dati di input. Quando dici di voler moltiplicare un input X con un peso W, penso che vuoi dire moltiplicare ogni dimensione (caratteristica) con il peso corrispondente e prendere la somma. Quindi se hai un input x con le dimensioni m, dovresti avere un vettore di peso w con valori m (m+1 se consideri il bias).

Ora, se si sceglie di rappresentare le diverse istanze di formazione come righe di una matrice X, si dovrebbe eseguire X * w, invece se si sceglie di rappresentarle come colonne, si farebbe w^T * X

+1

Se si desiderano più istanze di addestramento in un batch, è necessario utilizzare 'tf.batch_matmul', che tratta internamente la prima dimensione come una dimensione batch. Ricorda che i pesi possono essere una matrice, non un vettore: puoi produrre più uscite basate su pesi diversi delle caratteristiche di input. Ho aggiornato la mia risposta per farlo notare. – dga

+0

Grazie @jMathew. Penso che tu abbia ragione. Supponevo che l'input fosse rappresentato come (n_Feature x n_Samples) ma sembra che sia il contrario nella maggior parte degli esempi. dga, non ha niente a che fare con il fatto che W sia un vettore o che stiamo dando da mangiare ai bagnanti. – sergulaydore

5

Penso che tu debba leggere male il tutorial della meccanica 101 - o potresti indicare la linea specifica?

In generale, per un livello di rete, penso agli input che "fluiscono attraverso" i pesi. Per rappresentarlo, scrivo tf.matmul(Inputs, Weights) per produrre l'output di quel livello. A tale output potrebbe quindi essere aggiunto un bias b e il risultato di tale inserimento in una funzione non lineare come un relu, e quindi in un altro tf.matmul come input per il livello successivo.

In secondo luogo, si ricorda che la matrice dei pesi può essere dimensionata per produrre più uscite. Ecco perché è una matrice, non solo un vettore. Ad esempio, se si desideravano due unità nascoste e si disponevano di cinque funzioni di input, si utilizza una matrice di peso [5, 2] di forma, come questa (mostrata in numpy per facilità di esposizione - si può fare la stessa cosa in 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]) 

Questo ha il comportamento bello che se poi si aggiunge una dimensione batch per a, funziona ancora: 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]]) 

Questo è esattamente quello che stai facendo quando si utilizza tf.matmul andare da ingresso dotato di unità nascoste, o da uno strato di unità nascoste a un'altra.

+0

Grazie per la risposta, ma Sono ancora confuso. Abbiamo bisogno di calcolare gli input di Weights * quindi perché non tf.matmul (Weights, Inputs)? tf.matmul (a, W) produce un * W invece di W * a. – sergulaydore

+0

Lo penso in questo modo: immagina di avere 5 attivazioni in arrivo nella tua matrice di peso e vuoi che ci siano 2 uscite da questo calcolo. La tua "dimensione di input" per il livello è 5, e la tua dimensione di "output" dal livello è 2. Inoltre, hai una dimensione di batch B. Trovo che una rappresentazione naturale di questo è che il tuo input è '[B, 5] 'la prima dimensione è il lotto. Se imposti la tua matrice di peso come matrice '[5x2]', puoi moltiplicare qualsiasi dimensione di batch in: '[B x 5] * [5 x 2] -> [B, 2]'. Si potrebbe, naturalmente, trasporre entrambe le matrici e moltiplicare 'W_t * a_t'. – dga

+0

Sfortunatamente come discusso qui: http://stackoverflow.com/a/34908326/281545 np.il punto non corrisponde alla semantica tf.matmul - in particolare entrambi gli operandi devono essere matrici. Qualche soluzione alternativa? –