2016-08-03 4 views
0

Я пытаюсь построить две аналогичные модели, предсказывающие разные типы выходных данных. Один предсказывает между двумя категориями, а другой имеет шесть категорий вывода. Их входные данные одинаковы, и они являются LSTM RNN.Создание нескольких моделей на одном графике

Я разделил обучение и прогнозирование на отдельные функции в каждом из своих файлов model1.py, model2.py.

Я допустил ошибку, назвав переменные в каждой модели тем же самым, чтобы при вызове pred1 и предсказывать2 из model1 и model2 соответственно я получаю следующую ошибку пространства имен: ValueError: Variable W уже существует, запрещен. Вы хотели установить reuse = True в VarScope? Первоначально определено по адресу:

Где W - название матрицы весов.

Есть ли хороший способ управлять этими прогнозами с одного и того же места? Я попытался переименовать переменные, но все равно получить следующую ошибку. Не похоже, что можно назвать lstm_cell на его создании, не так ли?

ValueError: Variable RNN/BasicLSTMCell/Linear/Matrix already exists 

EDIT: После того, как по определению объема вокруг model1pred и model2pred в предсказания файла я получаю следующее сообщение об ошибке при вызове model1pred() затем model2pred()

tensorflow.python.framework.errors.NotFoundError: Tensor name model1/model1/BasicLSTMCell/Linear/Matrix" not found in checkpoint files './variables/model1.chk 

EDIT: код включен здесь. Код в model2.py отсутствует, но эквивалентен в model1.py, за исключением n_classes = 2, а внутри функции dynamicRNN и внутри pred область имеет значение 'model2'.

РЕШЕНИЕ: Проблема была в графике, который хранитель пытался восстановить включенные переменные из первого выполнения pred(). Мне удалось обернуть вызовы пред-функций на разных графиках, чтобы решить проблему, устраняя необходимость изменения переменных.

В Collect предсказаниями файл:

def model1pred(test_x, test_seqlen): 
    from model1 import pred 
    with tf.Graph().as_default(): 
     return pred(test_x, test_seqlen) 

def model2pred(test_x, test_seqlen): 
    from model2 import pred 
    with tf.Graph().as_default(): 
     return pred(test_x, test_seqlen) 

##Import test_x, test_seqlen 

probs1, preds1 = model1pred(test_x, test_seq) 
probs2, cpreds2 = model2Pred(test_x, test_seq) 

В model1.py

def dynamicRNN(x, seqlen, weights, biases): 
    n_steps = 10 
    n_input = 14 
    n_classes = 6 
    n_hidden = 100 

    # Prepare data shape to match `rnn` function requirements 
    # Current data input shape: (batch_size, n_steps, n_input) 
    # Required shape: 'n_steps' tensors list of shape (batch_size, n_input) 

    # Permuting batch_size and n_steps 
    x = tf.transpose(x, [1, 0, 2]) 
    # Reshaping to (n_steps*batch_size, n_input) 
    x = tf.reshape(x, [-1,n_input]) 
    # Split to get a list of 'n_steps' tensors of shape (batch_size, n_input) 
    x = tf.split(0, n_steps, x) 

    # Define a lstm cell with tensorflow 
    lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0) 

    # Get lstm cell output, providing 'sequence_length' will perform dynamic calculation. 
    outputs, states = tf.nn.rnn(lstm_cell, x, dtype=tf.float32, sequence_length=seqlen) 

    # When performing dynamic calculation, we must retrieve the last 
    # dynamically computed output, i.e, if a sequence length is 10, we need 
    # to retrieve the 10th output. 
    # However TensorFlow doesn't support advanced indexing yet, so we build 
    # a custom op that for each sample in batch size, get its length and 
    # get the corresponding relevant output. 

    # 'outputs' is a list of output at every timestep, we pack them in a Tensor 
    # and change back dimension to [batch_size, n_step, n_input] 
    outputs = tf.pack(outputs) 
    outputs = tf.transpose(outputs, [1, 0, 2]) 

    # Hack to build the indexing and retrieve the right output. 
    batch_size = tf.shape(outputs)[0] 
    # Start indices for each sample 
    index = tf.range(0, batch_size) * n_steps + (seqlen - 1) 
    # Indexing 
    outputs = tf.gather(tf.reshape(outputs, [-1, n_hidden]), index) 

    # Linear activation, using outputs computed above 
    return tf.matmul(outputs, weights['out']) + biases['out'] 

