2016-09-05 4 views
13

У меня есть набор данных, который состоит X N = 4000 выборок, каждая выборка состоит из D = 2 особенности (непрерывные значения), охватывающей назад т = 10 раз шаги. У меня также есть соответствующие «метки» каждого образца, которые также являются непрерывными значениями, на этапе 11.Понимание Tensorflow LSTM ввода формы

В настоящее время мой набор данных имеет форму X: [4000,20], Y: [4000].

Я хочу обучить LSTM с помощью TensorFlow, чтобы предсказать значение Y (регрессия), учитывая 10 предыдущих входов функций d, но мне сложно выполнить это в TensorFlow.

Основная проблема, с которой я сейчас сталкиваюсь, заключается в понимании того, как TensorFlow ожидает, что ввод будет отформатирован. Я видел различные примеры, такие как this, но эти примеры имеют дело с одной большой строкой данных непрерывных временных рядов. Мои данные - это разные образцы, каждый из которых является независимым временным рядом.

+0

Привет, Я пытаюсь реализовать что-то очень похожее на то, что вы сделали, и я надеюсь, что вы можете дать мне несколько советов, так как тензорный поток по-прежнему ошеломляет меня. Для вашей настройки, как выглядит исходный файл? Является ли каждый образец в основном списком длины 10 с каждым элементом, содержащим 2 функции, и для каждого образца у вас есть метка? например [[f1, f2], [f1, f2], ...] – Dimebag

ответ

7

В documentation of tf.nn.dynamic_rnn состояния:

inputs: Входы РНН. Если time_major == False (по умолчанию), это должен быть Тензор формы: [batch_size, max_time, ...] или вложенный кортеж таких элементов.

В вашем случае это означает, что вход должен иметь форму [batch_size, 10, 2]. Вместо того, чтобы тренироваться на всех 4000 последовательностях одновременно, вы должны использовать только batch_size многие из них на каждой итерации обучения. Нечто подобное должно работать (добавлено изменить для ясности):

batch_size = 32 
# batch_size sequences of length 10 with 2 values for each timestep 
input = get_batch(X, batch_size).reshape([batch_size, 10, 2]) 
# Create LSTM cell with state size 256. Could also use GRUCell, ... 
# Note: state_is_tuple=False is deprecated; 
# the option might be completely removed in the future 
cell = tf.nn.rnn_cell.LSTMCell(256, state_is_tuple=True) 
outputs, state = tf.nn.dynamic_rnn(cell, 
            input, 
            sequence_length=[10]*batch_size, 
            dtype=tf.float32) 

Из documentation, outputs будет иметь форму [batch_size, 10, 256], то есть один 256-выход для каждого временного шага. state будет tuple форм [batch_size, 256]. Можно предсказать окончательное значение, по одному для каждой последовательности, от:

predictions = tf.contrib.layers.fully_connected(state.h, 
               num_outputs=1, 
               activation_fn=None) 
loss = get_loss(get_batch(Y).reshape([batch_size, 1]), predictions) 

Число 256 в формах outputs и state определяется cell.output_size соответственно. cell.state_size. При создании LSTMCell, как указано выше, они одинаковы. Также смотрите LSTMCell documentation.

+0

Спасибо за ответ! Я попробую это в ближайшее время и дам вам знать, разрешит ли он мою проблему. Один вопрос: что конкретно означает 256 в tf.nn.rnn_cell.LSTMCell (256, state_is_tuple = True)? Я прочитал документацию, и значение называется n_units. Означает ли это количество временных шагов? т.е. память ячейки LSTM? Извините, я знаю, что это расширение исходного вопроса. –

+0

Количество шагов времени в каждой последовательности задается параметром 'sequence_length', который вы указываете в' tf.nn.dynamic_rnn'. 256 относится к размеру внутреннего состояния LSTM, которое обновляется на каждом временном шаге. – fwalch

+0

@fwalch вопрос: разве вы не хотите, чтобы ваш полностью подключенный уровень для предсказаний имел 'num_outputs = batch_size'? Тогда у вас будет одно предсказание в конце каждого временного ряда в вашей партии? – Engineero