2016-08-25 2 views
3

, что у меня есть следующий, который я считаю, это сеть с одним скрытым LSTM слоя:как укладывать LSTM слои с помощью TensorFlow

# Parameters 
learning rate = 0.001 
training_iters = 100000 
batch_size = 128 
display_step = 10 

# Network Parameters 
n_input = 13 
n_steps = 10 
n_hidden = 512 
n_classes = 13 

# tf Graph input 
x = tf.placeholder("float", [None, n_steps, n_input]) 
y = tf.placeholder("float", [None, n_classes]) 

# Define weights 
weights = { 
    'out' : tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'out' : tf.Variable(tf.random_normal([n_classes])) 
} 

Однако я пытаюсь построить сеть LSTM с помощью TensorFlow предсказать потребляемая мощность. Я искал хороший пример, но не смог найти ни одной модели с двумя скрытыми слоями LSTM. Вот модель, которую я хотел бы построить:

1 входной слой, 1 выходной слой, 2 скрытые LSTM слои (с 512 нейронов в каждом), временной шаг (длина последовательности): 10

Могли кто-нибудь поможет мне построить это с помощью TensorFlow? (от определения весов, формирования формы ввода, обучения, прогнозирования, использования оптимизатора или функции затрат и т. д.), любая помощь будет высоко оценена.

Большое вам спасибо!

ответ

5

Вот как я это делаю в модели перевода с ячейками ГРУ. Вы можете просто заменить ГРУ на LSTM. Очень просто использовать tf.nn.rnn_cell.MultiRNNCell со списком нескольких ячеек, которые он должен обернуть. В приведенном ниже коде я вручную разворачиваю его, но вы можете передать его tf.nn.dynamic_rnn или tf.nn.rnn.

y = input_tensor 
with tf.variable_scope('encoder') as scope: 
    rnn_cell = rnn.MultiRNNCell([rnn.GRUCell(1024) for _ in range(3)]) 
    state = tf.zeros((BATCH_SIZE, rnn_cell.state_size)) 
    output = [None] * TIME_STEPS 
    for t in reversed(range(TIME_STEPS)): 
     y_t = tf.reshape(y[:, t, :], (BATCH_SIZE, -1)) 
     output[t], state = rnn_cell(y_t, state) 
     scope.reuse_variables() 
    y = tf.pack(output, 1) 
+0

Спасибо за ответ. Нужно ли еще инициализировать переменные (параметры) из скрытого уровня1 в скрытый layer2 или они внутренне заботятся? – subbie

+0

Переменные для LSTM инициализируются, когда вы используете его внутри класса. Взгляните на исходный код, это очень полезно. – chasep255

+0

Я вижу, что переменные для четырех ворот LSTM инициализируются, но не должны также быть параметры от первого скрытого слоя до второго?Было бы разумно, если MultiRNNCell инициализирует параметры от одного скрытого к другому. – subbie

2

Сначала вам нужно несколько заполнителей, чтобы поместить данные обучения (одна порция)

x_input = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 
y_output = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 

LSTM нужно государство, которое состоит из двух компонентов, скрытое состояние и состояние клеток, очень хорошо руководство здесь: https://arxiv.org/pdf/1506.00019.pdf. Для каждого слоя в LSTM у вас есть одно состояние ячейки и одно скрытое состояние.

Проблема заключается в том, что Tensorflow хранит это в LSTMStateTuple, который вы не можете отправить в placeholder. Таким образом, вы должны хранить его в тензором, а затем распаковать его в кортеж:

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size]) 

l = tf.unpack(state_placeholder, axis=0) 
rnn_tuple_state = tuple(
    [tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1]) 
    for idx in range(num_layers)] 
) 

Затем вы можете использовать встроенный в Tensorflow API для создания многослойного LSTM слоя.

cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True) 
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True) 
outputs, state = tf.nn.dynamic_rnn(cell, x_input, initial_state=rnn_tuple_state) 

Отсюда вы по-прежнему с выходами для расчета логит и затем потери по отношению к y_inputs.

Затем запустите каждую партию с sess.run -командой, с укороченным (обратным распространением хорошего объяснения здесь http://r2rt.com/styles-of-truncated-backpropagation.html)

init_state = np.zeros((num_layers, 2, batch_size, state_size)) 

...current_state... = sess.run([...state...], feed_dict={x_input:batch_in, state_placeholder:current_state ...}) 
current_state = np.array(current_state) 

Вы должны будете преобразовать состояние в numpy массив перед подачей его снова.

Возможно, лучше использовать либраж, например, Tflearn или Keras?

+0

Не хотел редактировать, так как он зависит от используемой вами версии tensorflow. Но кажется, что tf.unpack изменился на tf.unstack – vanilla

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