Входной конвейер для LSTM с данными временных рядов с использованием большого набора данных с несколькими .csv в Tensorflow - PullRequest
1 голос
/ 24 января 2020

В настоящее время я могу обучить сеть LSTM, используя один CSV-файл на основе этого урока: https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/

Этот код генерирует скольжение windows, где последние n_steps функций сохраняются для прогнозирования фактической цели (аналогично: Keras LSTM - данные последовательности каналов с API набора данных Tensorflow из генератора ):

#%% Import
import pandas as pd
import tensorflow as tf
from tensorflow.python.keras.models import Sequential, model_from_json
from tensorflow.python.keras.layers import LSTM
from tensorflow.python.keras.layers import Dense

# for path 
import pathlib
import os

#%% Define functions
# Function to split multivariate input data into samples according to the number of timesteps (n_steps) used for the prediction ("sliding window")
def split_sequences(sequences, n_steps):
    X, y = list(), list()
    for i in range(len(sequences)):
        # find end of this pattern
        end_ix = i + n_steps
        # check if beyond maximum index of input data
        if end_ix > len(sequences):
            break
        # gather input and output parts of the data in corresponding format (depending on n_steps)
        seq_x, seq_y = sequences[i:end_ix, :-1], sequences[end_ix-1, -1]
        X.append(seq_x)
        y.append(seq_y)
        #Append: Adds its argument as a single element to the end of a list. The length of the list increases by one.
    return array(X), array(y)

# Set source files
csv_train_path = os.path.join(dir_of_file, 'SimulationData', 'SimulationTrainData', 'SimulationTrainData001.csv')

# Load data
df_train = pd.read_csv(csv_train_path, header=0, parse_dates=[0], index_col=0)


#%% Select features and target
features_targets_considered = ['Fz1', 'Fz2', 'Fz3', 'Fz4', 'Fz5', 'Fz_res']
n_features = len(features_targets_considered)-1 # substract the target 

features_targets_train = df_train[features_targets_considered]

# "Convert" to array
train_values = features_targets_train.values

# Set number of previous timesteps, which are considered to predict 
n_steps = 100

# Convert into input (400x5) and output (1) values 
X, y = split_sequences(train_values, n_steps)
X_test, y_test = split_sequences(test_values, n_steps)


#%% Define model
model = Sequential()
model.add(LSTM(200, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(LSTM(200, activation='relu', return_sequences=True))
model.add(LSTM(200, activation='relu'))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse', metrics=['mae'])

#%% Fit model
history = model.fit(X, y, epochs=200, verbose=1)

Теперь я хочу расширить этот пример до эффективно обучать сеть с различными CSV-файлами. В папке данных у меня есть файлы «SimulationTrainData001.csv», «SimulationTrainData002.csv», ..., «SimulationTrainData300.csv» (около 14 ГБ). Чтобы достичь этого, я попытался принять код этого примера входного конвейера: https://www.tensorflow.org/guide/data#consuming_sets_of_files, который работает в определенной степени. Я могу показать обучающие файлы в папке с этим изменением:

# Set source folders
csv_train_path = os.path.join(dir_of_file, 'SimulationData', 'SimulationTrainData')
csv_train_path = pathlib.Path(csv_train_path)

#%% Show five example files from training folder
list_ds = tf.data.Dataset.list_files(str(csv_train_path/'*'))

for f in list_ds.take(5):
  print(f.numpy())

Одна проблема состоит в том, что в примере файлы представляют собой изображения цветов, а не значения временных рядов, и я не знаю, в какой момент я можно использовать функцию split_sequences(sequences, n_steps) для создания скользящего windows, чтобы обеспечить необходимый формат данных для обучения сети LSTM.

Также, насколько я знаю, было бы лучше для процесса обучения, если сгенерированные windows различных файлов будут перемешаны. Я мог бы использовать функцию split_sequences(sequences, n_steps) в каждом файле CSV (для генерации X_test, y_test) и объединить результат в одну большую переменную или файл и перемешать windows, но я не думаю, что это эффективный способ и это также должно было быть переделано, если n_steps будет изменено.

Если кто-то может предложить (установленный) метод или пример для предварительной обработки моих данных, я был бы очень благодарен.

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете использовать TimeSeriesGenerator после использования этих наборов файлов.
Вот ссылка ссылка .

В соответствии с документацией: '' 'Этот класс принимает последовательность точек данных, собранных через равные интервалы, наряду с параметрами временных рядов, такими как шаг, длина истории и т. Д. c., Чтобы производить партии для обучения / проверки. '' '

Приведены примеры как для одномерного, так и для нескольких вариантов сценариев

Одномерный пример :


from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, LSTM 
import numpy as np
import tensorflow as tf

# define dataset
series = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# reshape to [10, 1]
n_features = 1
series = series.reshape((len(series), n_features))

# define generator
n_input = 2
generator = TimeseriesGenerator(series, series, length=n_input, batch_size=8)

# create model
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_input, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

# fit model
model.fit_generator(generator, steps_per_epoch=1, epochs=500, verbose=1)

#sample prediction
inputs = np.array([9, 10]).reshape((1, n_input, n_features))
result = model.predict(inputs, verbose=0)
print(result)

Пример с несколькими вариациями

from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, LSTM 
import numpy as np
import tensorflow as tf

# define dataset
in_seq1 = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
in_seq2 = np.array([15, 25, 35, 45, 55, 65, 75, 85, 95, 105])
# reshape series
in_seq1 = in_seq1.reshape((len(in_seq1), 1))
in_seq2 = in_seq2.reshape((len(in_seq2), 1))
# horizontally stack columns
dataset = np.hstack((in_seq1, in_seq2))
# define generator
n_features = dataset.shape[1]
n_input = 2
generator = TimeseriesGenerator(dataset, dataset, length=n_input, batch_size=8)
# define model
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_input, n_features)))
model.add(Dense(2))
model.compile(optimizer='adam', loss='mse')
# fit model
model.fit_generator(generator, steps_per_epoch=1, epochs=500, verbose=1)

# make a one step prediction out of sample
inputs = np.array([[90, 95], [100, 105]]).reshape((1, n_input, n_features))
result = model.predict(inputs, verbose=1)
print(result)

Примечание. Все они были смоделированы с использованием Google Colab Laboratory

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...