我想用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)
答案 0 :(得分:2)
只需将数据加载到数组中并填充数据:
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值。
创建Python生成器或keras.utils.Sequence
与model.fit_generator()
一起使用。
加载数据的原理与情况1完全相同,但是您将分批进行。
这也是一个很好的机会,可以按长度分隔文件并输出相似长度的批处理(这意味着更少的无用填充)
有很多答案和教程,说明了如何创建这两个选项。例如,Keras文档讲授了Sequence
:https://keras.io/utils/
完全正确。