5

Sto cercando di imparare la rappresentazione della parola del dataset imdb "da zero" tramite la funzione TensorFlow tf.nn.embedding_lookup(). Se ho capito bene, devo impostare un livello di incorporamento prima dell'altro livello nascosto, e poi quando eseguo la discesa del gradiente, il livello "apprenderà" una rappresentazione di parole nei pesi di questo livello. Tuttavia, quando provo a farlo, ottengo un errore di forma tra il mio livello di incorporamento e il primo livello completamente connesso della mia rete.Tensorflow embedding_lookup

def multilayer_perceptron(_X, _weights, _biases): 
    with tf.device('/cpu:0'), tf.name_scope("embedding"): 
     W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W") 
     embedding_layer = tf.nn.embedding_lookup(W, _X)  
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(embedding_layer, _weights['h1']), _biases['b1'])) 
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2'])) 
    return tf.matmul(layer_2, weights['out']) + biases['out'] 

x = tf.placeholder(tf.int32, [None, n_input]) 
y = tf.placeholder(tf.float32, [None, n_classes]) 

pred = multilayer_perceptron(x, weights, biases) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y)) 
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(cost) 

init = tf.initialize_all_variables() 

L'errore che ottengo è:

ValueError: Shapes TensorShape([Dimension(None), Dimension(300), Dimension(128)]) 
and TensorShape([Dimension(None), Dimension(None)]) must have the same rank 

risposta

15

L'errore di forma nasce dal fatto che si utilizza un tensore bidimensionale, x per indicizzare in un embedding tensore bidimensionale W. Pensa allo tf.nn.embedding_lookup() (e al suo cugino stretto tf.gather()) prendendo ogni valore intero i in x e sostituendolo con la riga W[i, :]. Dal messaggio di errore, uno può dedurre che n_input = 300 e embedding_size = 128. In generale, il risultato di tf.nn.embedding_lookup() numero di dimensioni pari a rank(x) + rank(W) - 1 e hellip; in questo caso, 3. L'errore si verifica quando si tenta di moltiplicare questo risultato per _weights['h1'], che è una matrice (bidimensionale).

Per risolvere questo codice, dipende da cosa si sta tentando di fare e dal motivo per cui si sta passando a una matrice di input per l'incorporamento. Una cosa comune da fare è aggregato i vettori di incorporamento per ogni esempio di input in una singola riga per esempio utilizzando un'operazione come tf.reduce_sum(). Ad esempio, è possibile effettuare le seguenti operazioni:

W = tf.Variable(
    tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0) ,name="W") 
embedding_layer = tf.nn.embedding_lookup(W, _X) 

# Reduce along dimension 1 (`n_input`) to get a single vector (row) 
# per input example. 
embedding_aggregated = tf.reduce_sum(embedding_layer, [1]) 

layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(
    embedding_aggregated, _weights['h1']), _biases['b1'])) 
+1

Grazie! Penso che tf.nn.reduce_sum dovrebbe essere tf.reduce_sum? Quando scegli di ridurre la dimensione del livello di incorporamento, come hai scelto quello da ridurre tra "n_input = 300" e "embedding_size = 128"? – nicolasdavid

+2

Hai ragione riguardo al refuso - corretto in alto, grazie! Ho scelto di ridurre la dimensione 'n_input' perché sembrava più probabile che ciò corrispondesse al tuo problema e ho assunto che (ad esempio) l'ordine degli input non fosse importante. È abbastanza tipico farlo per problemi di tipo bag-of-words. Potresti * ridurre * con 'embedding_size', ma penso che perderebbe molte informazioni dall'incorporazione, quindi probabilmente non funzionerebbe altrettanto bene. – mrry

0

Uno un'altra soluzione possibile è: Invece di aggiungere i vettori di embedding, concatenare questi vettori in un unico vettore e di aumentare il numero di neuroni nello strato nascosto.
ho usato:
embedding_aggregated = tf.reshape(embedding_layer, [-1, embedding_size * sequence_length])
Inoltre, ho cambiato il numero di neuroni nello strato nascosto embedding_size * sequence_length. Osservazione: anche l'accuratezza è migliorata utilizzando la concatenazione piuttosto che l'aggiunta.