def pred(test_x, test_seqlen): 
    with tf.Session() as sess: 
     n_steps = 10 
     n_input = 14 
     n_classes = 6 
     n_hidden = 100 
     weights = {'out': tf.Variable(tf.random_normal([n_hidden, n_classes]), name='W1')} 
     biases = {'out': tf.Variable(tf.random_normal([n_classes]), name='b1')} 
     x = tf.placeholder("float", [None, n_steps, n_input]) 
     y = tf.placeholder("float", [None, n_classes]) 
     seqlen = tf.placeholder(tf.int32, [None]) 

     pred = dynamicRNN(x, seqlen, weights, biases) 
     saver = tf.train.Saver(tf.all_variables()) 
     y_p =tf.argmax(pred,1) 

     init = tf.initialize_all_variables() 
     sess.run(init) 

     saver.restore(sess,'./variables/model1.chk') 
     y_prob, y_pred= sess.run([pred, y_p], feed_dict={x: test_x, seqlen: test_seqlen}) 
     y_prob = np.array([softmax(x) for x in y_prob]) 
     return y_prob, y_pred 

'

+0

Возможно, создать одну из моделей в пользовательском [variable_scope] (https://www.tensorflow.org/versions/r0.10/how_tos/variable_scope/index.html) блоке? –

+0

Вам действительно нужна гигантская проза, чтобы объяснить вашу проблему? Подумайте о том, чтобы разделить вопрос, где одна часть легко увидеть, в чем суть вашей проблемы, а не бросать много строк кода или объяснять мотивацию вашей проблемы. Этот сайт больше посвящен кодированию, поэтому постарайтесь сосредоточиться на этом. –

+0

Также ваш заголовок вашего вопроса кажется довольно широким, в то время как детали кажутся довольно конкретными. Можете ли вы изменить заголовок, чтобы лучше понять, о чем идет речь? –

ответ

0

Вы можете сделать это путем добавления with tf.variable_scope(): блоков вокруг двух частей модели строительного кода. Это приводит к префиксным именам переменных с другим префиксом, который позволяет избежать столкновения.

Для примера (с использованием model1pred() и model2pred() функции, определенные в вашем вопросе):

with tf.variable_scope('model1'): 
    # Variables created in here will be named 'model1/W', etc. 
    probs1, preds1 = model1pred(test_x, test_seq) 

with tf.variable_scope('model2'): 
    # Variables created in here will be named 'model2/W', etc. 
    probs2, cpreds2 = model2Pred(test_x, test_seq) 

Для получения более подробной информации см в глубину HOWTO on variable sharing in TensorFlow.

+0

Замечу, что модели являются отдельными файлами, если это что-то меняет. Я завернул каждый метод для обучения и создания прогнозов с каждой моделью с помощью переменных_scopes. Внутри отдельного метода, который создает ячейку LSTM, я также устанавливаю tf.nn.rnn (...., scope = 'model1'). Каждая модель запускается, когда другая, как и раньше, не работает, но вторая не работает, если она выполняется подряд. – John

+0

Работает ли он, если вы вызываете код в разных внешних областях? (Файл не должен влиять на область переменных.) Если нет, можете ли вы обновить вопрос с помощью кода верхнего уровня для вашей программы? – mrry

+0

Я предположил, что, вызывая код в другой внешней области видимости переменной, вы хотите обернуть преди-функции в model1pred и model2pred в области переменных в файле предсказания при вызове функции? Это не исправило ошибку. Я отредактировал в коде в исходном сообщении – John

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