Как я могу загрузить эти данные в LSTM? - PullRequest
2 голосов
/ 18 октября 2019

Я хочу классифицировать данные с помощью LSTM. Мне нужна бинарная классификация, таким образом 2 класса (0,1). Данные разбиты на две папки (с именами 0 и 1), каждая из которых содержит CSV-последовательности из соответствующего класса. В каждой папке есть файлы .csv, которые имеют 3 столбца и переменное количество строк (= длина переменной временного шага) .

В файле csv нет класса, только функции. Каждый CSV выглядит следующим образом:

x1,x2,x3
x1,x2,x3
...
x1,x2,x3

Код для моего примера модели:

model = Sequential()
model.add(CuDNNLSTM(3, input_shape=(None, 3), return_sequences=False))
model.add(Dropout(0.1))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
      optimizer=tf.keras.optimizers.Adam(lr=1e-2, decay=1e-7),
      metrics=['accuracy'])

Каждая последовательность (например, [[x1, x2, x3], [x1, x2, x3], [x1, x2, x3]]) должны иметь только одну метку. Таким образом, при прогнозировании этой последовательности я получу 0 или 1.

Вопрос 1:
- Как я могу создать что-то вроде итератора, который я могупройти за trainX и trainY, содержащие все последовательности своего класса? (Class = foldername или я также могу предоставить метки с массивом)
- Как я могу загрузить данные из двух папок с их метками в этот итератор?
Вопрос 2: Есть ли что-нибудь еще, чтобы сделать возможными переменные временные шаги, кроме размера пакета 1? Вопрос 3: Будет ли это правильный код, чтобы переменная длина временного шага была принята LSTM? Если нет, пожалуйста, предложите лучший способ.

input_shape=(None, 3)

1 Ответ

2 голосов
/ 21 октября 2019

Вопрос 1 и 2

Случай 1, ваши данные помещаются в вашу память

Просто загрузите данные в массивы и добавьте данные:

import pandas as pd
import numpy as np
import os
from keras.preprocessing.sequence import pad_sequences

#your class folders - choose the correct names
folder0 = "class0"
folder1 = "class1"

#x and y initially as lists
fileContents = []
fileClasses = []

#list of files in each dir
files0 = os.listdir(folder0)
files1 = os.listdir(folder1)

#load data for class 0
for f in files0:
    f = folder0 + "/" + f
    if '.csv' in f:
        frame = pd.read_csv(f) #use header=None if you don't have headers in the files
        fileContents.append(frame.values)
        fileClasses.append(0) #append the correct class
        print(frame.values)

#load data for class 1
for f in files1:
    f = folder1 + "/" + f
    if '.csv' in f:
        frame = pd.read_csv(f)
        fileContents.append(frame.values)
        fileClasses.append(1) #append the correct class
        print(frame.values)

#pad the sequences so they all have the same length and transform into numpy
#choose best value for you, I chose 0 for example
paddedSequences = pad_sequences(fileContents, padding='post', value=0) 

x_train = np.array(paddedSequences)
y_train = np.array(fileClasses)

Позже,вам нужно будет использовать слой Masking(0) в вашей модели, чтобы игнорировать значения 0, которые вы использовали для заполнения.

Случай 2, ваши данные не помещаются в вашей памяти

Создайте генератор Python или keras.utils.Sequence для использования с model.fit_generator().

Принцип загрузкиданные точно такие же, как в случае 1, но вы будете делать это небольшими партиями.

Это также хорошая возможность для разделения файлов по длине и выходным пакетам одинаковой длины (это означает меньше бесполезного заполнения)

Существует множество ответов и учебных пособий, объясняющих, как создать обаварианты. Например, документация Keras учит Sequence: https://keras.io/utils/

Вопрос 3

Совершенно правильно.

...