Я пытался использовать tf.data.Dataset
для пакетной обработки и разделения данных временных рядов с учетом состояния, но не могу заставить его работать. Вот ссылка на документы: https://www.tensorflow.org/api_docs/python/tf/data/Dataset
Вот что я пытаюсь достичь:
import tensorflow as tf
import numpy as np
Допустим, у нас есть данные, форма = (10,100,1) с 10 даннымивыборки, каждая с 100 выборками времени и 1 функцией
x = np.reshape(np.arange(1000), (10, 100, 1))
print(x.shape)
print(x[0, :, 0])
print(x[1, :, 0])
Out:
(10, 100, 1)
[000 001 ... 098 099]
[100 101 ... 198 199]
Где диапазоны 0-99, 100-199 ..., 900-999 одинаковывременные ряды, но, например, 150 и 250 не связаны между собой.
Теперь мы хотим обучить RNN / GRU / LSTM, где партия (2, 25, 1). Это означает, что мы должны разделить измерение выборки на 5, а измерение времени на 4.
x = np.split(x, 5, axis=0)
print(len(x), x[0].shape)
Out:
5 (2, 100, 1)
и ...
x = [np.split(item, 4, axis=1) for item in x]
print(len(x),len(x[0]), x[0][0].shape)
Out:
5 4 (2, 25, 1)
теперь первая партия должна быть:
[ 0 1 ... 23 24]
[100 101 ... 123 124]
, а вторая партия должна быть:
[ 25 26 ... 48 49]
[125 126 ... 148 149]
, потому что это обеспечит подготовку кбыть состоящим из состояний.
Следующее ...
print(np.squeeze(x[0][0]))
print(np.squeeze(x[0][1]))
Out:
[[ 0 1 ... 23 24]
[100 101 ... 123 124]]
[[ 25 26 ... 48 49]
[125 126 ... 148 149]]
может быть достигнуто через
x = np.concatenate([np.concatenate(item, axis=0) for item in x], axis=0)
dataset = tf.data.Dataset.from_tensor_slices(x)
final_dataset = dataset.batch(2)
, так что
for x in final_dataset:
print(np.squeeze(x.numpy()))
print('###')
Out:
[[ 0 1 ... 23 24]
[100 101 ... 123 124]]
###
[[ 25 26 ... 48 49]
[125 126 ... 148 149]]
###
[[ 50 51 ... 73 74]
[150 151 ... 173 174]]
###
[[ 75 76 ... 98 99]
[175 176 ... 198 199]]
###
[[200 201 ... 223 224]
[300 301 ... 323 324]]
###
...
Где после 199 заканчивается первое «состояние».
Мой вопрос: есть ли способ сделать то же самое, но начать сздесь:
dataset = tf.data.Dataset.from_tensor_slices(np.reshape(np.arange(1000), (10, 100, 1)))
Далее:
Что если данные имеют форму = (13,100,1), то ось = 0 является простой и tf / np.split не будет работать.
Что если данные имеют форму = (10,101,1), то ось = 1 проста и tf / np.split не будет работать.