首先道歉,如果我说错了,我是TensorFlow的新手
我正在设计一个用于对数据集进行简单分类的模型,每一列都是一个属性,最后一列是类。我将它们拆分并以通常的方式生成一个数据框。
如果我生成的模型具有密集的层,则效果很好:
def baseline_model():
# create model
model = Sequential()
model.add(Dense(30, input_dim=len(dataframe.columns)-2, activation='sigmoid'))
model.add(Dense(20,activation='sigmoid'))
model.add(Dense(unique, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
如果要在模型中添加一个LSTM层:
def baseline_model():
# create model
model = Sequential()
model.add(Dense(30, input_dim=len(dataframe.columns)-2, activation='sigmoid'))
#this bit here >
model.add(LSTM(20, return_sequences=True))
model.add(Dense(20,activation='sigmoid'))
model.add(Dense(unique, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
执行代码时出现以下错误:
ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2
我不确定这些变量来自何处,也许是类?我将三类数据(“正”,“负”,“中性”)映射到超过2,000个属性值的集合-它们是从按情绪状态分类的多个电极上按时间窗提取的脑电图脑电波数据的统计提取。
注意: 'input_dim = len(dataframe.columns)-2'产生属性(输入)的数量,我这样做是因为我希望脚本可以即时处理不同大小的CSV数据集
此外,我的代码中没有粘贴任何制表符,但已缩进并可以编译
完整的代码粘贴在这里:https://pastebin.com/1aXp9uDA用于演示。提前对糟糕的做法表示歉意!这只是一个最初的项目,我确实打算稍后将其清理干净!
答案 0 :(得分:1)
在原始代码中,输入尺寸为2(形状,批处理,特征)。添加LSTM时,是在告诉Keras您要根据最近的N个时间步长进行分类,因此需要一个成形的输入(批,时间步长,特征)。很容易想到LSTM会回顾批次中的所有输入,但不幸的是,它不会。您必须手动组织数据以一起显示所有时间步元素。
要拆分数据,通常需要创建一个长度为N的滑动窗口(其中N是希望LSTM回顾的值个数)。您可以每次将窗口滑动N步,这意味着数据不会重叠,也可以只滑动一个样本,这意味着您可以获得数据的多个副本。有关如何执行此操作的博客很多。看看这个How to Reshape Input Data for LSTM。
您还有另一个问题。对于您的LSTM,您可能希望“ return_sequences = False”。将此值设为True时,您需要为时间步长的每个元素提供一个输出“ Y”值。您可能希望“ Y”值代表时间序列中的下一个值。组织数据时请记住这一点。
上面的链接提供了一些不错的示例,或者您可以搜索更深入的示例。如果遵循这些规则,应该清楚如何为LSTM进行重组。