Keras LSTM - данные последовательности подачи с API набора данных Tensorflow из генератора - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь решить, как я могу подать данные в мою модель LSTM для обучения.(Я упросту проблему в моем примере ниже.) У меня есть следующий формат данных в файлах csv в моем наборе данных.

Timestep    Feature1    Feature2    Feature3    Feature4    Output
1           1           2           3           4           a
2           5           6           7           8           b
3           9           10          11          12          c 
4           13          14          15          16          d
5           17          18          19          20          e
6           21          22          23          24          f
7           25          26          27          28          g
8           29          30          31          32          h
9           33          34          35          36          i
10          37          38          39          40          j

Задача состоит в том, чтобы оценить Выход любого будущего временного шага на основе данных изпоследние 3 разаВот некоторые примеры ввода-вывода:

Пример 1: Ввод:

Timestep    Feature1    Feature2    Feature3    Feature4    
1           1           2           3           4           
2           5           6           7           8           
3           9           10          11          12           

Выход: c

Пример 2: Ввод:

Timestep    Feature1    Feature2    Feature3    Feature4    
2           5           6           7           8           
3           9           10          11          12           
4           13          14          15          16          

Выход: d

Пример 3: Вход:

Timestep    Feature1    Feature2    Feature3    Feature4   
3           9           10          11          12          
4           13          14          15          16         
5           17          18          19          20         

Выход: e

И при подаче данных в модель, яхотел бы перетасовать данные таким образом, чтобы я не передавал последовательные последовательности при обучении.Другими словами, в идеале я хотел бы передать последовательности данных, например, временные шаги 3,4,5 за один шаг, возможно, временные шаги 5,6,7 на следующем шаге и, возможно, 2,3,4 на следующем шаге и т. Д. И я предпочтительноне хочу сначала подавать данные как 1,2,3, затем 2,3,4, затем 3,4,5 и т. д. *

При обучении моей сети LSTM я использую Keras с бэкэндом Tensorflow.Я хотел бы использовать генератор при подаче своих данных в функцию fit_generator(...).

Я хочу использовать API набора данных Tensorflow для извлечения данных из файлов CSV.Но я не мог понять, как заставить генератор вернуть то, что мне нужно.Если я перетасую данные с помощью API набора данных Tensorflow, это разрушит порядок временных шагов.Генератор также должен возвращать пакеты, содержащие несколько примеров последовательности.Например, если размер пакета равен 2, то может потребоваться вернуть 2 последовательности, такие как временные шаги 2,3,4 и временные шаги 6,7,8.

Надеясь, что я смогу объяснить свою проблему ...Можно ли использовать API набора данных Tensorflow в функции генератора для такой проблемы последовательности, чтобы я мог передавать партии последовательностей, как я объяснил выше?(Генератор должен возвращать данные в форме [batch_size, length_of_each_sequence, nr_inputs_in_each_timestep], где length_of_each_sequence=3 и nr_of_inputs_in_each_timestep=4 в моем примере.) Или это лучший способ сделать это, чтобы написать генератор только на Python, может быть, используя Pandas ..?

ADDENDUM 1:

Я провел следующий эксперимент, увидев ответ от @ kvish.

import tensorflow as tf
import numpy as np
from tensorflow.contrib.data.python.ops import sliding

sequence = np.array([ [[1]], [[2]], [[3]], [[4]], [[5]], [[6]], [[7]], [[8]], [[9]] ])
labels = [1,0,1,0,1,0,1,0,1]

# create TensorFlow Dataset object
data = tf.data.Dataset.from_tensor_slices((sequence, labels))

# sliding window batch
window_size = 3
window_shift = 1
data = data.apply(sliding.sliding_window_batch(window_size=window_size, window_shift=window_shift))
data = data.shuffle(1000, reshuffle_each_iteration=False)
data = data.batch(3)

#iter = dataset.make_initializable_iterator()
iter = tf.data.Iterator.from_structure(data.output_types, data.output_shapes)
el = iter.get_next()

# create initialization ops 
init_op = iter.make_initializer(data)

NR_EPOCHS = 2
with tf.Session() as sess:
    for e in range (NR_EPOCHS):
      print("\nepoch: ", e, "\n")
      sess.run(init_op)
      print("1  ", sess.run(el))
      print("2  ", sess.run(el))
      print("3  ", sess.run(el))

И вот результат:

epoch:  0 

1   (array([[[[6]],[[7]],[[8]]],  [[[1]],[[2]],[[3]]],  [[[2]],[[3]],[[4]]]]), 
     array([[0, 1, 0],  [1, 0, 1],  [0, 1, 0]], dtype=int32))

2   (array([[[[7]],[[8]],[[9]]],  [[[3]],[[4]],[[5]]],  [[[4]],[[5]],[[6]]]]), 
     array([[1, 0, 1],  [1, 0, 1],  [0, 1, 0]], dtype=int32))

3   (array([[[[5]],[[6]],[[7]]]]), array([[1, 0, 1]], dtype=int32))

epoch:  1 

1   (array([[[[2]],[[3]],[[4]]],  [[[7]],[[8]],[[9]]],  [[[1]],[[2]],[[3]]]]), 
     array([[0, 1, 0],  [1, 0, 1],  [1, 0, 1]], dtype=int32))

2   (array([[[[5]],[[6]],[[7]]],  [[[3]],[[4]],[[5]]],  [[[4]],[[5]],[[6]]]]), 
     array([[1, 0, 1],  [1, 0, 1],  [0, 1, 0]], dtype=int32))

3   (array([[[[6]],[[7]],[[8]]]]), 
     array([[0, 1, 0]], dtype=int32))

Я не мог попробовать это на чтение файла CSV, но я думаю, что этот подход должен работать вполне нормально!

Но, как я понимаю, параметр reshuffle_each_iteration не имеет значения.Это действительно нужно?Результаты не обязательно идентичны, если для него установлено значение True или False.Что этот параметр reshuffle_each_iteration должен делать здесь?

1 Ответ

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

Я думаю этот ответ может быть близок к тому, что вы ищете!

Вы создаете пакеты, скользя по окнам, а затем перетасовываете ввод в вашем случае.Функция shuffle API набора данных имеет параметр reshuffle_after_each_iteration, который вы, возможно, захотите установить в False, если хотите поэкспериментировать с установкой случайного начального числа и просмотром порядка перемешанных выходов.

...