我们应该如何对全序列进行分类?

Posted

技术标签:

【中文标题】我们应该如何对全序列进行分类?【英文标题】:How should we classify full sequence? 【发布时间】:2017-12-15 07:29:27 【问题描述】:

我想将完整的序列分为两类。我在网上搜索了很多,但没有找到任何结果。我首选的方法是使用 keras 的 LSTM 模型将可变行的“完整”序列分为两类。这种方法的问题是 Xy 的形状不同。这是我为解释我的问题而编写的示例代码。

import numpy as np
from keras.layers import Dense,LSTM
from keras.models import Sequential

#(no of samples, no of rows,step, feature)
feat= np.random.randint(0, 100, (150, 250, 25,10))

#(no of samples, binary_output)
target= np.random.randint(0, 2, (150, 1))

#model
model = Sequential()
model.add(LSTM(10, input_shape=(25, 10), return_sequences=True))
model.add(LSTM(10,return_sequences=False))
model.add(Dense(1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop')
print model.summary()

for i in xrange(target.shape[0]):
    X=feat[i]
    y=target[i]
    model.fit(X,y)

这里我有 150 个样本序列,我想将它们分类为 01。问题是这样的

ValueError:输入数组的样本数应与目标数组相同。找到 250 个输入样本和 1 个目标样本。

如果在深度学习方法中没有办法实现这一点,您能否推荐任何其他机器学习算法?

编辑

许多人对此表示怀疑

#(no of samples, no of rows,step, feature)
feat= np.random.randint(0, 100, (150, 250, 25,10))

150 是样本数(将其视为 150 个时间序列数据)。 250 和 10 是 250 行 10 列的时间序列数据。 (250, 25,10) 增加了 25 个时间步,这样它就可以传递给 keras lstm 输入

【问题讨论】:

你用的是什么后端? “250、25、10”是什么意思? Keras 期望你拥有X as (BatchSize =150, TimeSteps, SampleSize)Y as (BatchSize=150,1) 抱歉有任何困惑我已经编辑了这个问题以便更清楚 【参考方案1】:

问题是当你这样做时

X=feat[i]
y=target[i]

这会删除第一个轴,这会导致X.shape = (250, 25, 10)y.shape == (1,)。当您调用 model.fit(X, y) 时,keras 会假设 X 有 250 个样本,而 y 只有一个样本。这就是您收到该错误的原因。

您可以通过提取feattarget 的切片来解决此问题,例如调用

X=feat[i:i+batch_size]
y=target[i:i+batch_size]

其中batch_size 是您希望每次迭代使用的样本数。如果你设置了batch_size = 1,你应该在你的代码中得到你想要的行为。

【讨论】:

抱歉回复晚了,我已经编辑了问题,我正在使用 tensorflow 后端。我想将 150 个时间序列数据分为两类 我没有得到你的答案,我有 150 个样本,其中 X 尺寸为 (250,25,10) 和 y 尺寸为 (1,) 并且 X 映射到 y 。批量大小你在说这个model.fit(X,y,batch_size=1) 这也给出了同样的错误。 您是否尝试过替换我给出的行,完全按照我给出的那样?如果仍然出现错误,那是什么? batch_size=1 for i in xrange(target.shape[0]): X=feat[i:i+batch_size] y=target[i:i+batch_size] model.fit(X,y) 这是你的建议吗? 遗憾的是它不起作用ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (1, 250, 25, 10)。您能否编辑答案并分享完整的工作代码?

以上是关于我们应该如何对全序列进行分类?的主要内容,如果未能解决你的问题,请参考以下文章

LSTM 时间序列分类

TensorFlow:如何使用 RNN 对二进制序列进行分类?

视频时间序列分类方法:动态时间规整算法DTW和R语言实现|附代码数据

如何使用 Lime 对时间序列进行分类

如何在 sklearn 中使用时间序列数据进行分类

如何使用多模态输入构建 RNN 以对时间序列进行分类