Keras序列到序列预测,形状问题

时间:2018-10-11 06:12:32

标签: python keras lstm

我正在尝试使用Keras进行序列学习。我的数据如下所示。

h h h l l l   i r
h h l l l l   i r
h l l l l l   i r
h m h m h h   c u
...

我所做的是对Xy的编码进行一次热编码,这样我的数据将按以下方式转换

[[1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0.]
 [1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0.]
 ... 
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0.]
 [1. 0. 0. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0.]]

和我的y的样子

[[1. 0. 0. 0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 0. 1. 0. 0.]
...
 [0. 0. 0. 1. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 0.]]

对训练集进行一键编码的函数如下

def one_hot_encode_xy(seq_x, seq_y, n_uniq_x, n_uniq_y):
 encoding_x = list()
 encoding_y = list()
 nsize_x = len(n_uniq_x)
 nsize_y = len(n_uniq_y)
 for val in seq_x:
     vector = [0 for _ in xrange(nsize_x)]
     index = n_uniq_x.index(val)
     vector[index] = 1
     encoding_x += vector

 for val in seq_y:
     vector = [0 for _ in xrange(nsize_y)]
     index = n_uniq_y.index(val)
     vector[index] = 1
     encoding_y += vector
 X0 = array(encoding_x)
 y0 = array(encoding_y)
 return X0, y0

我遇到的问题是,当我尝试拟合模型Xy时,会不断出现形状不兼容错误。我正在使用的模型如下

model = Sequential()
model.add(LSTM(150, input_shape=(1, 18)))
model.add(RepeatVector(1))
model.add(LSTM(150, return_sequences=True))
model.add(TimeDistributed(Dense(18, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])

model.fit(X, y, epochs=100, verbose=2)

我应该如何重塑X的{​​{1}}和/或模型,以便对此进行简单的seq2seq学习?有人可以帮忙吗?任何帮助表示赞赏。

我遇到的错误示例如下

y
     

文件“ build / bdist.linux-x86_64 / egg / keras / engine / training.py”,第958行,适合      _standardize_user_data中的第757行的文件“ build / bdist.linux-x86_64 / egg / keras / engine / training.py”     在standardize_input_data中的第128行,文件“ build / bdist.linux-x86_64 / egg / keras / engine / training_utils.py”   ValueError:检查输入时出错:预期lstm_1_input具有3维,但数组的形状为(18,18)

这就是我初始化model.fit(X, y, epochs=100, verbose=2) Xy的方式。我有一个18行的玩具数据集(如上所示),并想在2种情况下对其进行测试。

X_test

1 个答案:

答案 0 :(得分:0)

“火车”输入形状应为3个维度(样本,时间步长,特征)

**Samples**. One sequence is one sample. A batch is comprised of one or more samples.
**Time Steps**. One time step is one point of observation in the sample.
**Features**. One feature is one observation at a time step.

在您的情况下,输入数据,如果您没有很多功能,只需在输入数据中再添加一个维度,或者您可以使用回溯来创建序列的短期变化,那么它将起作用

X = X.reshape(X.shape[0],X.shape[1],1)
y = y.reshape(y.shape[0],1,y.shape[1])

输入形状时,将X [0] .shape作为输入 。 example