如何将这些数据加载到LSTM中?

时间:2019-10-18 17:08:49

标签: python tensorflow keras classification lstm

我想用LSTM对数据进行分类。我需要一个二进制分类,因此需要2个类(0,1)。 数据被分为两个文件夹(分别为0和1),每个文件夹都带有来自相应类的CSV序列。每个文件夹中都有.csv文件,这些文件具有3列,并且行数可变((= variabletemptemplength))。

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 =文件夹名称,或者我也可以提供带有数组的标签)
-如何将带有标签的两个文件夹中的数据加载到此迭代器中?
问题2: 除了批量大小为1之外,还有其他方法可以使可变的时间步成为可能吗? 问题3: 这是否是LSTM接受可变时间步长的正确代码?如果没有,请提出一个更好的方法。

input_shape=(None, 3)

1 个答案:

答案 0 :(得分:2)

问题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.Sequencemodel.fit_generator()一起使用。

加载数据的原理与情况1完全相同,但是您将分批进行。

这也是一个很好的机会,可以按长度分隔文件并输出相似长度的批处理(这意味着更少的无用填充)

有很多答案和教程,说明了如何创建这两个选项。例如,Keras文档讲授了Sequencehttps://keras.io/utils/

问题3

完全正确。