Я пытаюсь решить, как я могу подать данные в мою модель 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
должен делать здесь?