多元时间序列的LSTM输入形状



我知道这个问题被问了很多次,但我真的无法解决我的案例中的这个输入形状问题。

My x_train shape==(5523000,13(//(长度为5523000的13个时间序列(

我的y_train形状==(5523000,1(

类别数量==2

重塑x_train和y_train:

x_train= x_train.values.reshape(27615,200,13)  # 5523000/200 = 27615
y_train= y_train.values.reshape((5523000,1))   # I know I have a problem here but I dont know how to fix it

这是我的lstm网络:

def lstm_baseline(x_train, y_train):
batch_size=200
model = Sequential()
model.add(LSTM(batch_size, input_shape=(27615,200,13),
activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='softmax'))
model.compile(
loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train,y_train, epochs= 15)
return model

每当我运行代码时,我都会收到以下错误:

ValueError:输入0与层lstm_10不兼容:应为ndim=3,发现ndim=4

我的问题是我这里缺少什么?

PS:这个项目的想法是,我有来自人体13个点的13个信号,我想用它们来检测某种类型的疾病(唤醒(。通过使用LSTM,我希望我的模型能够基于这13个信号来定位我有这种唤醒的区域。

整个数据是993名患者,对于每一名患者,我使用13个信号来检测障碍区域。

如果你想让我把数据放在3D维度:

(500000 ,13, 993)#(nb_recods,nb_signals,nb_paient(

对于每个患者,我对13个信号进行了500000次观察。nb_paient是993

值得注意的是,500000大小无关紧要!因为我可以让病人有更多或更少的观察结果。

更新:这是一名患者的样本数据。

这是我的数据块前2000行

好的,我对您的代码做了一些更改。首先,我现在还不知道你试图重塑数据的"200"是什么意思,所以我要给你一个工作代码,让我们看看你是否可以使用它,或者你是否可以修改它来让你的代码工作。输入数据的大小和目标必须匹配。不能有27615行的输入x_train(这是x_train[0]=27615的含义(和5523000值的目标集y_train。

我从您为本例提供的数据示例中选取了前两行:

x_sample = [[-17,  -7, -7,  0, -5, -18, 73, 9, -282, 28550, 67],
[-21, -16, -7, -6, -8,  15, 60, 6, -239, 28550, 94]]
y_sample = [0, 0]

让我们重塑x_sample

x_train = np.array(example)
#Here x_train.shape = (2,11), we want to reshape it to (2,11,1) to
#fit the network's input dimension
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], 1)

你使用的是绝对损失,所以你必须将目标改为绝对损失(chekhttps://keras.io/utils/)

y_train = np.array(target)
y_train = to_categorical(y_train, 2)

现在你有两个类别,我假设两个类别是你提供的数据中的所有目标值都是0,所以我不知道你的目标可以取多少可能的值。如果您的目标可以取4个可能的值,那么to_categorical函数中的类别数将为4。最后一个密集层的每个输出都将代表一个类别和该输出的值,即您的输入属于该类别的概率。

现在,我们只需要稍微修改您的LSTM模型:

def lstm_baseline(x_train, y_train):
batch_size = 200
model = Sequential()
#We are gonna change input shape for input_dim
model.add(LSTM(batch_size, input_dim=1,
activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
#We are gonna set the number of outputs to 2, to match with the
#number of categories
model.add(Dense(2, activation='softmax'))
model.compile(
loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=15)
return model

您可以尝试下面这样的修改:

x_train = x_train.reshape(1999, 1, 13)
# double-check dimensions
x_train.shape
def lstm_baseline(x_train, y_train, batch_size):
model = Sequential()
model.add(LSTM(batch_size, input_shape=(None, 13),
activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='softmax'))
model.compile(
loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
return model    

最新更新