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

时间:2017-07-11 09:50:21

标签: python machine-learning classification keras lstm

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

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个样本序列,我想将其分类为 0 1 。问题是这个

  

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输入

1 个答案:

答案 0 :(得分:2)

问题是当你做

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:for-each select="/html/body/table/tr/td/ol/li">
                <xsl:value-of select="/html/body/table/tr/td/ol/li"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

这将删除第一个轴,从而导致X=feat[i] y=target[i] X.shape = (250, 25, 10)。当您致电y.shape == (1,) keras时,假设model.fit(X, y)有250个样本,X只有一个样本。这就是你得到这个错误的原因。

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

target

其中X=feat[i:i+batch_size] y=target[i:i+batch_size] 是每次迭代要使用的样本数。如果设置batch_size,则应该在代码中获得预期的行为。