python - 如何在keras中向LSTM输入几个时间序列
问题描述
我有大约 1000 个节点数据集,其中每个节点有 4 个时间序列。每个时间序列的长度正好是 6 个。标签是0
或1
(即二进制分类)。
更准确地说,我的数据集如下所示。
node, time-series1, time_series2, time_series_3, time_series4, Label
n1, [1.2, 2.5, 3.7, 4.2, 5.6, 8.8], [6.2, 5.5, 4.7, 3.2, 2.6, 1.8], …, 1
n2, [5.2, 4.5, 3.7, 2.2, 1.6, 0.8], [8.2, 7.5, 6.7, 5.2, 4.6, 1.8], …, 0
and so on.
因为,我有时间序列,我假设它更像是大多数博客文章都使用 LSTM 的序列分类。我以前从未使用过 LSTM,这将是我的第一个 keras 应用程序。sequential LSTM
因此,我开始使用如下最基本的模板。
# create the model
model = Sequential()
model.add(Embedding(5000, 32, input_length=24))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
但是,我很难理解如何使用该embedding
层向 LSTM 输入四个时间序列。我可以使用embedding
四层还是有其他方法来解决这个问题?
如果需要,我很乐意提供更多详细信息。
解决方案
有几种方法可以构建它。对于初学者,我可能只是将 4 系列扁平化为 24 个数字的数组并使用 Dense 层
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(32, input_shape=24))
model.add(Dense(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(data.shape) # (1000, 24)
model.fit(data, target)
您可以有 4 个单独的输入,分别处理 4 个带有LSTM
层的系列。但是您需要使用功能 API。例如
input1 = Input(shape=(6,1))
x1 = LSTM(10)(input1)
input2 = Input(shape=(6,1))
x2 = LSTM(10)(input2)
input3 = Input(shape=(6,1))
x3 = LSTM(10)(input3)
input4 = Input(shape=(6,1))
x4 = LSTM(10)(input4)
x = concatenate([x1,x2,x3,x4])
x = Drouput(0.2)(x)
x = Dense(40)(x)
x = Drouput(0.2)(x)
output = Dense(1, activation='sigmoid')(x)
model = Model(inputs=[input1,input2,input3,input4], outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(data1.shape) #(1000,6,1)
model.fit([data1,data2,data3,data4], target)
或者,如果您的数据是这样的形状(1000, 6, 4)
,您可以使用一个 LSTM 并将每个系列视为一个单独的特征
model = Sequential()
model.add(LSTM(10, input_shape=(6,4)))
model.add(Dense(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(data.shape) # (1000, 6, 4)
model.fit(data, target)
或者你可以使用 CNN 而不是 RNN。
model = Sequential()
model.add(Conv1D(10, kernel_size=3, input_shape=(6,4)))
model.add(Conv1D(10, kernel_size=2))
model.add(GlobalMaxPooling1D())
model.add(Dense(10))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(data.shape) # (1000, 6, 4)
model.fit(data, target)
推荐阅读
- java - 创建可以包含任何类型的一个变量的 Java 类
- javascript - 在 JavaScript 中,如何获取包含尾随英镑之后的数据的完整路径?
- angular-material - 编译成功但网页空白
- c++ - 从字符串末尾转到“/”并分配给 var C++
- javascript - 如何为导入的 ccs 库添加样式?
- batch-file - 在与检测到的木马相关联的 Windows 目录中发现奇怪的蝙蝠,它在做什么?
- python - 打印前 10 行没有索引的 python pandas 数据框的命令?
- python-3.x - 具有多个参数的随机过程的多重处理
- python - Jython:确定系统中有哪些 Python 库可用于导入
- python - 蟒蛇棋子运动