Ошибка «Ядро уже используется» при использовании обученного RNN для прогнозирования - PullRequest
0 голосов
/ 03 сентября 2018

Спасибо, что заглянули в этот вопрос!

Я пытаюсь обучить сеть LSTM, которая прогнозирует следующие 5-дневные цены на основе прошлых 30-дневных. Я обучил модель на основе 265 образцов. Переменные определены следующим образом:

# Variables
x = tf.placeholder("float", [265, 30])
y = tf.placeholder("float", [265, 5])

weights = {
    'out': tf.Variable(tf.random_normal([n_hidden, y_size]))
    }

biases = {
    'out': tf.Variable(tf.random_normal([y_size]))
    }

и модель выглядит так:

# Define RNN architecture
def RNN(x, weights, biases):
    x_size = 30
    x = tf.reshape(x, [-1, x_size])
    x = tf.split(x, x_size, 1)

    rnn_cell = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden), rnn.BasicLSTMCell(n_hidden)])

    outputs, states = rnn.static_rnn(rnn_cell, x, dtype = tf.float32)

    return tf.matmul(outputs[-1], weights['out'] + biases['out'])

Затем я пытаюсь использовать обученную модель для прогнозирования следующим образом:

y_pred = RNN(x_input, trained_weights, trained_biases)

, в котором x_input имеет размерность (1x30). В дал мне список ошибок, которые я не мог понять:

ValueError: Variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined at:

  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 1654, in __init__
    self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access
  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 3290, in create_op
    op_def=op_def)
  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)

Traceback (most recent call last):
  File "C:\Users\teh.khoonkheng\Desktop\Others\Personal working folder\14. Projects\1. Oracle\Python\RNN_stock_01.py", line 135, in <module>
    y_test = RNN(x_test, trained_weights, trained_biases)
  File "C:\Users\teh.khoonkheng\Desktop\Others\Personal working folder\14. Projects\1. Oracle\Python\RNN_stock_01.py", line 81, in RNN
    outputs, states = rnn.static_rnn(rnn_cell, x, dtype = tf.float32)
  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\ops\rnn.py", line 1330, in static_rnn
    (output, state) = call_cell()
  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\ops\rnn.py", line 1317, in <lambda>
    call_cell = lambda: cell(input_, state)
  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\ops\rnn_cell_impl.py", line 191, in __call__
    return super(RNNCell, self).__call__(inputs, state)
  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\layers\base.py", line 714, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\ops\rnn_cell_impl.py", line 1242, in call
    cur_inp, new_state = cell(cur_inp, cur_state)

Мне было интересно, правильно ли я понял, как работает static_rnn. Я неправильно настроил модель? И как мне использовать обученный RNN для прогнозирования?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 03 сентября 2018

Как говорит ошибка, вам нужно упомянуть reuse=True, чтобы изученные состояния можно было использовать позже для прогнозирования. Сделайте это:

rnn_cell = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden,reuse=tf.AUTO_REUSE), rnn.BasicLSTMCell(n_hidden,reuse=tf.AUTO_REUSE)])

Кроме того, эта модель выглядит неправильно, потому что, пока вы используете обученных weights и biases, но вы не используете обученных LSTMcells. Для новых входов вы определяете новый LSTMcells.

...