如何使用Python中Keras模型的Sequential在LSTM上使用多个要素/类作为输入/输出?
更具体地说,我想用作网络的输入和输出:[FeatureA] [FeatureB] [FeatureC]。 FeatureA是一个分类类,有100个不同的可能值,表示收集数据的传感器; FeatureB是一个开/关指示器,为0或1; FeatureC是一个分类类,也有5个唯一值。
数据示例:
1. 40,1,5
2. 58,1,2
3. 57,1,5
4. 40,0,1
5. 57,1,4
6. 23,0,3
在model.compile上使用原始数据和loss ='categorical_crossentropy'时,损失超过10.0。
当将数据标准化为0-1之间的值并且在丢失时使用mean_squared_error时,丢失时平均得到0.27。但是在对预测进行测试时,结果没有任何意义。
这里有任何建议或教程我可以咨询吗? 提前谢谢。
答案 0 :(得分:0)
您需要将FeatureC转换为二进制类别。均方误差用于回归,并且我可以告诉您最好的方法是尝试预测某个传感器和状态组合所属的类。由于有5个可能的课程,你可以认为你正在试图预测课程是红色,绿色,蓝色,黄色还是紫色。现在这些数字用数字表示,但对于回归,你的模型将预测像3.24这样没有意义的值。
实际上,您将FeatureC的值转换为5列二进制值。由于类看起来是独占的,所以应该有一个1,而一行的其余列都是0。因此,如果第一行是红色'它将是[1,0,0,0,0]
为获得最佳效果,您还应将FeatureA转换为二进制分类功能。出于与上述相同的原因,传感器80不是传感器20的4倍,而是不同的实体。
模型的最后一层应该是softmax类型,有5个神经元。基本上你的模型最终会试图预测每个班级的概率。
看起来你正在使用数据框,因为它是一个索引。因此我会尝试:
import keras
import numpy as np
import pandas as pd # assume that this has probably already been done though
feature_a = data.loc[:, "FeatureA"].values # pull out feature A
labels = data.loc[:, "FeatureC"].values # y are the labels that we're trying to predict
feature_b = data.loc[:, "FeatureB"].values # pull out B to make things more clear later
# make sure that feature_b.shape = (rows, 1) otherwise reset the shape
# so hstack works later
feature_b = feature_b.reshape(feature_b.shape[0], 1)
labels -= 1 # subtract 1 from all labels values to zero base (0 - 4)
y = keras.utils.to_categorical(labels)
# labels.shape should be (rows, 5)
# convert 1-100 to binary columns
# zero base again
feature_a -= 1
# Before: feature_a.shape=(rows, 1)
feature_a_data = keras.utils.to_categorical(feature_a)
# After: feature_a_data.shape=(rows, 100)
data = np.hstack([feature_a_data, feature_b])
# data.shape should be (rows, 101)
# y.shape should be (rows, 5)
现在你已准备好训练/测试分裂等等。
这里有一些东西可以看出哪个有多级预测:
https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py