2017-10-19 3 views
1

Je passe des jours à essayer de comprendre ce qui se passe et je reçois toujours cette erreur. voici l'erreur que je reçoispoids n'existe pas, ou n'a pas été créé avec tf.get_variable()

ValueError: Variable rnn/multi_rnn_cell/cell_1/basic_lstm_cell/weights does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?

Et voici mon exemple de code, est-ce que quelqu'un sait ce que je fais mal?

x = tf.placeholder(tf.float32,[None,n_steps,n_input]) 
y = tf.placeholder(tf.float32,[None,n_classes]) 
weights = { 
    'out': tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'out': tf.Variable(tf.random_normal([n_classes])) 
} 

def RNN(x, weights, biases): 

    x = tf.unstack(x, n_steps, 1) 

    lstm_cell = rnn.MultiRNNCell([cell() for y in range(2)] , state_is_tuple=True) 


    # Get lstm cell output 
    outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32) 

    # Linear activation, using rnn inner loop last output 
    return tf.matmul(outputs[-1], weights['out']) + biases['out'] 

def cell():   
    return rnn.BasicLSTMCell(n_hidden,forget_bias=0.1, reuse=True) 

pred = RNN(x, weights, biases) 
+0

Qu'est-ce que vous essayez de faire avec 'tf.variable_scope (...)'? Essayez-vous de réutiliser les poids dans les deux cellules LSTM? Dans ce cas, vous devez simplement réutiliser le même objet de cellule. Sinon, il suffit de supprimer le 'tf.variable_scope', car il est source de confusion TF (vous créez des ops sous deux instanciations de la même portée variable, ce qui entraîne une dénomination incohérente, par exemple voir [ici] (https://github.com/ tensorflow/tensorflow/numéros/6007 # emissionecomment-315030061)). – jdehesa

+0

merci, @jdehesa j'ai essayé sans elle mais il se plaint encore du même problème. J'ai édité ma question. –

+0

Ah, attends, je n'ai pas vu que tu utilisais 'reuse = True' dans la cellule. Cela vous attend pour créer les variables nécessaires avant main (ou les avoir créées avec un appel préalable à 'static_rnn' /' dynamic_rnn'). Si vous voulez vraiment réutiliser les poids, il est généralement plus facile de réutiliser le même objet de cellule si possible (c.-à-d. En créer un et transmettre une liste avec deux références à 'MultiRNNCell'). Si vous ne voulez pas réutiliser les poids, alors _not_ passe 'reuse = True'. – jdehesa

Répondre

1

Si vous souhaitez réutiliser les poids, le plus simple est de créer un objet cellule unique et passer plusieurs fois à MultiRNNCell:

import tensorflow as tf 
from tensorflow.contrib import rnn 

n_steps = 20 
n_input = 10 
n_classes = 5 
n_hidden = 15 

x = tf.placeholder(tf.float32,[None,n_steps,n_input]) 
y = tf.placeholder(tf.float32,[None,n_classes]) 
weights = { 
    'in': tf.Variable(tf.random_normal([n_input, n_hidden])), 
    'out': tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'in': tf.Variable(tf.random_normal([n_hidden])), 
    'out': tf.Variable(tf.random_normal([n_classes])) 
} 

def RNN(x, weights, biases): 

    # Initial input layer 
    inp = (tf.matmul(x, weights['in'][tf.newaxis, ...]) + 
      biases['in'][tf.newaxis, tf.newaxis, ...]) 
    inp = tf.nn.sigmoid(inp) 
    inp = tf.unstack(inp, axis=-1) 

    my_cell = cell() 
    lstm_cell = rnn.MultiRNNCell([my_cell for y in range(2)], state_is_tuple=True) 

    # Get lstm cell output 
    outputs, states = rnn.static_rnn(lstm_cell, inp, dtype=tf.float32) 

    # Linear activation, using rnn inner loop last output 
    return tf.matmul(outputs[-1], weights['out']) + biases['out'] 

def cell():   
    return rnn.BasicLSTMCell(n_hidden,forget_bias=0.1) 

pred = RNN(x, weights, biases) 

Cependant, vous devez vous assurer qu'il logique pour partager les variables, par dimension, sinon cela échouera. Dans ce cas, j'ai ajouté une couche supplémentaire avant les cellules LSTM pour m'assurer que chaque entrée LSTM a la même taille.

+0

Woot ... Woot ... fantastique, cela a fonctionné. Pourriez-vous également développer votre réponse avec le scénario d'utilisation de couche dense avant LSTM. –

+0

@FarzanMajdani J'ai mis à jour la réponse. – jdehesa

+0

Merci beaucoup vous êtes star :) –

2

Si vous n'avez pas besoin de réutiliser la cellule, il suffit d'utiliser ce qui suit,

def cell():   
    return rnn.BasicLSTMCell(n_hidden,forget_bias=0.1) 

Sinon, Si vous avez besoin de réutiliser, vous pouvez suivre ce post Reuse Reusing Variable of LSTM in Tensorflow qui a une bonne explication.

+0

Merci, mais je ne peux toujours pas le faire fonctionner. –